¸î °¡Áö ÃÖÀûÈ¿¡ ÀÇÇØ ½ÇÇà¼Óµµ´Â ´ëÆøÀûÀ¸·Î Çâ»óÀÌ µÇ¾úÁö¸¸ ¾ÆÁ÷ ÀÌ ÇÁ·Î±×·¥Àº Å« ¹®Á¦Á¡À» Çϳª °¡Áö°í ÀÖ´Ù. ±ÛÀÚ¸¦ »ðÀÔ, »èÁ¦ÇÒ ¶§¸¶´Ù ȸé Àüü¸¦ ´Ù½Ã ±×¸®±â ¶§¹®¿¡ È¸é ±ô¹ÚÀÓÀÌ ¹«Ã´ ½ÉÇÏ´Ù´Â Á¡ÀÌ´Ù. ÄÄÇ»ÅÍ°¡ À¢¸¸Å ºü¸£¸é ÀÌ ±ô¹ÚÀÓÀÌ ´«¿¡ Àß ¾È º¸ÀÏ ¼öµµ Àִµ¥ ÃÖ´ëÈ ½ÃŲ »óÅ¿¡¼ ÇÑ ÆäÀÌÁö °¡µæ ±ÛÀÚ¸¦ ä¿öº¸°í ¹®ÀåÀ» ÀÔ·ÂÇغ¸¸é ±ô¹ÚÀÓÀ» ´À³¥ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
¸¸¾à ±×·¡µµ ±ô¹ÚÀÓÀ» ´À³¢±â ¾î·Æ´Ù¸é ¸¶¿ì½º¸¦ µå·¡±×ÇÏ¿© ¼±ÅÃÀ» Çغ¸¾Æ¶ó. ¼±Åà »óÅ°¡ ¹Ù²ð ¶§µµ ȸéÀ» ´Ù½Ã ±×¸®´Âµ¥ À̶§´Â ÄÄÇ»ÅÍ°¡ ¾Æ¹«¸® »¡¶óµµ ¼±Åÿµ¿ªÀÌ ±ô¹Ú°Å¸®´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù. ´À¸° ÄÄÇ»ÅÍ¿¡¼´Â °ÅÀÇ ¸ø ºÁÁÙ Á¤µµÀÇ ¼öÁØÀ̸ç ÀÌ·± ±ô¹Ú°Å¸²Àº ´«À» ÇÇ°ïÇÏ°Ô ¸¸µé°í ÇÁ·Î±×·¥ÀÇ ÁúÀ» Çö°ÝÇÏ°Ô ¶³¾î¶ß¸°´Ù.
±×·¸´Ù¸é ±ô¹ÚÀÓÀÌ ¹ß»ýÇÏ´Â ÀÌÀ¯´Â ¹»±î? ¹®¼ ³»¿ëÀÌ ¹Ù²î¸é º¯°æµÈ ºÎºÐÀ» Áö¿ì°í ´Ù½Ã ±×·Á¾ß Çϴµ¥ À̶§ º¯°æµÈ ºÎºÐÀ» Áö¿üÀ» ¶§ÀÇ Èò ¹ÙÅÁÀÌ ´Ù½Ã ±×·ÁÁú ¶§±îÁö ´«¿¡ º¸À̱⠶§¹®¿¡ ȸéÀÌ ±ô¹Ú°Å¸®´Â °ÍÀÌ´Ù. ±×·¸´Ù¸é ¹®¼°¡ º¯°æµÇ¾îµµ Áö¿ìÁö ¸»°í ±×³É ±×¸®±â¸¸ ÇÏ¸é ¾î¶»°Ô µÉ±î? ÀÌ·¸°Ô Çϱâ À§ÇØ ¹è°æ ºê·¯½Ã¸¦ ¾ø¾Ö º¸ÀÚ.
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
,LPSTR lpszCmdParam,int nCmdShow)
{
....
WndClass.hbrBackground=NULL;
À©µµ¿ì Ŭ·¡½ºÀÇ ¹è°æ ºê·¯½Ã¸¦ NULL·Î ¹Ù²Ù¸é ÀÛ¾÷¿µ¿ªÀ» Áö¿ï ºê·¯½Ã°¡ ¾ø±â ¶§¹®¿¡ WM_ERASEBKGND ¸Þ½ÃÁö°¡ 󸮵ÇÁö ¾Ê´Â´Ù. Áï, ¹è°æ ºê·¯½Ã¸¦ ÁöÁ¤ÇÏÁö ¾Ê´Â´Ù´Â °ÍÀº ¡®ÀÛ¾÷¿µ¿ªÀ» ³»°¡ ¾Ë¾Æ¼ Áö¿ï Å×´Ï ³Ê´Â °¡¸¸È÷ À־¶ó´Â ¸í·ÉÀÌ´Ù. ±×·¡¼ ÀÛ¾÷¿µ¿ªÀ» ¹«È¿ÈÇصµ ȸéÀ» Áö¿ìÁö ¾Ê´Â´Ù. ÀÌ·¸°Ô ÇÑ ÈÄ ½ÇÇàÇغ¸ÀÚ.
°á°ú´Â Á¤¸» ²ûÁ÷ÇÏ´Ù. ¹®ÀÚ´Â Á¦´ë·Î Ãâ·ÂµÇÁö¸¸ ¹è°æÀ» Áö¿ìÁö ¾ÊÀ¸¹Ç·Î ¹®ÀÚ°¡ ¾ø´Â ÁÙ°£ »çÀÌ´Â µÚÂÊ ¹è°æÀÌ ±×´ë·Î º¸ÀδÙ. ÀÌ »óÅ¿¡¼ »õ·Î¿î ¹®ÀÚ¸¦ ÀÔ·ÂÇÏ¸é ¹è°æÀ» Áö¿ìÁö ¸øÇÏ´õ¶óµµ ÀÔ·ÂµÈ ¹®ÀÚ¸¦ º¼ ¼ö´Â ÀÖ´Ù. ÇÏÁö¸¸ »èÁ¦ÇÒ ¶§´Â »ç¶óÁ®¾ß ÇÒ ¹®ÀÚ°¡ ±× ÀÚ¸®¿¡ ±×´ë·Î ³²¾Æ ÀÖ°Ô µÈ´Ù. ÀÌ ½ÇÇè¿¡¼ ¾Ë ¼ö ÀÖµíÀÌ »õ·Î Ãâ·ÂµÇ´Â ³»¿ëÀÌ ±âÁ¸ ȸéÀ» ¿ÏÀüÈ÷ µ¤¾î¹ö¸®Áö ¾Ê´Â ÇÑ ±âÁ¸ÀÇ È¸éÀ» Áö¿ìÁö ¾Ê°í »õ ȸéÀ» Ãâ·ÂÇÒ ¼ö´Â ¾ø´Ù.
ÇÏÁö¸¸ È¸é ±ô¹ÚÀÓÀ» ÃÖ¼ÒÈÇÒ ¼ö ÀÖ´Â ¿©·¯ °¡Áö ¹æ¹ýµéÀÌ ÀÖ´Ù. ¿ì¼± Á¦ÀÏ °£´ÜÇÑ ¹æ¹ýÀº ¹«È¿¿µ¿ªÀ» °¡±ÞÀû Á¼°Ô ¼³Á¤ÇÔÀ¸·Î½á ÃÖ´ëÇÑ »¡¸® ±×¸®µµ·Ï ÇÏ´Â °ÍÀÌ´Ù. ±ô¹ÚÀ̱â´Â ÇÏÁö¸¸ ¿ö³« »¡¸® ±×¸®±â ¶§¹®¿¡ ´«¿¡ °ÅÀÇ ¾È º¸ÀÌ°Ô ¸¸µå´Â °ÍÀ̸ç Çö½ÇÀûÀ¸·Î ÃæºÐÈ÷ °¡´ÉÇÑ ¹æ¹ýÀÌ´Ù. ±×·¯³ª ÀÌ ¹æ¹ýÀº ±ô¹ÚÀÓÀ» ÃÖ¼ÒÈÇÏ´Â °ÍÀÌÁö ±Ùº»ÀûÀ¸·Î ¾ø¾Ö´Â ¹æ¹ýÀº ¾Æ´Ï´Ù. ¹®¼ Àüü°¡ ÇѲ¨¹ø¿¡ ¹Ù²î°Ô µÇ¸é ¾î¿ ¼ö ¾øÀÌ ÀÛ¾÷¿µ¿ª Àüü°¡ ¹«È¿ÈµÇ°í µû¶ó¼ ±ô¹ÚÀÓÀÌ ¹ß»ýÇÑ´Ù.
±ô¹ÚÀÓÀ» ÇØ°áÇÒ ¼ö ÀÖ´Â °¡Àå ¿Ïº®ÇÑ ¹æ¹ýÀº ¸Þ¸ð¸® ºñÆ®¸ÊÀ» »ç¿ëÇÏ´Â ´õºí ¹öÆÛ¸µÀÌ´Ù. ¸Þ¸ð¸®»ó¿¡¼ Ãâ·ÂÇÒ ³»¿ëÀ» ¹Ì¸® ±×·Á ³õ°í BitBltÀ¸·Î °í¼Ó Àü¼ÛÇÔÀ¸·Î½á ¼ø½Ä°£¿¡ ȸéÀ» °»½ÅÇÏ´Â ¹æ¹ýÀÌ´Ù. CD-DOMÀÇ Doc µð·ºÅ丮¿¡ ´õºí ¹öÆÛ¸µ¿¡ ´ëÇÑ ¹®¼¿Í ¿¹Á¦°¡ ÀÛ¼ºµÇ¾î ÀÖÀ¸¹Ç·Î ÂüÁ¶Çϱ⠹ٶõ´Ù. È¸é ±ô¹ÚÀÓ¾øÀÌ °øÀ̳ª ¹®ÀÚ¸¦ ºÎµå·´°Ô À̵¿½ÃÅ°´Â ¹æ¹ý¿¡ ´ëÇØ ¼³¸íÇÏ°í ÀÖ´Ù.
¸Þ¸ð¸®ÀÇ ºñÆ®¸Ê¿¡ Ãâ·ÂÇÏ´Â °úÁ¤¿¡¼µµ ¹ÙÅÁ»öÀ¸·Î Áö¿ì°í ±× À§¿¡ ±ÛÀÚ¸¦ Ãâ·ÂÇÏ´Â ÀýÂ÷°¡ ÇÊ¿äÇÏÁö¸¸ ÀÌ Ã³¸®´Â ȸé»óÀ¸·Î º¸ÀÌÁö ¾Ê±â ¶§¹®¿¡ ¹®Á¦°¡ µÇÁö ¾Ê´Â´Ù. BitBltÀ¸·Î Ãâ·ÂÇÒ ¶§µµ ±âÁ¸ Ãâ·Â ³»¿ëÀ» Áö¿ìÁö ¾Ê°í ±× À§¿¡ ¹Ù·Î µ¤¾î¾²±â ¶§¹®¿¡ ÀüÇô ±ô¹Ú°Å¸®Áö ¾Ê´Â´Ù. ´õºí ¹öÆÛ¸µ¿¡ »ç¿ëÇÒ ºñÆ®¸ÊÀ» Àü¿ªº¯¼ö·Î ¼±¾ðÇÏ°í OnCreate¿¡¼ ÀÌ º¯¼ö¸¦ NULL·Î ÃʱâÈÇÑ´Ù.
HBITMAP hBit;
BOOL OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct)
{
....
hBit=NULL;
OnPaint¿¡¼´Â ȸéÀ¸·Î ¹Ù·Î Ãâ·ÂÇÏÁö ¾Ê°í ÀÌ ºñÆ®¸Ê¿¡ ÀÛ¾÷¿µ¿ªÀ» ¸ÕÀú ±×¸° ÈÄ ºñÆ®¸ÊÀ» ȸéÀ¸·Î Àü¼ÛÇÑ´Ù. ´ÙÀ½°ú °°ÀÌ Äڵ带 ¼öÁ¤Çغ¸ÀÚ.
void OnPaint(HWND hWnd)
{
HDC hdc, hMemDC;
PAINTSTRUCT ps;
int l;
RECT crt;
int s,e;
HBRUSH hBrush;
HBITMAP OldBitmap;
hdc=BeginPaint(hWnd,&ps);
GetClientRect(hWnd,&crt);
s=yPos/LineHeight;
e=s+crt.bottom/LineHeight;
hMemDC=CreateCompatibleDC(hdc);
if (hBit == NULL) {
hBit=CreateCompatibleBitmap(hdc,crt.right,crt.bottom);
}
OldBitmap=(HBITMAP)SelectObject(hMemDC,hBit);
hBrush=CreateSolidBrush(GetSysColor(COLOR_WINDOW));
FillRect(hMemDC,&crt,hBrush);
for (l=s;l<=e;l++) {
if (DrawLine(hMemDC,l) == 0)
break;
}
BitBlt(hdc,0,0,crt.right,crt.bottom,hMemDC,0,0,SRCCOPY);
DeleteObject(hBrush);
SelectObject(hMemDC,OldBitmap);
DeleteDC(hMemDC);
EndPaint(hWnd,&ps);
}
ÀÛ¾÷¿µ¿ªÀÇ Å©±â¿Í µ¿ÀÏÇÑ Å©±âÀÇ ºñÆ®¸ÊÀ» ¸¸µé°í ¹è°æ»öÀ¸·Î ä¿î ÈÄ ÀÌ ºñÆ®¸Ê¿¡ ¹®¼ ³»¿ëÀ» ¸ÕÀú Ãâ·ÂÇÏ¿´´Ù. Ãâ·ÂÄÚµå´Â ȸé DC ´ë½Å ¸Þ¸ð¸® DC¸¦ »ç¿ëÇÑ´Ù´Â °Í¸¸ »©°í ¹Ù²ï °ÍÀÌ ¾ø´Ù. ºñÆ®¸Ê¿¡ ¹®¼ ³»¿ëÀ» ´Ù Ãâ·ÂÇÑ ÈÄ È¸éÀ¸·Î °í¼Ó Àü¼ÛÇϸé ȸéÀÌ ÀüÇô ±ô¹Ú°Å¸®Áö ¾ÊÀ¸¸ç °¨ÂÊ°°ÀÌ Ãâ·ÂµÉ °ÍÀÌ´Ù.
Ãâ·ÂÀ» ¸¶Ä£ ÈÄ ¸Þ¸ð¸® DC¸¸ ÇØÁ¦ÇÏ°í ºñÆ®¸ÊÀº ±×´ë·Î µÐ´Ù. ¸Å¹ø ±×¸®±â¸¦ ÇÒ ¶§¸¶´Ù ºñÆ®¸ÊÀ» »ý¼ºÇÒ ÇÊ¿ä´Â ¾ø±â ¶§¹®ÀÌ´Ù. ´ÙÀ½ OnPaint¸¦ ó¸®ÇÒ ¶§ ¾îÂ÷ÇÇ ºñÆ®¸Ê Àü ¿µ¿ªÀ» ¹è°æ»öÀ¸·Î ä¿î ÈÄ ¹®¼¸¦ Ãâ·ÂÇϹǷΠºñÆ®¸ÊÀº °è¼Ó »ç¿ëÇصµ »ó°ü¾ø´Ù. ºñÆ®¸ÊÀ» ´Ù½Ã »ý¼ºÇØ¾ß ÇÒ ½ÃÁ¡Àº ÀÛ¾÷¿µ¿ªÀÇ Å©±â°¡ ¹Ù²ð ¶§Àε¥ ºñÆ®¸Ê Å©±â´Â ÀÛ¾÷¿µ¿ªÀÇ Å©±â¿Í °°¾Æ¾ß Çϱ⠶§¹®ÀÌ´Ù. OnSize¿¡¼ ÀÌ Ã³¸®¸¦ À§ÇØ ºñÆ®¸ÊÀ» Á¦°ÅÇÑ´Ù.
void OnSize(HWND hWnd, UINT state, int cx, int cy)
{
if (state != SIZE_MINIMIZED) {
if (nWrap) {
UpdateLineInfo();
}
UpdateScrollInfo();
if (GetFocus()==hWnd) {
SetCaret();
}
if (hBit) {
DeleteObject(hBit);
hBit=NULL;
}
}
}
OnSize¿¡¼ º¯°æµÈ ÀÛ¾÷¿µ¿ª Å©±â¿¡ ¸Â°Ô ºñÆ®¸ÊÀ» ´Ù½Ã »ý¼ºÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ´Ü¼øÈ÷ ºñÆ®¸ÊÀ» Æı«Çϱ⸸ Çϸç hBit¸¦ NULL·Î ¸¸µç´Ù. ÀÌ·¸°Ô ÇسõÀ¸¸é OnPaint¿¡¼ ÀÛ¾÷¿µ¿ª Å©±â¿¡ ¸Â°Ô ºñÆ®¸ÊÀ» ´Ù½Ã »ý¼ºÇÒ °ÍÀÌ´Ù. OnSize´Â ºñÆ®¸ÊÀ» ´Ù½Ã ¸¸µå´Â °ÍÀÌ ¾Æ´Ï¶ó ¹«È¿È½ÃÅ´À¸·Î½á OnPaint°¡ ºñÆ®¸ÊÀ» Àç»ý¼ºÇϵµ·Ï Çϱ⸸ ÇÑ´Ù. ÀÌ·¸°Ô »ç¿ëÇÑ ºñÆ®¸ÊÀº ÇÁ·Î±×·¥ÀÌ Á¾·áµÉ ¶§ Æı«ÇØ¾ß ÇϹǷΠOnDestroy¿¡µµ µ¿ÀÏÇÑ Äڵ尡 ÇÊ¿äÇÏ´Ù.
void OnDestroy(HWND hWnd)
{
PostQuitMessage(0);
free(buf);
free(arHanWidth);
free(pLine);
if (hBit) {
DeleteObject(hBit);
hBit=NULL;
}
}
ÀÌÁ¦ ½ÇÇàÇغ¸¸é ¾î¶² µ¿ÀÛÀ» ÇÏ´õ¶óµµ ȸéÀÌ ±ô¹Ú°Å¸®Áö ¾Ê´Â´Ù. ¸Þ¸ð¸®»óÀÇ ºñÆ®¸Ê¿¡ ¹Ì¸® ±×¸° ÈÄ ÀÏ°ý Àü¼ÛÇϱ⠶§¹®ÀÌ´Ù. ÇÏÁö¸¸ ÀÌ ¹æ¹ýÀº ȸé Àüü¸¦ ºñÆ®¸ÊÀ¸·Î ÀÛ¼ºÇϱ⠶§¹®¿¡ ȸéÀÌ Ä¿Áö¸é ´À·ÁÁö´Â ´ÜÁ¡ÀÌ ÀÖ´Ù. 1600*1200 °°Àº °íÇØ»óµµ ¸ð´ÏÅÍ¿¡¼ ȸéÀ» ÃÖ´ëÈÇسõ°í ÆíÁýÇغ¸¸é È®½ÇÈ÷ ´À¸®´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. ¸Þ¸ð¸® ºñÆ®¸ÊÀÇ Å©±â°¡ Ä¿Áö¸é ¼Óµµ°¡ ´À·ÁÁö±âµµ ÇÏÁö¸¸ ´Ü ÇÑ ÁÙÀÌ ¹Ù²î¾îµµ Àüü ȸéÀ» ´Ù ±×·Á¾ß ÇϹǷΠÃÖÀûÈ¿¡ ´Ù¼Ò ºÒ¸®ÇÏ´Ù. ±×·¡¼ Á» ´Ù¸¥ ¹æ¹ýÀ» ã¾Æ º¸¾Æ¾ß ÇÑ´Ù.