WM_GETTEXT

인수

wParam : 복사될 TCHAR형 문자의 최대 길이이며 널 종료 문자도 포함해야 한다.

lParam : 문자열을 복사할 버퍼의 주소

설명

이 메시지는 윈도우의 텍스트를 조사하기 위해 사용된다. 이 메시지를 처리하지 않고 DefWindowProc으로 보내면 윈도우 텍스트를 lParam이 지정하는 버퍼에 복사하고 복사된 문자 수를 리턴해 준다. 보통 컨트롤의 캡션을 구하기 위해 이 메시지를 보내는데 어떤 문자열이 윈도우의 캡션이 되는가는 컨트롤에 따라 다르다.

가장 일반적인 예는 에디트 컨트롤인데 편집중인 문자열이 조사된다. 리치 에디트 컨트롤도 이 메시지로 문자열을 조사할 수 있지만 길이가 64K를 넘을 경우는 EM_STREAMOUT 메시지나 EM_GETSELTEXT 메시지를 대신 사용해야 한다. 에디트에 편집중인 문자열은 길이가 길 수 있기 때문에 고정된 길이의 버퍼를 사용하는 것은 위험하며 반드시 WM_GETTEXTLENGTH 메시지를 보내 텍스트의 길이를 조사한 후 조사된 길이만큼의 버퍼를 할당해서 사용하는 것이 좋다.

콤보 박스의 경우 콤보 박스의 에디트 또는 스태틱 컨트롤의 텍스트가 조사되며 버튼의 경우 버튼의 이름 문자열이 조사된다. 일반 윈도우는 타이틀 바에 있는 캡션이 조사된다. 리스트 박스 항목의 텍스트는 이 메시지로 얻을 수 없으며 LB_GETTEXT 메시지를 사용해야 한다.

문자열 스타일의 스태틱 컨트롤은 캡션이 조사되지만 아이콘 스타일인 경우는 아이콘의 핸들이 lParam의 첫 4바이트에 조사된다. 단, 아이콘 설정을 위해 WM_SETTEXT 메시지를 사용한 경우에만 해당되며 2000/XP에서는 문자열 스타일이 아닌 스태틱은 무조건 0이 리턴된다. 2000이전 버전의 윈도우즈에서는 이 메시지를 사용하여 비 문자열 스태틱 컨트롤의 ID를 구할 수 있었으나 2000이상에서는 반드시 GetWindowLong 함수로 컨트롤의 ID를 구해야 한다.

보통 메시지를 직접 보내는 경우는 드물며 GetWindowText 함수를 많이 사용하는데 이 함수는 지정한 윈도우로 WM_GETTEXT 메시지를 보내 텍스트를 조사한다. 단, GetWindowText 함수는 다른 프로세스의 윈도우 텍스트트는 조사하지 못하므로 이때는 WM_GETTEXT 메시지를 사용해야 한다.

리턴

복사된 TCHAR형 문자의 개수이며 널 종료 문자는 포함되지 않는다.

예제

예제 1

다음 예제는 일반 윈도우의 타이틀을 조사하여 작업 영역에 출력한다.

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	TCHAR *Caption;
	int len;

	switch(iMessage) {
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		len=SendMessage(hWnd,WM_GETTEXTLENGTH,0,0);
		Caption=(TCHAR *)malloc(len+1);
		SendMessage(hWnd,WM_GETTEXT,len+1,(LPARAM)Caption);
		TextOut(hdc,10,10,Caption,lstrlen(Caption));
		free(Caption);
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

텍스트의 길이를 먼저 조사한 후 이 길이에 널 종료 문자분을 더해 할당한 버퍼에 텍스트를 조사하였다. 타이틀 문자열을 구할 때는 굳이 이렇게 동적할당까지 할 필요없이 256정도의 충분한 길이를 가지는 버퍼를 제공해도 무방하다.

플랫폼

95이상

참조

 


written by http://www.winapi.co.kr