<ÀÌÅŸ¯Ã¼ ÅØ½ºÆ®¸¦ Ãâ·ÂÇÏ·Á¸é>

 Æ®·çŸÀÔÀ̳ª GDI Ãâ·Â ±Û²ÃÀ» ÀÌ¿ëÇϸé ȸÀüÇÑ ÅØ½ºÆ®ÀÇ Ãâ·ÂÀÌ °¡´ÉÇÏ´Ù°í ÇÏ´øµ¥, ¾î¶»°Ô ÇÏ¸é µÇ´ÂÁö¿ä.  

 ¹°·Ð °¡´ÉÇÕ´Ï´Ù. ¾î¶² Çϵå¿þ¾î ÀåÄ¡´Â ȸÀüÇÏ´Â ·¡½ºÅÍ ±Û²ÃÀ» Áö¿øÇϱ⵵ ÇÕ´Ï´Ù.
  Çϵå¿þ¾î°¡ Ãß°¡ÀûÀÎ ¹®ÀÚ È¸Àü ±â´ÉÀ» Áö¿øÇÏ´ÂÁö È®ÀÎÇÏ·Á¸é TEXTCAP ÆÄ¶ó¹ÌÅ͸¦ Àü´ÞÇØ CDC::GetDeviceCaps¸¦ È£ÃâÇÏ¸é µË´Ï´Ù. ´Ü, Æ®·çŸÀÔÀ̳ª GDI Ãâ·Â ±Û²ÃÀ» »ç¿ëÁßÀ̶ó¸é GetDeviceCaps¸¦ È£ÃâÇÒ Çʿ䰡 ¾ø½À´Ï´Ù.
 LOGFONT ±¸Á¶Ã¼ÀÇ ifEscapement ¸â¹ö·Î ÅØ½ºÆ®ÀÇ ±âÁؼ±°ú xÃàÀÇ °¢À» °áÁ¤ÇÒ ¼ö Àִµ¥ À̶§ ÁÖÀÇÇØ¾ß ÇÒ Á¡Àº ½ÇÁ¦ ¼ýÀÚº¸´Ù,Á¤È®È÷ 10¹è¸¦ Å©°Ô ÁöÁ¤ÇØ¾ß ÇÑ´Ù´Â °ÍÀÔ´Ï´Ù. °¡·É 45µµ¸¸Å­ ȸÀüÇÑ ±Û²ÃÀ» »ý¼ºÇÏ·Á¸é ifEscapement¸¦ 450À¸·Î ¼³Á¤ÇÏ¸é µË´Ï´Ù.
 ±×¸®°í ¸ðµç ±Û²ÃÀÌ ÇöÀç ÁÂÇ¥ ü°è¸¦ ±âÁØÀ¸·Î °°Àº ¹æÇâÀ¸·Î ±â¿ïÀÌ·Á¸é ifClipPrecision ¸â¹öÀÇ CLIP_LH_ANGLES ºñÆ®¸¦ ¼³Á¤ÇØ¾ß ÇÕ´Ï´Ù. ÀÌ·¸°Ô ÇÏÁö ¾ÊÀ¸¸é ºÎºÐÀûÀ¸·Î ±Û²ÃÀÌ ¹Ý´ë ¹æÇâÀ¸·Î ȸÀüÇÒ °ÍÀÔ´Ï´Ù.
 ´ÙÀ½ ÄÚµå´Â 15µµ·Î ±â¿ï¾îÁø ¹®ÀÚ¿­À» Ãâ·ÂÇϱâ À§ÇØ 14Æ÷ÀÎÆ®ÀÇ Arial ±Û²ÃÀ» »ç¿ëÇÑ ¿¹ÀÔ´Ï´Ù.

    void CSampleleView::OnDraw(CDC* pDC) {
    // âÀÇ Å©±â¸¦ °áÁ¤ÇÑ´Ù.
    CRect rcClient;
    GetClientRect(rcClient);
    // ¹®ÀÚ¿­À» »ý¼ºÇÑ´Ù.
    CString str(_T("¸¶¼Ò°¡ 14ÁÖ³âÀ» ¸ÂÀÌ ÇÕ´Ï´Ù!"));
    //»¡°£»ö ÅØ½ºÆ®¸¦ Ãâ·ÂÇÑ´Ù.
    pDC->SetBkMode(TRANSPARENT);
    pDC->SetTextColor(RGB(255, 0, 0));
    CFont font; //±Û²Ã °´Ã¼
    LONGFONT stFont; //±Û²Ã Á¤ÀÇ
    //º¯°æµÇÁö ¾ÊÀ» ±Û²Ã ¼Ó¼ºÀ» ¼³Á¤ÇÑ´Ù.
    memset(&stFont, 0, sizeof(LONFONT));
    stFont.lfHeight=MulPiv(14, -pDC->GetDeviceCaps(LOGPIXELSY), 72);
    stFont.lfWeight=FW_NORMAL;
    stFont.lfClipPrecision=CLIP_LH_ANGLES;
    strcpy(stFont.lfFaceName, "Arial");
    //15 ȸÀüÇÑ ÅØ½ºÆ®¸¦ Ãâ·ÂÇÑ´Ù.
    for(int nAngle=0; nAngle<3600; nAngle +=150) {
    //»õ·Î¿î °¢À» ÁöÁ¤ÇÑ´Ù.
    stFont.lfEscapement=nAngle;
    //±Û²ÃÀ» »ý¼ºÇϰí ÀåÄ¡ ÄÁÅØ½ºÆ®·Î ¼±ÅÃÇÑ´Ù.

    font.CreatFontIndirect(&stFont);
    CFont* pOldFont=pDC->SelectObject(&font);
    //ÅØ½ºÆ®¸¦ Ãâ·ÂÇÑ´Ù.
    pDC->SelectObject(pOldFont);
    font.DeletObject();

 

 <CString ŸÀÔÀÇ SQL ¹®ÀåÀ» ÀÎÀÚ·Î ³Ñ±â·Á¸é>

 MFC 5.0À¸·Î ODBC ÇÁ·Î±×·¡¹ÖÀ» Çϸ鼭 SQLExecDirect ÇÔ¼ö¸¦ »ç¿ëÇÏ·Á ÇÕ´Ï´Ù. CString ŸÀÔÀÇ SQL ¹®ÀåÀ» ÀÎÀÚ·Î ³Ñ°ÜÁÖ·Á°í Çϴµ¥ °¡´ÉÇÑÁö¿ä. Á¦°¡ ÀÛ¼ºÇÑ ÄÚµå´Â ´ÙÀ½°ú °°½À´Ï´Ù. ¿©±â¼­ strSQLÀº CString ŸÀÔÀ¸·Î ¼±¾ðÇß½À´Ï´Ù.  

 CStringÀ» SQLExecDirect()ÀÇ ÀÎÀÚ·Î ¹Ù·Î »ç¿ëÇÒ ¼ö´Â ¾ø½À´Ï´Ù. ´ë½Å CStringÀÇ GetBuffer()¸¦ ÀÌ¿ëÇØ Æ÷ÀÎÅ͸¦ ¾ò¾î ¿À¸é µË´Ï´Ù. ¿©±â¼­ ÇѰ¡Áö À¯ÀÇÇÒ Á¡Àº GetBuffer()°¡ »õ·Î¿î ¸Þ¸ð¸®¸¦ ÇÒ´ç¹Þ¾Æ ±× Æ÷ÀÎÅ͸¦ ¸®ÅÏÇϹǷΠ»ç¿ëÇÏ°í ³­ ÈÄ¿¡´Â ÇÒ´çµÈ ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇØÁÖ´Â ReleaseBuffer()¸¦ ¹Ýµå½Ã È£ÃâÇØ¾ß ÇÑ´Ù´Â °ÍÀÔ´Ï´Ù. ´ÙÀ½°ú °°ÀÌ Äڵ带 ¼öÁ¤ÇÏ¸é µË´Ï´Ù.

    HSTMT hstmt = NULL;
    CString strSQL = "select * from yeebw";
    unsigned char* pSQL =
        (unsigned char*)strSQL.GetBuffer(strSQL.GetLength() + 1);
    SQLExecDirect(hstmt, pSQL, SQL_NTS);
    strSQL.ReleaseBuffer();

 

<µð·ºÅ丮 ¼±Åà ´ÙÀ̾ó·Î±× ¶ç¿ì±â>

 MFC 5.0À¸·Î ÇÁ·Î±×·¥À» ¸¸µé´ø Áß µð·ºÅ丮 ¼±Åà ´ÙÀ̾ó·Î±×¸¦ ¶ç¿ì´Â ÇÔ¼ö°¡ ÇÊ¿äÇÏ°Ô µÇ¾ú½À´Ï´Ù. ¾î¶² ÇÔ¼ö¸¦ ¾²¸é µÇ´ÂÁö, ±×¸®°í ½ÇÁ¦ÀûÀÎ ¿¹¸¦ º¸°í ½Í½À´Ï´Ù.  

 µð·ºÅ丮 ¼±Åà ´ÙÀ̾ó·Î±×¸¦ ¶ç¿ì·Á¸é ½Ã½ºÅÛ ÇÔ¼öÀÎ SHBrowseForFolder¸¦ »ç¿ëÇÏ¸é µË´Ï´Ù. ÀÌ ÇÔ¼ö´Â ÀÎÀÚ·Î BROWSEINFO ±¸Á¶Ã¼ Æ÷ÀÎÅ͸¦ ¹ÞÀ¸¸ç, shlobj.h¿¡ ´ÙÀ½°ú °°ÀÌ Á¤ÀǵŠÀÖ½À´Ï´Ù.

    typedef struct _browseinfo {  
        HWND hwndOwner;
        LPCITEMIDLIST pidlRoot;
        LPSTR pszDisplayName;
        LPCSTR lpszTitle;
        UINT ulFlags;
        BFFCALLBACK lpfn;
        LPARAM lParam;
        int iImage;
    } BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO;

 ÀÌ ±¸Á¶Ã¼¿¡ Àû´çÇÑ °ªÀ» ä¿ö¼­ SHBrowseForFolder()¸¦ È£ÃâÇÏ¸é µð·ºÅ丮 ¼±Åà ´ÙÀ̾ó·Î±×°¡ ¶å´Ï´Ù. ¼±ÅÃÇÑ µð·ºÅ丮 ÆÐ½º´Â HGetPathFromIDList()¸¦ È£ÃâÇØ¼­ ¾òÀ» ¼ö ÀÖÀ¸¸ç, º¯¼ö tmp¿¡´Â ¼±ÅÃÇÑ µð·ºÅ丮ÀÇ ÆÐ½º°¡ µé¾î ÀÖ½À´Ï´Ù. ´ÙÀ½À» ÂüÁ¶Çϼ¼¿ä.

    LPITEMIDLIST pidlBrowse;
    LPSTR tmp[MAX_PATH];

    BROWSEINFO BRinfo;
    BRinfo.hwndOwner = hwnd; // ºÎ¸ð À©µµ¿ìÀÇ ÇÚµé
    BRinfo.pidlRoot = NULL;
    BRinfo.pszDisplayName = tmp;
    BRinfo.lpszTitle = "µð·ºÅ丮¸¦ ¼±ÅÃÇϼ¼¿ä";
    BRinfo.ulFlags = BIF_RETURNONLYFSDIRS;
    BRinfo.lpfn = NULL;
    BRinfo.lParam = 0;

    pidlBrowse = SHBrowseForFolder(&BRinfo); // ´ÙÀ̾ó·Î±×¸¦ ¶ç¿î´Ù.
    if(pidlBrowse != NULL) {
        SHGetPathFromIDList(pidlBrowse, tmp); // ÆÐ½º¸¦ ¾ò¾î¿Â´Ù.
    }
 

<Ç×»ó ÃÖ»óÀ§ âÀ» À¯ÁöÇÏ·Á¸é>

 MFC·Î âÀÌ È°¼ºÈ­µÇÁö ¾Ê´õ¶óµµ Ç×»ó À§¿¡ ¶°ÀÖ´Â ¾ÖÇø®ÄÉÀ̼ÇÀ» ¸¸µé·Á°í ÇÕ´Ï´Ù.  

 ¸ðµç â À§¿¡ ÃÖ»óÀ§Ã¢(topmost window)À» ¶ç¿ì´Â ¹æ¹ý¿¡´Â µÎ °¡Áö°¡ ÀÖ½À´Ï´Ù. âÀ» ÀÌ¹Ì »ý¼ºÇß´Ù¸é âÀÇ ½ÇÇà½Ã È®Àå ½ºÅ¸ÀÏ ºñÆ®·Î WS_EX_TOPMOST¸¦ ÁöÁ¤ÇÏ¸é µÇ¸ç, ±×·¸Áö ¾Ê´Ù¸é CWnd::SetWindowPos¸¦ È£ÃâÇÑ ÈÄ µ¥ÀÌÅÍ ¸â¹öÀÎ wndTopMost¸¦ Àü´ÞÇÏ¸é µË´Ï´Ù. ½ºÅ¸ÀÏ ºñÆ®°¡ ¼³Á¤µÅ ÀÖ´ÂÁö È®ÀÎÇÏ·Á¸é CWnd::GetExStyleÀ» ºÒ·¯ °£´ÜÈ÷ ÇØ°áÇÒ ¼ö ÀÖ½À´Ï´Ù. ´ÙÀ½ Äڵ带 ÂüÁ¶ÇϽʽÿÀ.
      
    void ToggleTopMost(CWnd* pWnd) {
    if (pWnd->GetExStyle() & WS_EX_TOPMOST)
       pWnd->SetWindowPos(&wndNoTopMost, 0, 0, 0, 0
                              SWP_NOSIZE | SWP_NOMOVE);
    else
        pWnd->SetWindowPos(&wndTopMost, 0, 0, 0, 0
                               SAWP_NOSIZE | SWP_NOMOVE);
    }

 

<MDI ÇÁ·Î±×·¥ ½ÃÀ۽à ¶ß´Â µµÅ¥¸ÕÆ® ¾ø¾Ö±â>

 MDI ÇÁ·Î±×·¥¿¡¼­ óÀ½ ½ÇÇà½Ã ²À µîÀåÇÏ´Â »õ µµÅ¥¸ÕÆ®¸¦ ¶ç¿ìÁö ¾ÊÀ¸·Á¸é ¾î¶»°Ô ÇÏ¸é µÇ³ª¿ä.  

 ÀÚµ¿À¸·Î ¿­¸®´Â ºó À©µµ¿ì¸¦ ¾ø¾Ö´Â ¹æ¹ýÀº ÀǿܷΠ°£´ÜÇÕ´Ï´Ù. Ŭ·¡½º À§Àúµå·Î »ý¼ºÇÑ ¼Ò½ºÁß xxxApp.CPP¶ó´Â ÆÄÀÏ¿¡ CWinApp¿¡¼­ »ó¼Ó¹ÞÀº Ŭ·¡½º°¡ µé¾î Àִµ¥, ÀÌ ¸â¹ö ÇÔ¼öÁß InitInstance() ¾È¿¡ ´ÙÀ½ Äڵ尡 Á¸ÀçÇÕ´Ï´Ù.

    ParseCommandLine(comInfo);
    if( ProcessShellCommand(...))..

 ÀÌ µÎ ÁÙ »çÀÌ¿¡ ´ÙÀ½ Äڵ带 Ãß°¡Çϸé ÇÁ·Î±×·¥ÀÌ Ã³À½ ½ÇÇàµÉ ¶§ ½© ¸í·É(ShellCommand) À¸·Î »õ·Î¿î ÆÄÀÏÀ» ¸¸µé¶ó´Â 'FileNew' ¸í·ÉÇàÀÌ ÀÎÀÚ·Î µé¾î¿À°Ô µË´Ï´Ù(µµÅ¥¸ÕÆ®¸¦ ÁöÁ¤ÇÏÁö ¾Ê¾ÒÀ» ¶§). ÀÌ °æ¿ì¿¡¸¸ FileNothingÀ¸·Î ¹Ù²ãÁÖ¸é ºó µµÅ¥¸ÕÆ®¸¦ ¸¸µéÁö ¾ÊÀ¸¸ç ´ç¿¬È÷ ºä/ÇÁ·¹ÀÓµµ º¸ÀÌÁö ¾Ê½À´Ï´Ù.

    if(cmdInfo.m_nShellCommand == CCommandLineInfo::FileNew )
         cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;