<´Ù¸¥ ÇÁ·ÎÁ§Æ®·ÎºÎÅÍ ¸®¼Ò½º º¹»ç>

´Ù¸¥ ÇÁ·ÎÁ§Æ®¿¡ ÀÖ´Â ¸®¼Ò½º¸¦ ÇöÀç ÇÁ·ÎÁ§Æ®¿¡ º¹»çÇÏ°í ½Í½À´Ï´Ù. ¸®¼Ò½º¸¦ µå·¡±× ¾Ø µå·ÓÀ̳ª ÀÓÆ÷Æ®·Î ³ÖÀ» ¼ö ÀÖ´ÂÁö¿ä.

¹°·Ð °¡´ÉÇÕ´Ï´Ù. ´Ù¸¥ ÇÁ·ÎÁ§Æ®·ÎºÎÅÍ ¸®¼Ò½º¸£ »ç¿ëÇÏ´Â ¹æ¹ý¿¡´Â ¸®¼Ò½º¸¦ ÀÓÆ÷Æ®(Import)ÇÏ´Â ¹æ¹ý°ú ´Ù¸¥ ÇÁ·ÎÁ§Æ®ÀÇ ¸®¼Ò½º ½ºÅ©¸³Æ® ÆÄÀÏ(.rc)¿¡¼­ Á÷Á¢ ¸®¼Ò½º¸¦ º¹»çÇØ ¿À´Â µÎ °¡Áö ¹æ¹ýÀÌ ÀÖ½À´Ï´Ù.

 ¸®¼Ò½º¸¦ ÀÓÆ÷Æ®ÇÏ·Á¸é ÀÓÆ÷Æ® ¸Þ´º¿¡¼­ 'Insert->Resource' ¸¦ ¼±ÅÃÇÑ ÈÄ 'Insert Resource'¶õ ´ÙÀ̾ó·Î±×°¡ ³ª¿À¸é ¸®¼Ò½º ŸÀÔÁß¿¡ Çϳª¸¦ ´õºíŬ¸¯ÇÕ´Ï´Ù. ±×·¯¸é »õ·Î¿î ¸®¼Ò½º°¡ Ãß°¡µË´Ï´Ù. ±âÁ¸ ÇÁ·ÎÁ§Æ®¿¡¼­ ºñÆ®¸Ê(*.bmp, *.dib) ÆÄÀÏ, ¾ÆÀÌÄÜ ÆÄÀÏ(*.ico), Ä¿¼­ ÆÄÀÏ(*.cur), ¿þÀ̺ê ÆÄÀÏ(*.wav), ºñÁÖ¾ó º£ÀÌÁ÷ Æû ÇüÅÂÀÇ ¸®¼Ò½º¸¦ º¹»çÇÏ·Á¸é 'Import' ¹öÆ°À» ´©¸£¸é °£´ÜÈ÷ Ãß°¡ÇÒ ¼ö ÀÖ½À´Ï´Ù.

 ´Ù¸¥ ÇÁ·ÎÁ§Æ®ÀÇ ¸®¼Ò½º ½ºÅ©¸³Æ®·ÎºÎÅÍ Á÷Á¢ º¹»çÇÏ´Â °úÁ¤Àº ¾ÆÁÖ °£´ÜÇÕ´Ï´Ù. ¿ì¼± 'File->Open'À» ¼±ÅÃÇÏ°í, ¿øº»ÀÌ µÇ´Â ¸®¼Ò½º ½ºÅ©¸³Æ® ÆÄÀÏ(*.rc) À» ¿¬ÈÄ À©µµ¿ì Ž»ö±â¿¡¼­ º¹»çÇϵíÀÌ µå·¡±× ¾Ø µå·ÓÀ¸·Î ÇÁ·ÎÁ§Æ® â(Project Workspace)¿¡ ¿Å°Ü ÁÖ¸é µË´Ï´Ù. ´Ü <Ctrl>Å°¸¦ ´©¸£Áö ¾Ê°í ¿Å±â¸é, ÀÌÀü ÇÁ·ÎÁ§Æ®ÀÇ ¸®¼Ò½º°¡ »ç¶óÁö´Â °Í¿¡ À¯ÀÇÇØ¾ß ÇÕ´Ï´Ù. Resource.h ÆÄÀÏÀÇ ID°ü¸®´Â µðº§·ÓÆÛ ½ºÆ©µð¿À°¡ ³»ºÎÀûÀ¸·Î ÇØ°áÇØ ÁֹǷΠ½Å°æ¾²Áö ¾Ê¾Æµµ µË´Ï´Ù.

 

