SetWindowLong

¿øÇü

LONG SetWindowLong( HWND hWnd, int nIndex, LONG dwNewLong);

MFC ¿øÇü

ÇØ´çÇÏ´Â ÇÔ¼ö ¾øÀ½

Àμö

¢ºhWnd : ¼Ó¼ºÀ» º¯°æÇÏ°íÀÚ ÇÏ´Â À©µµ¿ìÀÇ ÇÚµé

¢ºnIndex : º¯°æÇÏ°íÀÚ ÇÏ´Â ¼Ó¼ºÀ» ÁöÁ¤ÇÏ¸ç ´ÙÀ½ Áß ÇϳªÀÇ °ªÀ» ÁÙ ¼ö ÀÖ´Ù.

°ª ¼³¸í
GWL_EXSTYLE È®Àå ½ºÅ¸ÀÏ
GWL_STYLE À©µµ¿ì ½ºÅ¸ÀÏ
GWL_WNDPROC À©µµ¿ì ÇÁ·Î½ÃÀúÀÇ ¹øÁö
GWL_HINSTANCE ÀνºÅϽº ÇÚµé
GWL_ID À©µµ¿ìÀÇ ID
GWL_USERDATA À©µµ¿ì¿Í °ü·ÃµÈ »ç¿ëÀÚ µ¥ÀÌÅÍ
DWL_DLGPROC ´ëÈ­»óÀÚ ÇÁ·Î½ÃÀúÀÇ ÁÖ¼Ò
DWL_MSGRESULT ´ëÈ­»óÀÚ ÇÁ·Î½ÃÀúÀÇ ¸®ÅÏ°ª
DWL_USER »ç¿ëÀÚ µ¥ÀÌÅÍ

¶Ç´Â À©µµ¿ì¿¡ ¿©ºÐ ¸Þ¸ð¸®°¡ ÀÖÀ» °æ¿ì ¿©ºÐ ¸Þ¸ð¸®ÀÇ ¿ÀÇÁ¼ÂÀ» ÁöÁ¤ÇÒ ¼öµµ ÀÖ´Ù. ÀÌ °ªÀº ¹Ýµå½Ã ¾ç¼ö¿©¾ß Çϸç cbWndExtra-4º¸´Ù´Â ÀÛ¾Æ¾ß ÇÑ´Ù. ¿¹¸¦ µé¾î ¿©ºÐ ¸Þ¸ð¸®°¡ 16¹ÙÀÌÆ® ÁöÁ¤µÇ¾î ÀÖÀ¸¸é nIndex´Â 0~12±îÁö ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.

¢ºdwNewLong : »õ·Î º¯°æÇÒ 32ºñÆ®°ªÀ̸ç nIndex¿¡ µû¶ó °ªÀÇ Àǹ̴ ´Þ¶óÁø´Ù.

¸®ÅÏ

¼º°øÇϸé ÀÌÀü¿¡ ¼³Á¤µÇ¾î ÀÖ´ø 32ºñÆ®°ªÀ» ¸®ÅÏÇÏ¸ç °ªÀÌ ¼³Á¤µÇ¾î ÀÖÁö ¾Ê¾ÒÀ¸¸é 0À» ¸®ÅÏÇÑ´Ù. ¶ÇÇÑ ¿¡·¯°¡ ¹ß»ýÇصµ 0À» ¸®ÅÏÇÑ´Ù.

¼³¸í

À©µµ¿ìÀÇ ¼Ó¼ºÀº CreateWindow(Ex) ÇÔ¼ö·Î À©µµ¿ì¸¦ »ý¼ºÇÒ ¶§ ÁöÁ¤ÇÑ´Ù. ÀÏ´Ü À©µµ¿ì°¡ ¸¸µé¾îÁø ÈÄ¿¡´Â ÀÌ ÇÔ¼ö·Î À©µµ¿ìÀÇ ¼Ó¼ºÀ» º¯°æÇÒ ¼ö ÀÖ´Ù. À̶§ ÁÖ·Î º¯°æÀÇ ´ë»óÀÌ µÇ´Â °ÍÀº GWL_STYLE Áï À©µµ¿ìÀÇ ½ºÅ¸ÀÏÀÌ¸ç ¿©ºÐ ¸Þ¸ð¸® Á¶ÀÛÀ» À§Çؼ­µµ ÀÌ ÇÔ¼ö°¡ »ç¿ëµÈ´Ù. ¶ÇÇÑ À©µµ¿ì ÇÁ·Î½ÃÀúÀÇ ¹øÁö¸¦ »õ·Î¿î ÇÔ¼ö·Î ¹Ù²ÞÀ¸·Î½á À©µµ¿ì¸¦ ¼­ºê Ŭ·¡½ÌÇÒ ¼öµµ ÀÖ´Ù.

