´ÙÀ½Àº Åø¹Ù¸¦ Ãß°¡ÇØ º¸ÀÚ. ¸Þ´º¿Í ´ÜÃàŰº¸´Ù´Â ¾Æ¹«·¡µµ Åø¹Ù°¡ ÈξÀ ´õ ¾²±â Æí¸®ÇÏ´Ù. ƯÈ÷ ÀÌ·± ±×·¡ÇÈ ÇÁ·Î±×·¥Àº ¸¶¿ì½º¸¦ ¸¹ÀÌ »ç¿ëÇϱ⠶§¹®¿¡ Űº¸µåº¸´Ù´Â ¸¶¿ì½º·Î ¸í·ÉÀ» ¼±ÅÃÇÏ´Â °ÍÀÌ ´õ ºü¸£°í ÁÁ´Ù. Åø¹Ùµµ Â÷Àϵå À©µµ¿ìÀ̹ǷΠÀ©µµ¿ì ÇÚµéÀ» ¸ÕÀú ¼±¾ðÇÑ´Ù.
HWND hToolBar;
±×¸®°í Åø¹Ù¸¦ »ý¼ºÇÏ´Â ÇÔ¼ö¸¦ ÀÛ¼ºÇÑ´Ù. Åø¹Ù¿¡ »ç¿ëÇÒ ºñÆ®¸ÊÀº ¸®¼Ò½º¿¡ ÀÌ¹Ì ÀÛ¼ºµÇ¾î ÀÖÀ¸¹Ç·Î ÀÌ ºñÆ®¸ÊÀ¸·Î Åø ¹öưÀ» »ý¼ºÇϱ⸸ ÇÏ¸é µÈ´Ù.
void CreateToolBar()
{
TBBUTTON ToolBtn[]={
{0,IDM_FILE_NEW,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,0},
{1,IDM_FILE_OPEN,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,1},
{2,IDM_FILE_SAVE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,2},
{4,0,0,TBSTYLE_SEP,0,0},
{3,IDM_EDIT_CUT,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,3},
{4,IDM_EDIT_COPY,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,4},
{5,IDM_EDIT_PASTE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,5},
{4,0,0,TBSTYLE_SEP,0,0},
{6,IDM_SHAPE_SELECT,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0,0,6},
{7,IDM_SHAPE_LINE,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0,0,7},
{8,IDM_SHAPE_ELLIPSE,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0,0,8},
{9,IDM_SHAPE_RECTANGLE,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0,0,9},
{10,IDM_SHAPE_TEXT,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0,0,10},
{11,IDM_SHAPE_BITMAP,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0,0,11},
{12,IDM_SHAPE_META,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0,0,12},
{4,0,0,TBSTYLE_SEP,0,0},
{13,IDM_SHAPE_PROPERTY,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,13},
};
TCHAR *szToolText="»õÆÄÀÏ\0¿±â\0ÀúÀå\0ÀÚ¸£±â\0º¹»ç\0ºÙÀ̱â"
"\0¼±ÅÃ\0¼±\0¿ø\0»ç°¢Çü\0ÅØ½ºÆ®\0ºñÆ®¸Ê\0¸ÞŸ\0¼Ó¼º\0";
hToolBar=CreateToolbarEx(hWndMain, WS_CHILD | WS_VISIBLE
| TBSTYLE_TOOLTIPS | TBSTYLE_FLAT ,
99, 14, g_hInst, IDB_TOOLBAR, ToolBtn, 17,
16,15,16,15,sizeof(TBBUTTON));
SendMessage(hToolBar,TB_ADDSTRING,NULL,(LPARAM)szToolText);
SendMessage(hToolBar,TB_AUTOSIZE,0,0);
}
Åø ¹öưÀÇ IDµéÀº ÀÌ¹Ì ¸¸µé¾îÁ® ÀÖ´Â ¸Þ´ºÀÇ Ç׸ñµé°ú ´ëÀÀµÇ´Â °ÍµéÀ̹ǷΠº°µµÀÇ ¸í·É ó¸® ·çƾÀ» µû·Î ÀÛ¼ºÇÏÁö ¾Ê¾Æµµ µÈ´Ù. ¸ÞÀÎ À©µµ¿ì°¡ »ý¼ºµÉ ¶§ Åø¹Ù¸¦ °°ÀÌ ¸¸µç´Ù.
LRESULT Main_OnCreate(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
InitCommonControls();
hWndMain=hWnd;
hCanvas=CreateWindow("Canvas",NULL,WS_CHILD | WS_VISIBLE,
0,0,0,0, hWnd,(HMENU)0,g_hInst,NULL);
CreateToolBar();
return 0;
}
Main_OnCreate¿¡¼ Á÷Á¢ Åø¹Ù¸¦ ¸¸µé ¼öµµ ÀÖÁö¸¸ Äڵ尡 ±æ¾îÁ® º°µµÀÇ ÇÔ¼ö·Î ºÐ¸®ÇØ µÎ¾ú´Ù. µü Çѹø¸¸ »ç¿ëÇÏ´õ¶óµµ ºÐ¸® °¡´ÉÇÑ ÀÛ¾÷ ´ÜÀ§´Â °¡±ÞÀûÀ̸é ÇÔ¼ö·Î ºÐ¸®ÇÏ´Â °ÍÀÌ ÁÁ´Ù. ¸ÞÀÎ À©µµ¿ìÀÇ ÀÛ¾÷ ¿µ¿ª Å©±â°¡ º¯°æµÉ ¶§ Åø¹Ù¿Í ĵ¹ö½º¸¦ Àç¹èÄ¡ÇÏ¿© Åø¹Ù°¡ Ç×»ó ĵ¹ö½ºÀ§¿¡ ÀÖµµ·Ï ÇÑ´Ù.
LRESULT Main_OnSize(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
RECT wrt;
int toolheight;
if (wParam != SIZE_MINIMIZED) {
SendMessage(hToolBar,TB_AUTOSIZE,0,0);
GetWindowRect(hToolBar,&wrt);
toolheight=wrt.bottom-wrt.top;
MoveWindow(hCanvas,0,toolheight,LOWORD(lParam),HIWORD(lParam)-toolheight,TRUE);
}
return 0;
}
ĵ¹ö½º´Â Åø¹ÙÀÇ ³ôÀ̸¦ Á¦¿ÜÇÑ ³ª¸ÓÁö ºÎºÐÀ» ¸ðµÎ Â÷ÁöÇÑ´Ù. ¸ÞÀÎ À©µµ¿ì°¡ Á÷Á¢ µµÇüÀ» °ü¸®ÇÏÁö ¾Ê°í ĵ¹ö½º¶ó´Â Â÷Àϵ尡 µµÇüÀ» °ü¸®Çϱ⠶§¹®¿¡ Åø¹Ù°¡ Ãß°¡µÇ¾ú´Ù°í ÇØ¼ µµÇü ÆíÁý Äڵ尡 ¿µÇâÀ» ¹Þ¾Æ¾ß ÇÒ ÀÌÀ¯´Â ¾ø´Ù. ¸¸¾à ¾ÖÃÊ¿¡ ĵ¹ö½º¸¦ ºÐ¸®ÇØ ³õÁö ¾Ê¾Ò´Ù¸é Åø¹Ù¿¡ ÀÇÇØ µµÇüµéÀÌ ÀνÄÇÏ´Â ¿øÁ¡ÀÌ ¹Ù²î°Ô µÇ¹Ç·Î ´ë´ëÀûÀÎ ÄÚµåÀÇ ¼öÁ¤ÀÌ ºÒ°¡ÇÇÇÒ °ÍÀÌ´Ù. Åø ¹öưÀÇ ID´Â ¸ÞÀÎ ¸Þ´ºÀÇ ID¿Í ÀÏÄ¡ÇÏ¹Ç·Î Åø ¹öưÀÇ ¸í·ÉÀº º°µµ·Î ó¸®ÇÒ Çʿ䰡 ¾ø´Ù.
¿©±â±îÁö ÀÛ¼ºÇÑ ÈÄ Å×½ºÆ®ÇØ º¸¸é Åø¹Ù´Â ÀÌ¹Ì Àß µ¿ÀÛÇÑ´Ù. Åø¹Ù¿¡¼ Á÷¼±À̳ª Ÿ¿øÀ» ¼±ÅÃÇÑ ÈÄ ±×¸®±â¸¦ ÇØ º¸¸é ¼±ÅÃµÈ µµÇüÀÌ Àß ±×·ÁÁú °ÍÀÌ´Ù. ±×·¯³ª ¸Þ´º³ª ´ÜÃàŰ·Î µµ±¸¸¦ º¯°æÇϸé Åø ¹Ù¿¡´Â ÀÌ »ç½ÇÀÌ Áï½Ã ¹Ý¿µµÇÁö ¾Ê´Â´Ù. Åø¹Ù´Â ¸í·ÉÀ» ÀԷ¹޴ µµ±¸À̱⵵ ÇÏÁö¸¸ ÇöÀç ÇÁ·Î±×·¥ÀÇ »óŸ¦ Ç¥½ÃÇÏ´Â Ãâ·Âµµ±¸À̱⵵ ÇϹǷΠ»ç¿ëÀÚ°¡ ¼±ÅÃÇÑ µµ±¸¸¦ º¸¿© ÁÖ¾î¾ß ÇÑ´Ù.
Áï, Åø¹Ùµµ ¸Þ´ºÃ³·³ »óŸ¦ °ü¸®ÇÏ¿© ¼±ÅÃµÈ µµ±¸µµ º¸¿©ÁÖ°í »ç¿ëÇÒ ¼ö ¾ø´Â ¹öưÀº »ç¿ë ±ÝÁö½Ã۱⵵ ÇØ¾ß ÇÑ´Ù. ±×·±µ¥ Åø ¹Ù´Â ȸ鿡 Ç×»ó º¸ÀÌ´Â »óÅÂÀ̹ǷΠ¸Þ´º°¡ ÆîÃÄÁú ¶§ º¸³»Áö´Â WM_INITMENU¿¡ ÇØ´çÇÏ´Â ¸Þ½ÃÁö°¡ µû·Î ¾ø´Ù. ±×·¡¼ Åø¹Ù¸¦ °ü¸®ÇÒ ½ÃÁ¡À» Á¤Çϱ⠾î·Á¿îµ¥ ÁÖ±âÀûÀ¸·Î ÇÁ·Î±×·¥ÀÇ »óŸ¦ Á¡°ËÇÏ¿© Åø¹ÙÀÇ »óŸ¦ °ü¸®ÇØ¾ß ÇÑ´Ù. ÀÌ·± ¸ñÀûÀ¸·Î ŸÀ̸Ӹ¦ ¾²´Â °ÍÀº ´Ù¼Ò ³¶ºñ°¡ ½ÉÇϱ⠶§¹®¿¡ ÁַΠó¸®ÇÒ ¸Þ½ÃÁö°¡ ¾ø´Â ½Ã°£ÀÎ ¾ÆÀ̵é ŸÀÓÀ» Ȱ¿ëÇÑ´Ù.
void OnIdle()
{
static DTool OldTool=(DTool)-1;
if (OldTool == NowTool) {
return;
}
OldTool=NowTool;
SendMessage(hToolBar,TB_SETSTATE,IDM_SHAPE_SELECT,MAKELONG(TBSTATE_ENABLED,0));
SendMessage(hToolBar,TB_SETSTATE,IDM_SHAPE_LINE,MAKELONG(TBSTATE_ENABLED,0));
SendMessage(hToolBar,TB_SETSTATE,IDM_SHAPE_ELLIPSE,MAKELONG(TBSTATE_ENABLED,0));
SendMessage(hToolBar,TB_SETSTATE,IDM_SHAPE_RECTANGLE,MAKELONG(TBSTATE_ENABLED,0));
SendMessage(hToolBar,TB_SETSTATE,IDM_SHAPE_TEXT,MAKELONG(TBSTATE_ENABLED,0));
SendMessage(hToolBar,TB_SETSTATE,IDM_SHAPE_BITMAP,MAKELONG(TBSTATE_ENABLED,0));
SendMessage(hToolBar,TB_SETSTATE,IDM_SHAPE_META,MAKELONG(TBSTATE_ENABLED,0));
switch (NowTool) {
case DT_SELECT:
SendMessage(hToolBar,TB_SETSTATE,IDM_SHAPE_SELECT,
MAKELONG(TBSTATE_CHECKED | TBSTATE_ENABLED,0));
break;
case DT_LINE:
SendMessage(hToolBar,TB_SETSTATE,IDM_SHAPE_LINE,
MAKELONG(TBSTATE_CHECKED | TBSTATE_ENABLED,0));
break;
case DT_ELLIPSE:
SendMessage(hToolBar,TB_SETSTATE,IDM_SHAPE_ELLIPSE,
MAKELONG(TBSTATE_CHECKED | TBSTATE_ENABLED,0));
break;
case DT_RECTANGLE:
SendMessage(hToolBar,TB_SETSTATE,IDM_SHAPE_RECTANGLE,
MAKELONG(TBSTATE_CHECKED | TBSTATE_ENABLED,0));
break;
case DT_TEXT:
SendMessage(hToolBar,TB_SETSTATE,IDM_SHAPE_TEXT,
MAKELONG(TBSTATE_CHECKED | TBSTATE_ENABLED,0));
break;
case DT_BITMAP:
SendMessage(hToolBar,TB_SETSTATE,IDM_SHAPE_BITMAP,
MAKELONG(TBSTATE_CHECKED | TBSTATE_ENABLED,0));
break;
case DT_META:
SendMessage(hToolBar,TB_SETSTATE,IDM_SHAPE_META,
MAKELONG(TBSTATE_CHECKED | TBSTATE_ENABLED,0));
break;
}
}
¸ðµç µµ±¸¸¦ ºñ¼±Åà »óÅ·Π¸¸µç ÈÄ NowTool¿¡ ´ëÀÀµÇ´Â Åø ¹öư¸¸ ¼±Åà »óÅ·Π¸¸µé¾ú´Ù. ÀÌ ÄÚµå´Â ÅøÀÌ º¯°æµÉ ¶§¸¸ ½ÇÇàÇØ¾ß ÇϹǷΠÃÖÈÄ·Î Àû¿ëµÈ ÅøÀ» OldTool Á¤Àû º¯¼ö¿¡ ÀúÀåÇØ µÎ°í NowToolÀÌ OldTool°ú ´Þ¶óÁú ¶§¸¸ Åø ¹öư »óŸ¦ °ü¸®Çϵµ·Ï Çß´Ù. WinMainÀÇ ¸Þ½ÃÁö ·çÇÁ¿¡¼ ¾ÆÀ̵é ŸÀÓÀ» ã¾Æ ÀûÀýÇÑ ½ÃÁ¡¿¡ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
,LPSTR lpszCmdParam,int nCmdShow)
....
HACCEL hAccel;
BOOL AllowIdle=TRUE;
hAccel=LoadAccelerators(hInstance,MAKEINTRESOURCE(IDR_ACCELERATOR1));
for (;;) {
do {
if (!GetMessage(&Message,NULL,0,0))
goto endloop;
if (Message.message != 0x118/*WM_SYSTIMER*/) {
AllowIdle=TRUE;
}
if (!TranslateAccelerator(hWnd,hAccel,&Message)) {
TranslateMessage(&Message);
DispatchMessage(&Message);
}
} while (PeekMessage(&Message,NULL,0,0,PM_NOREMOVE));
if (AllowIdle) {
OnIdle();
AllowIdle=FALSE;
}
}
endloop:
return (int)Message.wParam;
}
¸Þ½ÃÁö ·çÇÁ¿¡¼ Å¥ÀÇ ¸Þ½ÃÁö¸¦ ²¨³» ó¸®ÇÏ´Â Æ´Æ´ÀÌ Çѹø¾¿ OnIdleÀ» ºÒ·¯ Åø ¹öưÀÇ »óŸ¦ °ü¸®ÇÒ °ÍÀÌ´Ù. ÀÌ ¿Ü¿¡ ¾ÆÀ̵é ŸÀÓ¿¡ ´õ ÇÊ¿äÇÑ Ã³¸®°¡ ÀÖÀ¸¸é ÀÌ ÇÔ¼ö¿¡ ÀÛ¼ºÇÏ¸é µÈ´Ù.