<¹ÙÅÁ È­¸é¿¡ ±×¸² ±×¸®±â>

¹ÙÅÁÈ­¸é¿¡ ±×¸²À» ±×¸®·Á ÇÕ´Ï´Ù. ±×¸®°í ÀÏ¹Ý À©µµ¿ì¿¡ ±×¸®´Â °Í°úÀÇ Â÷ÀÌÁ¡µµ ¾Ë°í ½Í½À´Ï´Ù.

¿ì¼± ¹ÙÅÁÈ­¸éµµ ÇϳªÀÇ À©µµ¿ìÀ̹ǷΠ¹ÙÅÁÈ­¸éÀÇ À©µµ¿ì ÇÚµéÀ» ¾Ë¾Æ¾ß ÇÕ´Ï´Ù. Áï ÀϹÝÀ©µµ¿ì¿¡ ±×¸®´Â °Í°ú ÀüÇô ´Ù¸¦°Ô ¾ø½À´Ï´Ù .¹ÙÅÁ È£¸é¿¡ Á÷Á¢ ±×¸²À» ±×¸®°Ô µÇ¸é È­¸é¿¡ ¶° ÀÖ´Â ¸ðµç À©µµ¿ì¿¡ °ãÃÄÁ®¼­ ±×·ÁÁö¹Ç·Î ¹ÙÅÁ È­¸é¶Ç´Â ÀÏ¹Ý À©µµ¿ì¿¡¸¸ ±×¸®°í ½Í´Ù¸é º°µµÀÇ ÀÛ¾÷ÀÌ ÇÊ¿äÇÕ´Ï´Ù.

 ¿©±â¿¡¼­´Â È­¸é ¿ÞÂÊ À§ºÎÅÍ ºø±ÝÀÌ ±×¾îÁö´Â ¿¹·Î ÇÊ¿äÇÑ ºÎºÐ¸¸ º¸À̱â À§ÇØ À©µµ¿ì¸¦ ¸¸µéÁö ¾Ê¾Ò½À´Ï´Ù.

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpszArgs, int nWinMode)
{
        HWND hwnd = GetDesktopWindow();
        // ¹ÙÅÁÈ­¸éÀÇ À©µµ¿ì ÇÚµé ¾ò±â
        HDC hdc = GetWindowDC(hwnd);
        // ¹ÙÅÁÈ­¸éÀÇ DC ÇÚµé ¾ò±â
        // GetWindowDC¸¦ ¾´´Ù.
        
        HPEN hPen;
        register int i;
        for(i=0; i<=255; i++) {
                hPen = CreatePen(PS_SOLID, 0, RGB(i, i, i));
                // ¿øÇÏ´Â »öÀ¸·Î Ææ ¸¸µé±â
                HGDIOBJ hOldPen = SelectObject(hdc, hPen);
                // ÆæÀ» ÇöÀç DC¿¡¼­ ¼±ÅÃ
                // Ææ ÇÚµé º¸°ü
                MoveToEx(hdc, i*3, 0, NULL);
                LineTo(hdc, 0, i*3);
                // ¼±ÅÃµÈ ÆæÀ¸·Î ¼±À» ±ß´Â´Ù.
                SelectObject(hdc, hOldPen);
                // ¿ø·¡´ë·Î Ææ µ¹·Á³õ±â
                DeleteObject(hPen);
                // ÇÊ¿ä¾ø´Â Ææ Á¦°Å
        }
        ReleaseDC(hwnd, hdc);
        // DC¸¦ ¹Ý³³ÇÏ°í ±×¸®±â ÀÛ¾÷À» ¸¶Ä£´Ù.
}

 

