¿øÇü |
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 Áï À©µµ¿ìÀÇ ½ºÅ¸ÀÏÀÌ¸ç ¿©ºÐ ¸Þ¸ð¸® Á¶ÀÛÀ» À§Çؼµµ ÀÌ ÇÔ¼ö°¡ »ç¿ëµÈ´Ù. ¶ÇÇÑ À©µµ¿ì ÇÁ·Î½ÃÀúÀÇ ¹øÁö¸¦ »õ·Î¿î ÇÔ¼ö·Î ¹Ù²ÞÀ¸·Î½á À©µµ¿ì¸¦ ¼ºê Ŭ·¡½ÌÇÒ ¼öµµ ÀÖ´Ù. ´Ü ÀÌ ÇÔ¼ö´Â °°Àº ½º·¹µå¿¡ ¼ÓÇÑ À©µµ¿ìÀÇ ¼Ó¼º¸¸À» º¯°æÇÒ ¼ö ÀÖ´Ù. ´Ù¸¥ ½º·¹µå¿¡¼ »ý¼ºÇÑ À©µµ¿ìÀÇ ¼Ó¼ºÀº º¯°æÇÒ ¼ö ¾ø´Ù. ¶ÇÇÑ ÀÌ ÇÔ¼ö·Î º¯°æÇÒ ¼ö ÀÖ´Â °ªµé Áß Æ¯Á¤ ½ºÅ¸ÀÏÀº ½Ã½ºÅÛ¿¡ ÀÇÇØ Ä³½ÃµÇ¹Ç·Î º¯°æ Áï½Ã È¿°ú°¡ ³ªÅ¸³ªÁö ¾ÊÀ» ¼öµµ ÀÖÀ¸¸ç 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
|