´Ü ÀÌ ÇÔ¼ö´Â °°Àº ½º·¹µå¿¡ ¼ÓÇÑ À©µµ¿ìÀÇ ¼Ó¼º¸¸À» º¯°æÇÒ ¼ö ÀÖ´Ù. ´Ù¸¥ ½º·¹µå¿¡¼­ »ý¼ºÇÑ À©µµ¿ìÀÇ ¼Ó¼ºÀº º¯°æÇÒ ¼ö ¾ø´Ù. ¶ÇÇÑ ÀÌ ÇÔ¼ö·Î º¯°æÇÒ ¼ö ÀÖ´Â °ªµé Áß Æ¯Á¤ ½ºÅ¸ÀÏÀº ½Ã½ºÅÛ¿¡ ÀÇÇØ Ä³½ÃµÇ¹Ç·Î º¯°æ Áï½Ã È¿°ú°¡ ³ªÅ¸³ªÁö ¾ÊÀ» ¼öµµ ÀÖÀ¸¸ç SetWindowPos ÇÔ¼ö·Î ij½Ã¸¦ ºñ¿öÁÖ¾î¾ß ÇÏ´Â °Íµµ ÀÖ´Ù. ´ÙÀ½ ¿¹Á¦¸¦ ÅëÇØ ÀÌ ÇÔ¼öÀÇ »ç¿ë¿¹¸¦ º¸µµ·Ï ÇÏÀÚ.

¿¹Á¦ 1