<ij·µÀÇ À§Ä¡¸¦ ¾Ë·Á¸é>

À©µµ¿ì ¸Þ¸ðÀå¿¡¼­ ÇöÀç ij·µÀ¸·ÎºÎÅÍ ºí·°À» ¼³Á¤ÇÑ ÈÄ Å¬¸³º¸µå·Î º¹»çÇÒ ¼ö ÀÖ°Ô Ä³·µÀ§Ä¡¸¦ ±¸ÇÏ´Â ÇÔ¼ö¸¦ ¾Ë°í ½Í½À´Ï´Ù.

GetSel()Àº ÇöÀç ¿¡µðÅÍ ³»¿¡¼­ ij·µÀÇ À§Ä¡(¿­°ú Çà ¶Ç´Â À妽º)¸¦ ±¸ÇÏ´Â ÇÔ¼ö·Î ¿¡µðÅÍ¿¡ ¼±ÅÃµÈ ºÎºÐÀÌ ¾ø´õ¶óµµ ÀÌ ÇÔ¼ö¸¦ ¾µ ¼ö ÀÖ½À´Ï´Ù. ÀÌ °æ¿ì´Â ¼±Åà ºÎºÐÀÇ ½ÃÀÛ À§Ä¡¿Í ³¡À§Ä¡°¡ °°À¸¹Ç·Î ºí·°À» ¼³Á¤Çϸé ÇöÀç ij·µÀÇ À§Ä¡¸¦ À妽º·Î »ï¾Æ ¶óÀÎ À§Ä¡·Î ¹Ù²ã ÁÝ´Ï´Ù. ÀÌ °æ¿ì »ç¿ëÇÏ´Â ÇÔ¼ö°¡ LineFromChar()ÀÔ´Ï´Ù. ±×¸®°í ¸î ¹ø° Ä÷³¿¡ Àִ°¡´Â ij·µÀ§Ä¡¿¡¼­ LineIndex() ·Î ¾òÀº °ªÀ» »©´Â ½ÄÀ¸·Î µÎ ÇÔ¼ö¸¦ Á¶ÇÕÇÏ¸é ¾Ë¾Æ³¾ ¼ö ÀÖ½À´Ï´Ù.

 

<OnPrint()·Î ÇÁ¸°Æ® ±â´ÉÀ»>

È­¸é¿¡ ±×·ÁÁø »ç°¢ÇüÀ» ƯÁ¤ ¹öÆ°À» ´­·¯ ÇÁ¸°Æ®·Î Ãâ·ÂÇÏ°í ½Í½À´Ï´Ù.

»ç°¢ÇüÀ» Ãâ·ÂÇÏ´Â Á¤µµ¶ó¸é ¾ÖÇø®ÄÉÀÌ¼Ç À§Àúµå°¡ »ý¼ºÇØ ÁÖ´Â ÇÁ¸°Æ® ¼Ò½º·Î ÃæºÐÇÕ´Ï´Ù. óÀ½ ¾ÖÇø®ÄÉÀ̼ÇÀ» ¸¸µé ¶§ ÇÁ¸°Æ® ±â´ÉÀ» Ãß°¡Çϸé CView¿¡ OnPrint ÇÔ¼ö°¡ »ý±é´Ï´Ù. ÀÌ ÇÔ¼ö´Â DC¸¦ OnDraw() ·Î ³Ñ°ÜÁִµ¥, ¿©±â¼­ OnDraw() ´Â ÁÖ¾îÁø DC¸¦ È­¸éÀ̶ó »ý°¢ÇÏ°í ±×¸®°Ô µË´Ï´Ù. ±×¸®°í ¹öÆ°À» ´©¸£¸é ¹ß»ýÇÏ´Â ¹öÆ° Ŭ¸¯ À̺¥Æ®¿¡ SendMessage(WM_COMMAND, ID_FILE_PRINT); ¶Ç´Â SendMessage(WM_COMMAND, ID_FILE_PRINT_PREVIEW);¸¦ µ¡ºÙÀ̸é ÆÄÀÏ¿¡¼­ ÇÁ¸°Æ®·Î º¸³¾ ¼ö ÀÖ½À´Ï´Ù.

 Âü°í·Î ¿©·¯ ÆäÀÌÁöÀÇ µµÅ¥¸ÕÆ®¶óµç°¡ ȤÀº Å« È­¸éÀ» ¿©·¯ ÀåÀ¸·Î ³ª´² Âï´Â º¹ÀâÇÑ ÇÁ¸°Æ®¸¦ ¿øÇÑ´Ù¸é OnPrint() ÀÇ µµ¿ò¸»À» ÂüÁ¶Çϱ⠹ٶø´Ï´Ù.

 

