»óŶõ¿¡ º¸¿©ÁÙ Á¤º¸ÀÇ Á¾·ù°¡ ¸¹À¸¸é ¸î °³ÀÇ ÄÀ¸·Î ³ª´« ÈÄ °¢ Ä¿¡ ¼·Î ´Ù¸¥ ¿©·¯ °³ÀÇ Á¤º¸¸¦ Ãâ·ÂÇÒ ¼ö ÀÖ´Ù. À̶§ »óŶõÀÇ ºÐÇÒµÈ °¢ ÄÀ» ÆÄÆ®¶ó°í ÇÏ¸ç ¿øÇÏ´Â ¼ö¸¸Å ¿øÇÏ´Â ÆøÀ¸·Î ³ª´ ¼ö ÀÖ´Ù. ´ÙÀ½ ÇÔ¼ö´Â »óŶõÀ» ¿©·¯ ÆÄÆ®·Î ºÐÇÒÇÑ´Ù.
void SetStatusPart()
{
int SBPart[6];
RECT crt;
HWND hActive;
hActive=(HWND)SendMessage(g_hMDIClient,WM_MDIGETACTIVE,0,NULL);
GetClientRect(g_hFrameWnd,&crt);
if (g_ChildNum) {
SBPart[0]=max(200,crt.right-430);
SBPart[1]=SBPart[0]+70;
SBPart[2]=SBPart[1]+130;
SBPart[3]=SBPart[2]+80;
SBPart[4]=SBPart[3]+70;
SBPart[5]=SBPart[4]+80;
SendMessage(hStatus, SB_SETPARTS, 6, (LPARAM)SBPart);
} else {
SBPart[0]=crt.right;
SendMessage(hStatus, SB_SETPARTS, 1, (LPARAM)SBPart);
}
}
È°¼º Â÷Àϵ尡 ÀÖÀ¸¸é 6°³ÀÇ ÆÄÆ®¸¦ ³ª´©¾î °¢ ÆÄÆ®¿¡ ¹®¼¿¡ ´ëÇÑ ¿©·¯ °¡Áö Á¤º¸¸¦ º¸¿©ÁÖµµ·Ï ÇÑ´Ù. °¢ ÆÄÆ®´Â º¸¿©ÁÙ Á¤º¸ÀÇ ±æÀÌ¿¡ µû¶ó Àû´çÇÑ ±æÀ̸¦ °®µµ·Ï ÇßÀ¸¸ç ù ¹ø° ÆÄÆ®´Â ÃÖ¼ÒÇÑ 200Çȼ¿ÀÇ ÆøÀ» °¡Áöµµ·Ï ÇÏ¿´´Ù. È°¼ºÃ¢ÀÌ ¾øÀ¸¸é º¸¿©ÁÙ Á¤º¸°¡ ¾øÀ¸¹Ç·Î ÇÑ °³ÀÇ ÆÄÆ®¸¸ ³ª´«´Ù. ÀÌ ÇÔ¼ö´Â DGChildProc¿¡¼ ù Â÷Àϵ带 »ý¼ºÇÒ ¶§³ª ¶Ç´Â ¸¶Áö¸· Â÷Àϵ带 Æı«ÇÒ ¶§ È£ÃâµÈ´Ù.
LRESULT CALLBACK DGChildProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
SInfo *pSi;
int idx;
switch(iMessage) {
case WM_CREATE:
g_ChildNum++;
if (g_ChildNum == 1) {
SendMessage(g_hMDIClient,WM_MDISETMENU,(WPARAM)hMenu1,
(LPARAM)GetSubMenu(hMenu1,5));
Mru.ChangeMenu(GetSubMenu(GetSubMenu(hMenu1,0),8));
DrawMenuBar(g_hFrameWnd);
if (Option.bShowStatus) {
SetStatusPart();
}
}
....
case WM_DESTROY:
pSi=(SInfo *)GetWindowLong(hWnd,0);
delete pSi;
g_ChildNum--;
if (g_ChildNum==0) {
SendMessage(g_hMDIClient,WM_MDISETMENU,(WPARAM)hMenu2,NULL);
Mru.ChangeMenu(GetSubMenu(GetSubMenu(hMenu2,0),3));
DrawMenuBar(g_hFrameWnd);
if (Option.bShowStatus) {
SetStatusPart();
}
}
....
¹°·Ð »óŶõÀÌ º¸ÀÌ´Â »óÅÂÀÏ ¶§¸¸ SetStatusPart¸¦ È£ÃâÇÏ¸ç »óŶõÀÌ º¸ÀÌÁö ¾Ê´Â´Ù¸é ±»ÀÌ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÒ ÇÊ¿ä°¡ ¾ø´Ù. È°¼ºÃ¢ÀÇ À¯¹«¿¡ µû¶ó »óŶõÀÇ ÆÄÆ® ±¸¼ºÀÌ ´Þ¶óÁú °ÍÀÌ´Ù. ¸ÞÀÎ À©µµ¿ìÀÇ Å©±â°¡ º¯°æµÇ¸é °¢ ÆÄÆ®ÀÇ Å©±âµµ °°ÀÌ Á¶Á¤µÇ¾î¾ß ÇϹǷΠRelayout ÇÔ¼ö¿¡¼µµ ÆÄÆ®ÀÇ Å©±â¸¦ ÀçÁ¶Á¤ÇØ¾ß ÇÑ´Ù.
void Relayout()
{
....
if (Option.bShowStatus) {
SendMessage(hStatus,WM_SIZE,0,0);
ShowWindow(hStatus,SW_SHOW);
SetStatusPart();
} else {
ShowWindow(hStatus,SW_HIDE);
}
´ÙÀ½ ÇÔ¼ö´Â ÀÌ·¸°Ô ³ª´©¾îÁø °¢ ÆÄÆ®¿¡ Á¶»çµÈ Á¤º¸¸¦ Ãâ·ÂÇÑ´Ù. 0¹ø ÆÄÆ®´Â Ưº°È÷ Ãâ·ÂÇÒ ¹®ÀÚ¿À» µû·Î Àμö·Î Àü´Þ¹ÞÀ» ¼ö ÀÖ´Ù. ¸¸¾à Ưº°ÇÑ ¹®ÀÚ¿ÀÌ Àü´ÞµÇÁö ¾ÊÀ¸¸é µðÆúÆ® ¹®ÀÚ¿ÀÎ ¡®´ç±Ù ÆíÁý±âÀÔ´Ï´Ù¡¯°¡ ´ë½Å Ãâ·ÂµÈ´Ù.
void SetStatusText(int mask,LPCTSTR Mes/*=NULL*/)
{
TCHAR Text[128];
HWND hActive;
SInfo *pSi;
int byte;
hActive=(HWND)SendMessage(g_hMDIClient,WM_MDIGETACTIVE,0,NULL);
if (hActive==NULL) {
return;
}
pSi=(SInfo *)GetWindowLong(hActive,0);
if (mask & 1) {
if (Mes==NULL) {
SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)"´ç±Ù ÆíÁý±âÀÔ´Ï´Ù");
} else {
SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)Mes);
}
}
if (mask & 2) {
wsprintf(Text, "%dÁÙ %dÄ",pSi->Ae.GetInfoFromOff(2)+1,pSi->Ae.GetInfoFromOff(4)+1);
SendMessage(hStatus, SB_SETTEXT, 1, (LPARAM)Text);
}
if (mask & 4) {
byte=pSi->Ae.GetTextLength();
if (byte < 10240) {
wsprintf(Text, "ÃÑ %dÁÙ %d ¹ÙÀÌÆ®",pSi->Ae.GetDocInfo(0)+1,byte);
} else {
wsprintf(Text, "ÃÑ %dÁÙ %d K¹ÙÀÌÆ®",pSi->Ae.GetDocInfo(0)+1,byte/1024);
}
SendMessage(hStatus, SB_SETTEXT, 2, (LPARAM)Text);
}
if (mask & 8) {
if (pSi->Ae.GetModified()) {
lstrcpy(Text,"ÆíÁýµÇ¾úÀ½");
} else {
lstrcpy(Text,"¹ÌÆíÁý");
}
SendMessage(hStatus, SB_SETTEXT, 3, (LPARAM)Text);
}
if (mask & 0x10) {
lstrcpy(Text,"PC Æ÷¸Ë");
SendMessage(hStatus, SB_SETTEXT, 4, (LPARAM)Text);
}
if (mask & 0x20) {
if (pSi->Ae.GetInsMode()) {
lstrcpy(Text,"°ãħ¸ðµå");
} else {
lstrcpy(Text,"»ðÀÔ¸ðµå");
}
SendMessage(hStatus, SB_SETTEXT, 5, (LPARAM)Text);
}
}
Àμö mask´Â ¾î¶² ÆÄÆ®¿¡ Á¤º¸¸¦ Ãâ·ÂÇÒ °ÍÀΰ¡¸¦ ÁöÁ¤Çϴµ¥ ÇÏÀ§ ºñÆ®ºÎÅÍ °¢ ÆÄÆ®¿¡ ´ëÀÀµÈ´Ù. 0¹ø ºñÆ®°¡ 1À̸é ÆÄÆ® 0¿¡ ¹®ÀÚ¿ÀÌ Ãâ·ÂµÇ¸ç 1¹ø ºñÆ®°¡ 1À̸é ÆÄÆ® 1¿¡ Á¤º¸°¡ Ãâ·ÂµÈ´Ù. ¸ðµç ÆÄÆ®¿¡ ¹®ÀÚ¿À» Ãâ·ÂÇÏ·Á¸é 0xffff¸¦ ¸¶½ºÅ©·Î ÁöÁ¤ÇÏ¸é µÈ´Ù. ´ç±ÙÀº »óŶõ¿¡ Ãâ·ÂÇÒ Á¤º¸ Á¶»ç¸¦ À§ÇØ ApiEditÀÇ °¢Á¾ ÇÔ¼ö¸¦ ÀûÀýÈ÷ È£ÃâÇÑ´Ù. °¢ ÆÄÆ®¿¡ ¾î¶² Á¤º¸µéÀÌ ¾î¶»°Ô Ãâ·ÂµÇ´ÂÁö º¸ÀÚ.
ÆÄÆ®0Àº Àμö·Î Àü´ÞµÈ Mes ¹®ÀÚ¿ÀÌ Ãâ·ÂµÇ´Âµ¥ ÇöÀç »óÅ¿¡ ´ëÇÑ µµ¿ò¸»À̳ª ÀÛ¾÷ °á°ú¸¦ Ãâ·ÂÇÒ ¸ñÀûÀ¸·Î »ç¿ëµÈ´Ù. ÆÄÆ®1Àº ÇöÀç ij·µ À§Ä¡¸¦ º¸¿©Áִµ¥ ApiEdit°¡ Á¶»çÇÏ´Â ¸ðµç Á¤º¸´Â Zero BaseÀÌ°í »ç¿ëÀÚ¿¡°Ô º¸¿©Áö´Â ¼ýÀÚ´Â One BaseÀ̹ǷΠÁ¶»çµÈ À§Ä¡°ª¿¡ 1À» ´õÇØ¾ß ÇÑ´Ù.
ÆÄÆ® 2¿¡´Â ¹®¼ÀÇ Å©±â¸¦ ÁÙ´ÜÀ§¿Í ¹ÙÀÌÆ® ´ÜÀ§·Î º¸¿©Áִµ¥ ¹®¼ Å©±â°¡ 10240¹ÙÀÌÆ®¸¦ ³ÑÀ» °æ¿ì ų·Î ¹ÙÀÌÆ® ´ÜÀ§·Î º¸¿©ÁÖµµ·Ï Çß´Ù. ÆÄÆ® 3¿¡´Â ¹®¼ÀÇ ÆíÁý ¿©ºÎ¸¦, ÆÄÆ® 4¿¡´Â ¹®¼ÀÇ Æ÷¸ËÀ» º¸¿©ÁÖ°í ÆÄÆ® 5¿¡´Â µ¤¾î¾²±â ¸ðµåÀÇ ÇöÀç »óŸ¦ º¸¿©ÁØ´Ù.
»óŶõÀÇ Á¤º¸°¡ º¯°æµÉ ¶§´Â È£½ºÆ®°¡ ÅëÁö ¸Þ½ÃÁö¸¦ ¹Þ¾ÒÀ» ¶§Àε¥ Àü´Þ¹ÞÀº ÅëÁö ¸Þ½ÃÁöÀÇ Á¾·ù¿¡ µû¶ó ¼öÁ¤ÇØ¾ß ÇÒ Á¤º¸ÀÇ Á¾·ù(¸¶½ºÅ©)°¡ ´Ù¸£´Ù. ¿¹¸¦ µé¾î AEN_MOVE ¸Þ½ÃÁö¸¦ ¹Þ¾ÒÀ» ¶§´Â 1¹ø ÆÄÆ®ÀÇ Ä³·µ À§Ä¡¸¸ °»½ÅÇÏ¸é µÇ¹Ç·Î ¸¶½ºÅ©·Î 0x2¸¦ Àü´ÞÇÏ¿© ²À ÇÊ¿äÇÑ Á¤º¸¸¸ °»½ÅÇϵµ·Ï Çß´Ù. È°¼º Â÷Àϵ尡 º¯°æµÉ ¶§´Â ¸ðµç Á¤º¸°¡ ÇѲ¨¹ø¿¡ º¯°æµÇ¹Ç·Î ¸¶½ºÅ©·Î 0xffff¸¦ Àü´ÞÇÏ¿© ¸ðµç ÆÄÆ®ÀÇ ÅؽºÆ®¸¦ °»½ÅÇϵµ·Ï ÇÑ´Ù.
LRESULT CALLBACK DGChildProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
....
case WM_COMMAND:
switch (LOWORD(wParam)) {
case 1:
switch (HIWORD(wParam)) {
case AEN_MOVE:
SetStatusText(0x2);
break;
case AEN_CHANGE:
SetStatusText(0x1c);
break;
case AEN_INSMODE:
SetStatusText(0x20);
break;
case AEN_CHGMODI:
SetStatusText(0x8);
break;
}
break;
}
return 0;
case WM_SIZE:
pSi=(SInfo *)GetWindowLong(hWnd,0);
MoveWindow(pSi->Ae.hWnd,0,0,LOWORD(lParam),HIWORD(lParam),TRUE);
break;
case WM_SETFOCUS:
pSi=(SInfo *)GetWindowLong(hWnd,0);
SetFocus(pSi->Ae.hWnd);
SetStatusText(0xffff);
return 0;
»óŶõ¿¡ Á¤º¸°¡ ¾î¶»°Ô Á¶»çµÇ°í Ãâ·ÂµÇ´ÂÁö ¾î·ÆÁö ¾Ê°Ô ºÐ¼®µÉ °ÍÀÌ´Ù. ÀÌ ½ÃÁ¡¿¡¼ °£´ÜÇÑ ÄûÁ Çϳª Ç®¾î º¸ÀÚ. SetStatusText ÇÔ¼ö¿¡¼ hActive°¡ NULLÀÎ °ÍÀº ¿Ö Á¡°ËÇØ¾ß ÇÒ±î? ÀÌ ÇÔ¼ö´Â DGChildProc¿¡¼¸¸ È£ÃâÇϴµ¥ DGChildProcÀÌ ½ÇÇàÁßÀ̶ó´Â °ÍÀº ÀÌ¹Ì hActive°¡ ÀÖ´Ù´Â ¶æÀ̹ǷΠ±»ÀÌ È°¼ºÃ¢ÀÌ ÀÖ´ÂÁö¸¦ Á¡°ËÇÒ ÇÊ¿ä´Â ¾øÁö ¾Ê°Ú´Â°¡?
±×·² °Í °°Áö¸¸ ¾ÆÁÖ Æ¯¼öÇÑ °æ¿ì Áï, Â÷Àϵ尡 »ý¼ºµÇ´Â ½ÃÁ¡¿¡¼ ÅëÁö ¸Þ½ÃÁö°¡ Àü´ÞµÉ ¶§°¡ ¹®Á¦°¡ µÈ´Ù. ¾ÆÁ÷ È°¼ºÃ¢ÀÌ ´ú ¸¸µé¾îÁø »óÅ¿¡¼ ÀÌ ÇÔ¼ö°¡ È£ÃâµÉ ¼öµµ Àִµ¥ ±×´ë·Î µÎ¸é Á״´Ù. SetStatusText ÇÔ¼ö¿¡¼ hActive¸¦ Á¡°ËÇÏ´Â ¸ñÀûÀº ÀÌ Ã¢ÀÌ ¿ÏÀüÈ÷ ´Ù ¸¸µé¾îÁø °ÍÀÎÁö¸¦ Á¡°ËÇÏ´Â °ÍÀÌ´Ù.