´ÙÀ½ ¿¹Á¦´Â À©µµ¿ìÀÇ ½ºÅ¸ÀÏÀ» ½ÇÇàÁß¿¡ º¯°æÇÑ´Ù. GWL_STYLE À妽º·Î À©µµ¿ìÀÇ ½ºÅ¸ÀÏÀ» Á¶»çÇÏ¿© WS_THICKFRAME ½ºÅ¸ÀÏÀ» Åä±ÛÇÑ´Ù.

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	LONG wndStyle;
	char Mes[]="¸¶¿ì½º ¹öÆ°À» ´©¸¦ ¶§¸¶´Ù °æ°è¼±ÀÇ ½ºÅ¸ÀÏÀ» º¯°æÇÑ´Ù";

	switch(iMessage) {
	case WM_LBUTTONDOWN:
		wndStyle=GetWindowLong(hWnd,GWL_STYLE);
		if (wndStyle & WS_THICKFRAME) {
			wndStyle=wndStyle & ~WS_THICKFRAME;
		} else {
			wndStyle=wndStyle | WS_THICKFRAME;
		}
		SetWindowLong(hWnd,GWL_STYLE,wndStyle);
		SendMessage(hWnd,WM_NCPAINT,1,0);
		return 0;
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		TextOut(hdc,10,10,Mes,lstrlen(Mes));
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

¸¶¿ì½º¸¦ ´©¸¦ ¶§¸¸ °æ°è¼± ½ºÅ¸ÀÏÀÌ ¹Ù²î¸ç Å©±â Á¶Á¤ ¿©ºÎ°¡ Åä±ÛµÈ´Ù. °æ°è¼± ½ºÅ¸ÀÏÀº ºñÀÛ¾÷ ¿µ¿ªÀÇ ¸ð¾ç¿¡ ¿µÇâÀ» ÁֹǷΠ½ºÅ¸ÀÏÀ» ¹Ù²Û Á÷ÈÄ¿¡´Â ¹Ýµå½Ã WM_NCPAINT ¸Þ½ÃÁö¸¦ º¸³»ÁÖ¾î º¯°æµÈ °æ°è¼± ½ºÅ¸ÀÏÀÌ Áï½Ã Àû¿ëµÇµµ·Ï ÇØ ÁÖ¾î¾ß ÇÑ´Ù.

ÀÌ ¹æ¹ýÀ» »ç¿ëÇϸé À©µµ¿ìÀÇ ¸ðµç ½ºÅ¸ÀÏ°ú È®Àå ½ºÅ¸ÀÏÀ» ½ÇÇàÁß¿¡ ¸¶À½´ë·Î º¯°æÇÒ ¼ö ÀÖ´Ù. ´Ü È®Àå ½ºÅ¸ÀÏÁß¿¡ WS_EX_TOPMOST ½ºÅ¸ÀÏÀº ¿©·¯°¡Áö ºÎ¼öÀû È¿°ú°¡ ÀÖÀ¸¹Ç·Î SetWindowLong ÇÔ¼ö·Î º¯°æÇÒ ¼ö ¾øÀ¸¸ç ¹Ýµå½Ã SetWindowPos ÇÔ¼ö·Î ¹Ù²ã ÁÖ¾î¾ß ÇÑ´Ù.

¿¹Á¦ 2

´ÙÀ½ ¿¹Á¦´Â ÀÌ ÇÔ¼ö·Î À©µµ¿ì ÇÁ·Î½ÃÀú¸¦ ±³Ã¼ÇÏ´Â ¼­ºêŬ·¡½ÌÀ» ÇÑ´Ù. À©µµ¿ì ÇÁ·Î½ÃÀú´Â À©µµ¿ì·Î Àü´ÞµÇ´Â ¸ðµç ¸Þ½ÃÁö¸¦ ó¸®ÇÔÀ¸·Î½á À©µµ¿ìÀÇ Çൿ ¹æ½ÄÀ» °áÁ¤Çϴµ¥ ÀÌ ÇÔ¼ö¸¦ º¯°æÇϸé À©µµ¿ìÀÇ µ¿ÀÛÀ» ¿øÇϴ´ë·Î ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù. ¼­ºêŬ·¡½ÌÀÇ ¿ø¸®´Â ´ÙÀ½°ú °°´Ù.

¿ø·¡ÀÇ À©µµ¿ì ÇÁ·Î½ÃÀú¸¦ ¼­ºêŬ·¡½º ÇÁ·Î½ÃÀú·Î ±³Ã¼ÇÏ°í ¼­ºêŬ·¡½º ÇÁ·Î½ÃÀú¿¡¼­ ¿øÇÏ´Â ¸Þ½ÃÁö¸¦ °¡·Îä¼­ ¸ÕÀú ó¸®ÇÔÀ¸·Î½á Ç¥ÁØ ÄÁÆ®·Ñ µîÀÇ µ¿ÀÛÀ» º¯°æÇÑ´Ù. °³³äÀûÀ¸·Î µµ½ºÀÇ ÀÎÅÍ·´ÅÍ °¡·Îä±â¿Í À¯»çÇÏ´Ù.

HWND hEdit1;
WNDPROC OldEditProc;
LRESULT CALLBACK EditSubProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	switch (iMessage) {
	case WM_CHAR:
		if (wParam == 'C' || wParam == 'c')
			return 0;
		if (wParam == 'D' || wParam == 'd')
			wParam = 'Z';
		break;
	}
	return CallWindowProc(OldEditProc,hWnd,iMessage,wParam,lParam);
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	PAINTSTRUCT ps;
	HDC hdc;
	char Mes[]="¿¡µðÆ®¿¡ CÅ° ÀÔ·ÂÀ» ±ÝÁöÇÏ°í DÀÔ·ÂÀ» Z·Î ¹Ù²Û´Ù.";
	switch(iMessage) {
	case WM_CREATE:
		hEdit1=CreateWindow("edit",NULL,WS_CHILD | WS_VISIBLE | WS_BORDER,
			10,10,300,25,hWnd,(HMENU)0,g_hInst,NULL);
		SetFocus(hEdit1);
		OldEditProc=(WNDPROC)SetWindowLong(hEdit1,GWL_WNDPROC,(LONG)EditSubProc);
		return 0;
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		TextOut(hdc,10,100,Mes,strlen(Mes));
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		SetWindowLong(hEdit1,GWL_WNDPROC,(LONG)OldEditProc);
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

EditSubProcÀ̶ó´Â ¼­ºêŬ·¡½º ÇÁ·Î½ÃÀú¸¦ Á¤ÀÇÇÏ°í SetWindowLong ÇÔ¼ö·Î ¿¡µðÆ®ÀÇ À©µµ¿ì ÇÁ·Î½ÃÀú¸¦ ÀÌ ÇÔ¼ö·Î ±³Ã¼ÇÏ¿´´Ù. À̶§ ¿ø·¡ÀÇ À©µµ¿ì ÇÁ·Î½ÃÀú´Â OldEditProc º¯¼ö¿¡ ÀúÀåÇØ µÎ¾î¾ß µðÆúÆ® ¸Þ½ÃÁö 󸮸¦ ÇÒ ¼ö ÀÖ´Ù. ¼­ºêŬ·¡½º ÇÁ·Î½ÃÀú¿¡¼­´Â WM_CHAR ¸Þ½ÃÁö¸¦ ¹Þ¾ÒÀ» ¶§ C ¹®ÀÚ°¡ ÀԷµǴ °ÍÀ» °ÅºÎÇÒ ¼ö ÀÖÀ¸¸ç D¹®ÀÚ´Â Z¹®ÀÚ·Î ¹Ù²Ü ¼öµµ ÀÖ´Ù. Áï, ¼­ºêŬ·¡½º ÇÁ·Î½ÃÀú´Â Ç×»ó ¿ø·¡ ÇÁ·Î½ÃÀúº¸´Ù ¸ÕÀú ¸Þ½ÃÁö¸¦ ¹Þ±â ¶§¹®¿¡ ¿øÇÏ´Â ¾î¶² 󸮵çÁö ÇÒ ¼ö ÀÖ´Ù.

ÀÌ ¿¹Á¦´Â ¼­ºêŬ·¡½ÌÀÇ °³³äÀ» º¸¿©ÁÖ±â À§ÇØ °¡½ÃÀûÀ¸·Î È®ÀÎÀÌ ½¬¿î WM_CHAR ¸Þ½ÃÁö¸¦ »ç¿ëÇߴµ¥ ½ÇÁ¦ ÇÁ·Î±×·¡¹Ö¿¡¼­´Â WM_KEYDOWNÀ» °¡·Îä¼­ ƯÁ¤ Å°°¡ ÀԷµǴ °ÍÀ» ¾Ë¾Æ³½´Ù°Å³ª WM_LBUTTONDOWN ¸Þ½ÃÁö¸¦ °¡·Îä¼­ ¸¶¿ì½º ¾×¼ÇÀ» ¹Ù²Ü ¼öµµ ÀÖ´Ù. ¶ÇÇÑ WM_PAINT³ª WM_NCPAINT¸¦ °¡·Îä¸é À©µµ¿ìÀÇ ¸ð¾çÀ» ¿ÏÀüÈ÷ ¹Ù²Ü ¼öµµ ÀÖ´Ù. ±×·¯³ª SetWindowLong ÇÔ¼ö¿¡ ÀÇÇÑ ÀνºÅϽº ¼­ºêŬ·¡½ÌÀº À©µµ¿ì°¡ ÀÌ¹Ì ¸¸µé¾îÁö°í ³­ ÈÄ¿¡ ÀÌ·ç¾îÁö´Â °ÍÀ̹ǷΠWM_CREATE´Â °¡·Îç ¼ö ¾øÀ¸¸ç ¿©ºÐ ¸Þ¸ð¸®´Â Àý´ë·Î Á¶ÀÛÇؼ­´Â ¾ÈµÈ´Ù´Â Á¦¾àÀÌ ÀÖ´Ù.

¿¹Á¦ 3

´ÙÀ½ ¿¹Á¦´Â À©µµ¿ìÀÇ ¿©ºÐ ¸Þ¸ð¸®¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀ» º¸¿©ÁØ´Ù. ¿©ºÐ ¸Þ¸ð¸®´Â À©µµ¿ì¸¦ »ý¼ºÇÒ ¶§ Ãß°¡·Î ÇÒ´çµÇ´Â ¸Þ¸ð¸®À̸ç À©µµ¿ì°¡ ÀÚ½ÅÀÇ °íÀ¯ÇÑ ¿ëµµ·Î »ç¿ëÇÒ ¼ö ÀÖ´Â ¸Þ¸ð¸® ¿µ¿ªÀÌ´Ù. ÁÖ·Î ÀÚ½ÅÀÇ °íÀ¯ÇÑ ¼Ó¼º°ªÀ̳ª ¼³Á¤»óŸ¦ ±â¾ïÇÒ ¶§ »ç¿ëÇÑ´Ù.

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	int x,y;
	switch(iMessage) {
	case WM_CREATE:
		for (x=0;x<1000;x+=100)
			for (y=0;y<1000;y+=100) {
				CreateWindow("ChildCls",NULL,WS_CHILD | WS_VISIBLE,
				x,y,100,100,hWnd,(HMENU)NULL,g_hInst,NULL);
			}
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

LRESULT CALLBACK ChildProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	int Shape;
	COLORREF Color;
	HBRUSH hBrush, OldBrush;

	switch(iMessage) {
	case WM_CREATE:
		SetWindowLong(hWnd, 0, 0);
		SetWindowLong(hWnd, 4, RGB(0,0,255));
		return 0;
	case WM_LBUTTONDOWN:
		Shape=GetWindowLong(hWnd,0);
		Shape++;
		if (Shape==3)
			Shape=0;
		SetWindowLong(hWnd,0,Shape);
		InvalidateRect(hWnd,NULL,TRUE);
		return 0;
	case WM_RBUTTONDOWN:
		Color=GetWindowLong(hWnd,4);
		if (Color == RGB(0,0,255)) {
			Color=RGB(255,0,0);
		} else {
			Color = Color << 8;
		}
		SetWindowLong(hWnd,4,Color);
		InvalidateRect(hWnd,NULL,TRUE);
		return 0;
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		Color=GetWindowLong(hWnd,4);
		Shape=GetWindowLong(hWnd,0);
		hBrush=CreateSolidBrush(Color);
		OldBrush=(HBRUSH)SelectObject(hdc,hBrush);
		switch (Shape) {
		case 0:
			Rectangle(hdc,0,0,100,100);
			break;
		case 1:
			RoundRect(hdc,0,0,100,100,40,40);
			break;
		case 2:
			Ellipse(hdc,0,0,100,100);
			break;
		}
		EndPaint(hWnd, &ps);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

ÀÌ ¿¹Á¦´Â 9°³ÀÇ Â÷Àϵå À©µµ¿ì¸¦ »ý¼ºÇ쵂 °¢°¢ÀÇ Â÷Àϵå´Â 8¹ÙÀÌÆ®ÀÇ ¿©ºÐ ¸Þ¸ð¸®(Á¤¼ö µÎ °³)¸¦ °¡Áö°í ÀÖ´Ù. ¿©ºÐ ¸Þ¸ð¸®´Â À©µµ¿ì Ŭ·¡½ºÀÇ cbWndExtra ¸â¹ö¿¡ ±× ¾çÀ» ÁöÁ¤ÇÑ´Ù. Â÷Àϵå À©µµ¿ì´Â ¿©ºÐ ¸Þ¸ð¸®ÀÇ Ã¹ 4¹ÙÀÌÆ®¿¡ ÀÚ½ÅÀÇ ÀÛ¾÷¿µ¿ª¿¡ ±×¸± µµÇüÀÇ ¸ð¾çÀ» ±â¾ïÇÏ¸ç ´ÙÀ½ 4¹ÙÀÌÆ®¿¡ µµÇüÀÇ »ö»óÀ» ±â¾ïÇÑ´Ù. ¿ÞÂÊ ¸¶¿ì½º ¹öÆ°À» ´©¸£¸é GetWindowLongÀ¸·Î ¿©ºÐ ¸Þ¸ð¸®¿¡¼­ µµÇüÀÇ ¸ð¾çÀ» Àоî¿Í ´ÙÀ½ µµÇü ¸ð¾çÀ¸·Î º¯°æÇÏ¸ç ¿À¸¥ÂÊ ¸¶¿ì½º ¹öÆ°À» ´©¸£¸é µµÇüÀÇ »ö»óÀ» º¯°æÇÑ´Ù.

WM_PAINT¿¡¼­´Â ¿©ºÐ ¸Þ¸ð¸®·ÎºÎÅÍ µµÇüÀÇ ¸ð¾ç°ú »ö»óÀ» Àоî¿Í ÀÛ¾÷ ¿µ¿ª¿¡ ÇØ´ç µµÇüÀ» ±×¸°´Ù. °¢ À©µµ¿ì°¡ °íÀ¯ÀÇ ¿©ºÐ ¸Þ¸ð¸®¸¦ °¡Áö¹Ç·Î º°µµÀÇ Àü¿ª º¯¼ö¾øÀÌ ½º½º·Î ÀÚ½ÅÀÇ »óŸ¦ ÈǸ¢ÇÏ°Ô ±â¾ïÇÒ ¼ö ÀÖ´Ù. Å©±â°¡ Å« Á¤º¸¸¦ ¿©ºÐ ¸Þ¸ð¸®¿¡ ´ã°íÀÚ ÇÒ ¶§´Â ±¸Á¶Ã¼ Æ÷ÀÎÅ͸¦ »ç¿ëÇÑ´Ù.

Âü°íÇÔ¼ö

GetWindowLong : À©µµ¿ìÀÇ ¼Ó¼º°ªÀ» Á¶»çÇÑ´Ù.

Ç÷§Æû

95ÀÌ»ó

ÂüÁ¶

À©µµ¿ìÀÇ ¼Ó¼º¿¡ ´ëÇؼ­´Â 10-3ÀýÀ» ÂüÁ¶ÇÏ°í ¼­ºêŬ·¡½Ì¿¡ ´ëÇؼ­´Â 11-2ÀýÀ» ÂüÁ¶ÇÑ´Ù.


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