<´Ù¸¥ ¾ÖÇø®ÄÉÀÌ¼Ç Á¦¾î ¹æ¹ý>

ºñÁÖ¾ó C++/MFC 4.0 À¸·Î ÀÛ¼ºÇÑ ÇÁ·Î±×·¥À» Á¦°¡ § ÇÁ·Î±×·¥¿¡¼­ ½ÇÇàÇÏ°í, ÇÊ¿ä¿¡ µû¶ó¼­´Â Á¦¾îÇÏ°í ½Í½À´Ï´Ù. ¸»ÇÏÀÚ¸é IPC(InterProcess Communication)°¡ µÇµµ·Ï ÇÏ´Â °ÅÁÒ. ¸¶Ä¡ À©µµ¿ì ¸Å´ÏÀú°¡ ƯÁ¤ ÇÁ·Î±×·¥À» Á×ÀÏ ¼ö ÀÖ´Â °Íó·³ Á¦ ÇÁ·Î±×·¥¿¡¼­ ´Ù¸¥ ÇÁ·Î±×·¥À» ¼Õ½±°Ô Á¦¾îÇÏ°í ½Í½À´Ï´Ù.

CreateProcess µµ¿ò¸»À» º¸¸é ¾Ë°ÚÁö¸¸ ¼¼ºÎ »çÇ×À» Á¶¸ñÁ¶¸ñ ÁöÁ¤ÇØ ÇÁ·Î¼¼½º¸¦ ½ÃÀÛÇÒ ¼ö ÀÖÀ¸¹Ç·Î ´Ù¸¥ ¾ÖÇø®ÄÉÀ̼ÇÀ» Á¦¾îÇϴµ¥ ¹®Á¦°¡ ¾øÀ» °ÍÀÔ´Ï´Ù. ¹°·Ð Á¦¾îÇÒ ÇÊ¿ä°¡ ¾ø´Â Ç׸ñÀº µðÆúÆ®·Î ÁÖ¸é µË´Ï´Ù.

 Âü°í·Î ÀÌ ÇÔ¼öÀÇ 10¹ø° ÀμöÀÎ lpProcessInformation¿¡´Â ÀÌ ÇÁ·Î¼¼½ºÀÇ ½ÃÀÛ Á¤º¸°¡ µé¾îÀִµ¥, ¿©±â¿¡ ½ÃÀÛ ÇÁ·Î¼¼½º ÇÚµé°ú ¸ÞÀÎ ¾²·¹µå ÇÚµéÀÌ ´ã°ÜÁ® ¸®Åϵ˴ϴÙ. Âü°í·Î ´ÙÀ½ SuspendThread()¿Í ResumeThread()¸¦ »ç¿ëÇÏ¸é ¸ÞÀÎ ¾²·¹µå¸¦ Àá±ñ ¸ØÃâ ¼öµµ ÀÖ°í, TerminateThread()·Î ÇÁ·Î¼¼½ºÀÇ ¸ðµç ¾²·¹µå¸¦ Á¾·áÇÏ´Â µî ´Ù¸¥ ¾ÖÇø®ÄÉÀ̼ÇÀ» ½±°Ô Á¦¾îÇÒ ¼ö ÀÖ½À´Ï´Ù.

 

