| ¿øÇü |
LONG SetWindowLong( HWND hWnd, int nIndex, LONG dwNewLong); | ||||||||||||||||||||
| MFC ¿øÇü |
ÇØ´çÇÏ´Â ÇÔ¼ö ¾øÀ½ | ||||||||||||||||||||
| Àμö |
¢ºhWnd : ¼Ó¼ºÀ» º¯°æÇϰíÀÚ ÇÏ´Â À©µµ¿ìÀÇ ÇÚµé ¢ºnIndex : º¯°æÇϰíÀÚ ÇÏ´Â ¼Ó¼ºÀ» ÁöÁ¤ÇÏ¸ç ´ÙÀ½ Áß ÇϳªÀÇ °ªÀ» ÁÙ ¼ö ÀÖ´Ù.
¶Ç´Â À©µµ¿ì¿¡ ¿©ºÐ ¸Þ¸ð¸®°¡ ÀÖÀ» °æ¿ì ¿©ºÐ ¸Þ¸ð¸®ÀÇ ¿ÀÇÁ¼ÂÀ» ÁöÁ¤ÇÒ ¼öµµ ÀÖ´Ù. ÀÌ °ªÀº ¹Ýµå½Ã ¾ç¼ö¿©¾ß Çϸç cbWndExtra-4º¸´Ù´Â ÀÛ¾Æ¾ß ÇÑ´Ù. ¿¹¸¦ µé¾î ¿©ºÐ ¸Þ¸ð¸®°¡ 16¹ÙÀÌÆ® ÁöÁ¤µÇ¾î ÀÖÀ¸¸é nIndex´Â 0~12±îÁö ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. ¢ºdwNewLong : »õ·Î º¯°æÇÒ 32ºñÆ®°ªÀ̸ç nIndex¿¡ µû¶ó °ªÀÇ Àǹ̴ ´Þ¶óÁø´Ù. | ||||||||||||||||||||
| ¸®ÅÏ |
¼º°øÇϸé ÀÌÀü¿¡ ¼³Á¤µÇ¾î ÀÖ´ø 32ºñÆ®°ªÀ» ¸®ÅÏÇÏ¸ç °ªÀÌ ¼³Á¤µÇ¾î ÀÖÁö ¾Ê¾ÒÀ¸¸é 0À» ¸®ÅÏÇÑ´Ù. ¶ÇÇÑ ¿¡·¯°¡ ¹ß»ýÇØµµ 0À» ¸®ÅÏÇÑ´Ù. | ||||||||||||||||||||
| ¼³¸í |
À©µµ¿ìÀÇ ¼Ó¼ºÀº CreateWindow(Ex) ÇÔ¼ö·Î À©µµ¿ì¸¦ »ý¼ºÇÒ ¶§ ÁöÁ¤ÇÑ´Ù. ÀÏ´Ü À©µµ¿ì°¡ ¸¸µé¾îÁø ÈÄ¿¡´Â ÀÌ ÇÔ¼ö·Î À©µµ¿ìÀÇ ¼Ó¼ºÀ» º¯°æÇÒ ¼ö ÀÖ´Ù. À̶§ ÁÖ·Î º¯°æÀÇ ´ë»óÀÌ µÇ´Â °ÍÀº GWL_STYLE Áï À©µµ¿ìÀÇ ½ºÅ¸ÀÏÀÌ¸ç ¿©ºÐ ¸Þ¸ð¸® Á¶ÀÛÀ» À§Çؼµµ ÀÌ ÇÔ¼ö°¡ »ç¿ëµÈ´Ù. ¶ÇÇÑ À©µµ¿ì ÇÁ·Î½ÃÀúÀÇ ¹øÁö¸¦ »õ·Î¿î ÇÔ¼ö·Î ¹Ù²ÞÀ¸·Î½á À©µµ¿ì¸¦ ¼ºê Ŭ·¡½ÌÇÒ ¼öµµ ÀÖ´Ù. ´Ü ÀÌ ÇÔ¼ö´Â °°Àº ½º·¹µå¿¡ ¼ÓÇÑ À©µµ¿ìÀÇ ¼Ó¼º¸¸À» º¯°æÇÒ ¼ö ÀÖ´Ù. ´Ù¸¥ ½º·¹µå¿¡¼ »ý¼ºÇÑ À©µµ¿ìÀÇ ¼Ó¼ºÀº º¯°æÇÒ ¼ö ¾ø´Ù. ¶ÇÇÑ ÀÌ ÇÔ¼ö·Î º¯°æÇÒ ¼ö ÀÖ´Â °ªµé Áß Æ¯Á¤ ½ºÅ¸ÀÏÀº ½Ã½ºÅÛ¿¡ ÀÇÇØ ij½ÃµÇ¹Ç·Î º¯°æ Áï½Ã È¿°ú°¡ ³ªÅ¸³ªÁö ¾ÊÀ» ¼öµµ ÀÖÀ¸¸ç SetWindowPos ÇÔ¼ö·Î ij½Ã¸¦ ºñ¿öÁÖ¾î¾ß ÇÏ´Â °Íµµ ÀÖ´Ù. ´ÙÀ½ ¿¹Á¦¸¦ ÅëÇØ ÀÌ ÇÔ¼öÀÇ »ç¿ë¿¹¸¦ º¸µµ·Ï ÇÏÀÚ. ´ÙÀ½ ¿¹Á¦´Â À©µµ¿ìÀÇ ½ºÅ¸ÀÏÀ» ½ÇÇàÁß¿¡ º¯°æÇÑ´Ù. 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 ÇÔ¼ö·Î ¹Ù²ã ÁÖ¾î¾ß ÇÑ´Ù. ´ÙÀ½ ¿¹Á¦´Â ÀÌ ÇÔ¼ö·Î À©µµ¿ì ÇÁ·Î½ÃÀú¸¦ ±³Ã¼ÇÏ´Â ¼ºêŬ·¡½ÌÀ» ÇÑ´Ù. À©µµ¿ì ÇÁ·Î½ÃÀú´Â À©µµ¿ì·Î Àü´ÞµÇ´Â ¸ðµç ¸Þ½ÃÁö¸¦ ó¸®ÇÔÀ¸·Î½á À©µµ¿ìÀÇ Çൿ ¹æ½ÄÀ» °áÁ¤Çϴµ¥ ÀÌ ÇÔ¼ö¸¦ º¯°æÇϸé À©µµ¿ìÀÇ µ¿ÀÛÀ» ¿øÇϴ´ë·Î ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù. ¼ºêŬ·¡½ÌÀÇ ¿ø¸®´Â ´ÙÀ½°ú °°´Ù.
¿ø·¡ÀÇ À©µµ¿ì ÇÁ·Î½ÃÀú¸¦ ¼ºêŬ·¡½º ÇÁ·Î½ÃÀú·Î ±³Ã¼ÇÏ°í ¼ºêŬ·¡½º ÇÁ·Î½ÃÀú¿¡¼ ¿øÇÏ´Â ¸Þ½ÃÁö¸¦ °¡·Îä¼ ¸ÕÀú ó¸®ÇÔÀ¸·Î½á Ç¥ÁØ ÄÁÆ®·Ñ µîÀÇ µ¿ÀÛÀ» º¯°æÇÑ´Ù. °³³äÀûÀ¸·Î µµ½ºÀÇ ÀÎÅÍ·´ÅÍ °¡·Îä±â¿Í À¯»çÇÏ´Ù.
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´Â °¡·Îç ¼ö ¾øÀ¸¸ç ¿©ºÐ ¸Þ¸ð¸®´Â Àý´ë·Î Á¶ÀÛÇØ¼´Â ¾ÈµÈ´Ù´Â Á¦¾àÀÌ ÀÖ´Ù. ´ÙÀ½ ¿¹Á¦´Â À©µµ¿ìÀÇ ¿©ºÐ ¸Þ¸ð¸®¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀ» º¸¿©ÁØ´Ù. ¿©ºÐ ¸Þ¸ð¸®´Â À©µµ¿ì¸¦ »ý¼ºÇÒ ¶§ Ãß°¡·Î ÇÒ´çµÇ´Â ¸Þ¸ð¸®À̸ç À©µµ¿ì°¡ ÀÚ½ÅÀÇ °íÀ¯ÇÑ ¿ëµµ·Î »ç¿ëÇÒ ¼ö ÀÖ´Â ¸Þ¸ð¸® ¿µ¿ªÀÌ´Ù. ÁÖ·Î ÀÚ½ÅÀÇ °íÀ¯ÇÑ ¼Ó¼º°ªÀ̳ª ¼³Á¤»óŸ¦ ±â¾ïÇÒ ¶§ »ç¿ëÇÑ´Ù.
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
|