<ÄÁÆ®·ÑÀ» »ç¿ëÇÒ ¼ö ¾ø°Ô ó¸®ÇÏ·Á¸é>

Æûºä¿¡ ÀÖ´Â ¶óµð¿À ¹öÆ°À» ¼±ÅÃÇÒ °æ¿ì È­¸éÀÇ ´Ù¸¥ ÄÁÆ®·Ñ Áß ÀϺθ¦ ¿ÏÀüÈ÷ ±×·¹ÀÌ(gray)·Î ó¸®ÇÏ°í ½Í½À´Ï´Ù. Áï ¿¡µðÆ® ÄÁÆ®·Ñ ÀÔ·ÂÀ̳ª ¶óµð¿À ¹öÆ°À» üũÇÏÁö ¸øÇÏ°Ô ÇÏ´Â ½ÄÀ¸·Î ÄÁÆ®·Ñ¿¡ Á¢±ÙÇÒ ¼ö ¾øµµ·Ï ÇÏ°íÀÚ ÇÕ´Ï´Ù.

¾î¶² ¶óµð¿À ¹öÆ°À» ¼±ÅÃÇßÀ» °æ¿ì¿¡ ƯÁ¤ ÄÁÆ®·ÑÀ» ¾µ ¼ö ¾ø°Ô ¸¸µå´Â ÀÏÀº »ý°¢º¸´Ù ½±½À´Ï´Ù. DDX(Dialog Data eXchange) ¸ÞÄ«´ÏÁòÀ» ÀÌ¿ëÇؼ­ ÄÁÆ®·Ñ°ú ¸ÊÇεǴ º¯¼ö¸¦ ÀÌ¿ëÇϰųª ȤÀº GetDlgItem()¸¦ »ç¿ëÇØ ÄÁÆ®·ÑÀÇ Æ÷ÀÎÅ͸¦ ¾òÀº ÈÄ ¸â¹ö ÇÔ¼ö EnableWindow(BOOL)·Î ÇØ°áÇÏ¸é µË´Ï´Ù.

 

<ÄÁÆ®·Ñ Å©±â¸¦ ºä¿¡ ¸ÂÃß±â>

À©µµ¿ì 95ÀÇ 'ã±â'ó·³ Æûºä¸¦ ¸¸µé¾ú´Âµ¥ À©µµ¿ì Å©±â¸¦ º¯°æÇÒ °æ¿ì ÇÔ²² ³»ºÎÀÇ ÄÁÆ®·Ñ Å©±âµµ º¯ÇÏ°Ô ÇÏ°í ½Í½À´Ï´Ù.

¸¸¾à À©µµ¿ì 95¿¡¼­¸¸ ¾´´Ù¸é WM_SIZE ¿¡¼­ ó¸®ÇØÁÖ¸é µÇÁö¸¸, Ç÷¯½ºÆÑÀ» ¼³Ä¡Çߴٰųª À©µµ¿ì NT 4.0¿¡¼­ »ç¿ëÇÏ´Â °æ¿ì´Â °ï¶õÇÕ´Ï´Ù. ¿Ö³Ä Çϸé À©µµ¿ì Å©±â¸¦ Á¶ÀýÇÒ ¶§ À©µµ¿ì´Â µ¿ÀûÀ¸·Î °è¼Ó ±×·ÁÁö¹Ç·Î WM_SIZE¿¡¼­ ó¸®ÇØ ÁÖ¸é Å©±âÁ¶ÀýÀÌ ³¡³ª°í ³ª¼­¾ß ÄÁÆ®·ÑÀ» ´Ù½Ã ±×¸®¹Ç·Î ÁÁÀº ¹æ¹ýÀ̶ó ÇÒ ¼ö ¾øÁÒ. ±×·¯¹Ç·Î ÄÁÆ®·ÑÀ» ´Ù½Ã ±×·ÁÁÖ´Â ºÎºÐÀÌ ÇÊ¿äÇÕ´Ï´Ù.

 ÇÑ ¹øÀº ²À È£ÃâµÇ´Â OnInitDialog()¿¡¼­ ¹Ù·Î ó¸®ÇÏ´Â °Íº¸´Ù µû·Î ºÐ¸®Çؼ­ ÀÛ¼ºÇÑ ÈÄ È£ÃâÇÏ´Â °ÍÀÌ ÁÁ½À´Ï´Ù. ¿ì¼± ÇÊ¿äÇÑ ÄÁÆ®·ÑÀº ¸ðµÎ DDX¸¦ ÀÌ¿ëÇØ ÄÁÆ®·Ñ º¯¼ö·Î ¸¸µé¾î ÁÝ´Ï´Ù (API¿¡¼­´Â GetDlgItem()µîÀÇ ÇÔ¼ö ÀÌ¿ë).

void ResizeControlToParent(void) {
     CRect rect;
     GetClientRect(&rect);
     m_List1.MoveWindow(rect.left+10, rect.top+10,
          (rect.right-rect.left)/2, (rect.bottom-rect.top)/3, TRUE);

     m_Edit1.MoveWindow(...........................)
     ...
     return;
}

ÀÌ·¸°Ô ¸¸µç ÇÔ¼ö¸¦ OnInitDialog()¿Í OnSize() ¶Ç´Â OnSizing()¿¡¼­ ºÒ·¯ ÁÖ¸é µÇ´Â °ÅÁÒ.

Âü°í·Î À©µµ¿ì°¡ ÃÖ¼ÒÈ­µÉ °æ¿ì¸¸ À¯³äÇÏ¸é µË´Ï´Ù. °¡·É À©µµ¿ì Å©±â¸¦ ¾ò¾î¼­ ÄÁÆ®·ÑÀ» ±×¸± ¶§ 'rect.right-50' ½ÄÀ¸·Î '50'À» Á¤¼ö ó¸®Çϸé ÃÖ¼ÒÈ­µÉ ¶§ °ªÀÌ À½¼ö°ªÀÌ µÇ¹Ç·Î 'Assertion Failure' ¶Ç´Â 'ÀÌ ÇÁ·Î±×·¥ÀÌ À߸øµÈ ¿¬»êÀ» ¼öÇàÇÏ¿©...'¶ó´Â ¸Þ½ÃÁö¸¦ ¸¸³ª°Ô µË´Ï´Ù.

 

<ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÈ µð·ºÅ丮¸¦ ãÀ¸·Á¸é>

ºñÁÖ¾ó C++·Î ÇÁ·Î±×·¡¹ÖÀ» ÇÏ´ø Áß ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÈ °æ·Î¸¦ ¾Ë¾Æ¾ß ÇÒ ÇÊ¿ä°¡ »ý°å½À´Ï´Ù.

ÇÁ·¹ÀÓ¿÷Àº ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ ÃʱâÈ­ °úÁ¤¿¡¼­ GetModuleFilesNameÀ» È£ÃâÇÏ°í µµ¿ò¸» ÆÄÀÏ¿¡ ´ëÇÑ °æ·Î¸¦ CWinApp::m_pszHelpFilePath¿¡ ÀúÀåÇÕ´Ï´Ù.

 ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÈ µð·ºÅ丮¸¦ ã±â À§ÇØ ÀÌ µ¥ÀÌÅÍ ¸â¹ö¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀº ´ÙÀ½°ú °°½À´Ï´Ù. ¿©±â¼­ _splitpath°¡ ½ÇÇà·çƾÀ̸ç, _MAX_DIR°ú _MAX_DRIVE´Â Çì´õÆÄÀÏÀÎ STDLIB.H¿¡ Á¤ÀǵŠÀÖ½À´Ï´Ù.

void GetLaunchDir(CString& strLaunched)
{
    TCHAR szDir[_MAX_DIR];
    TCHAR szDrive[_MAX_DRIVE];
    _splitpath(AfxGetApp()->m_pszHelpFilePath,
            szDrive, szDir, NULL, NULL);
    strLaunched.Format(_T("%s%s"), szDrive, szDir);
}

 

- the end of this article -