<´ÙÀ̾ó·Î±× ¹Ú½º ¾øÀÌ ºä È­¸é¿¡ ¹öÆ° ¸¸µé±â>

ºä¿¡¼­ ´ÙÀ̾ó·Î±× ¹Ú½º¸¦ ¸¸µéÁö ¾Ê°í ¹öÆ°À» ºä È­¸é¿¡ ¸¸µå´Â ¹æ¹ýÀ» ¾Ë°í ½Í½À´Ï´Ù.

ÀϹÝÀûÀ¸·Î CWnd¿¡¼­ »ó¼Ó¹ÞÀº À©µµ¿ì¿¡ ¹öÆ°À» ³Ö°í ½ÍÀ¸¸é ´ÙÀ½°ú °°ÀÌ Çغ¸¼¼¿ä.

[1] ÀÚ½ÅÀÌ Æ¯º°È÷ »ç¿ëÇÒ ¹öÆ°À» CButtonÀ¸·ÎºÎÅÍ »ó¼Ó¹Þ´Â´Ù.

class iMyButton : public CButton
{
     ...
};

[2] À©µµ¿ì Ŭ·¡½º(CChildView)¿¡ ¸â¹ö·Î ¹öÆ°À» °¡Áö°Ô ÇÑ´Ù.

class CChildView : public CWnd
{
     // Construction
     public:
          CChildView();

     private:
          iMyButton m_btn;
     ...

     // ¸Þ½ÃÁö ¸Ê ÇÔ¼ö¸¦ »ý¼º
     protected:
          // {{AFX_MSG(CChildView)
          ...
               afx_msg void OnParentNotify(UINT message, LPARAM lParam);
          // }} AFX_MSG
          DECLARE_MESSAGE_MAP()
};

[3] ºÎ¸ð À©µµ¿ì°¡ »ý¼ºµÉ ¶§ ¹öÆ°µµ »ý¼º½ÃŲ´Ù.

 void CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
     CRect rcBtn(30, 50, 150, 90);
     m_btn.Create("MyBtn", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE,
          rcBtn, this, IDC_MY_BUTTON);
}

[4] ¹öÆ°À» »ý¼º/¼Ò¸êÇÒ ¶§³ª ¹öÆ°À» ´­·¶À» ¶§ Ưº°ÇÑ Ã³¸®¸¦ ÇØÁÖ°í ½ÍÀ¸¸é WM_PARENTNOTIFY ¸Þ½ÃÁö¸¦ ó¸®ÇØÁØ´Ù.

void CChildView::OnParentNotify(UINT message, LPARAM lParam)
{
     switch(message) {
     case WM_CREATE :
          TRACE("CChildView::OnParentNotify --> WM_CREATE\n");
          break;
     case WM_DESTROY :
          TRACE("CChildView::OnParentNotify --> WM_DESTROY\n");
          break;
     case WM_LBUTTONDOWN :
          TRACE("CChildView::OnParentNotify --> WM_LBUTTONDOWN\n");
          break;
     case WM_MBUTTONDOWN :
          TRACE("CChildView::OnParentNotify --> WM_MBUTTONDOWN\n");
          break;
     case WM_RBUTTONDOWN :
          TRACE("CChildView::OnParentNotify --> WM_RBUTTONDOWN\n");
          break;
     }
}

 

<ºñÁÖ¾ó C++¿¡¼­ ÇÁ¸°Æ® ¹Ì¸®º¸±â ±¸Çö>

ºñÁÖ¾ó C++ 5.0 À¸·Î ´ÙÀ̾ó·Î±×¿¡¼­ ÇÁ¸°Æ®°¡ µÇ´Â ±â´ÉÀ» ±¸ÇöÇÏ°í Àִµ¥, ÇÁ¸°Æ® ¹Ì¸®º¸±â¸¦ ¾î¶»°Ô ±¸ÇöÇØ¾ß ÇÒÁö¸¦ ¸ð¸£°Ú½À´Ï´Ù. ¹æ¹ýÀ» ¾Ë·ÁÁÖ¼¼¿ä.

¹Ì¸®º¸±â¿¡ ´ëÇÑ ÇÔ¼ö´Â ´ÙÀ½°ú °°½À´Ï´Ù.

void ºäŬ·¡½º¸í::OnFilePrintPreview()
{
     CFilePrintPreviewState *pState = new CPrintPreviewState;
     if(!DoPrintPreview(AFX_IDD_PREVIEW_TOOLBAR, this,
          RUNTIME_CLASS(ºäŬ·¡½º¸í, pState))
     {
          TRACE0("Error : DoPrintPreview failed");
          AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
          delete pState;
     }
}

 º¸´Ù ÀÚ¼¼ÇÑ °ÍÀ» ¾Ë°í ½ÍÀ¸¸é ºñÁÖ¾ó C++ÀÇ µµ¿ò¸»À» ÂüÁ¶Çϼ¼¿ä. "µµ¿ò¸»->SEARCH->QUERY" ¿¡¼­ Äõ¸®(Query) ¾ÈÀ» º¸¸é ¿¡µðÆ® ¹Ú½º°¡ Àִµ¥, °Å±â¿¡¼­ CPrintPreviewStateÀ» ÀÔ·ÂÇÏ°í ¿£ÅÍ(ȤÀº ¹Ø¿¡ ÀÖ´Â Query¸¦ Ŭ¸¯)¸¦ Ä¡¸é µË´Ï´Ù.

 

<CListCtrl¿¡¼­ Æ˾÷ ¸Þ´º ±¸Çö>

CListCtrl¿¡¼­ ¿À¸¥ÂÊ ¸¶¿ì½º ¹öÆ°À» ´­·ÈÀ» ¶§ µ¥ÀÌÅÍÀÇ ¼öÁ¤, »ðÀÔ, »èÁ¦¸¦ ³ªÅ¸³»´Â Æ˾÷¸Þ´º¸¦ ±¸ÇöÇÏ°í ½Í½À´Ï´Ù. ºñÁÖ¾ó C·Î ÇÁ·Î±×·¡¹ÖÇÏ´Â °ÍÀº óÀ½ÀÌ¶ó¼­ ¹æ¹ýÀ» Àß ¸ð¸£°Ú½À´Ï´Ù. ÀÚ¼¼ÇÑ ¼³¸í ºÎŹµå¸³´Ï´Ù.

´ÙÀ½°ú °°ÀÌ Çغ¸¸é ÇØ°áÇÒ ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù.

void CMyListCtrl::OnRButtonDown(UINT nFlags, CPoint point)
{
     CMenu menu;

     // ¹°·Ð IDR_POPUPÀ̶õ ¸Þ´º°¡ ¸®¼Ò½º ÆíÁý±â·Î
     // ÀÛ¼ºµÇ ÀÖ¾î¾ß ÇÕ´Ï´Ù.
     VERIFY(menu.LoadMenu(IDR_POPUP));

     // ù ¹ø° ¼­ºê¸Þ´º¸¦
     CMenu* pPopup = menu.GetSubMenu(0);
     ASSERT(pPopup != NULL);
     CRect viewRect;
     GetWindowRect(&viewRect);

     // È­¸é¿¡ Ãâ·ÂÇÕ´Ï´Ù.
     pPopup->TrackPopupMenu(
          TPM_LEFTALIGN | TPM_RIGHTBUTTON,
          point.x + viewRect.left,
          point.y + viewRect.top,
          this
          );

     CListCtrl::OnRButtonDown(nFlags, point);
}

 

<´ÙÀ̾ó·Î±× ¿¡µðÆ® ¹Ú½º¿¡¼­ °ª ÀԷ¹ޱâ>

´ÙÀ̾ó·Î±× ¹Ú½ºÀÇ ¿¡µðÆ® »óÀÚ¿¡¼­ °ªÀ» ÀÔ·Â¹Þ¾Æ ºÎ¸ð À©µµ¿ì¿¡ Á÷¼±À» ±×¸®´Â ÇÁ·Î±×·¡¹ÖÀ» ÇÏ°í ÀÖ½À´Ï´Ù. ´ÙÀ̾ó·Î±× ¹Ú½ºÀÇ ¿¡µðÆ® »óÀÚ¿¡¼­ ÀԷ¹ÞÀº °ªÀ» ºä Ŭ·¡½ºÀÇ draw ÇÔ¼ö¿Í ¿¬°áÇÏ°í ½Í½À´Ï´Ù.

Áú¹®ÇÑ ³»¿ëÀÇ ÇØ°á ¹æ¹ýÀº ÀÇ¿Ü·Î ½±½À´Ï´Ù. ¿ì¼± ´ÙÀ̾ó·Î±× ¹Ú½º¸¦ ¸¸µé°í °ªÀ» ÀԷ¹޴ ¿¡µðÆ® ¹Ú½º¿¡ ¸â¹ö º¯¼ö¸¦ ¼³Á¤ÇÕ´Ï´Ù. ÀÌ °úÁ¤Àº Ŭ·¡½º À§Àúµå¿¡ ¸â¹ö ÅÇÀ» ´©¸£°í ÇØ´ç ÄÁÆ®·ÑÀ» ¼±ÅÃÇÏ¸é º¯¼ö¸¦ ÀÔ·ÂÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿©±â¼­ ¸¸µç ´ÙÀ̾ó·Î±×°¡ CInputDlg, ¸â¹ö º¯¼ö°¡ m_iValÀÌ°í, CView¿¡¼­ ƯÁ¤ ¸Þ´º¸¦ ¼±ÅÃÇß´Ù¸é ´ÙÀ½°ú °°ÀÌ ÇÏ¸é µË´Ï´Ù.

CView::OnInputValue()
{
     CInputDlg MyDlg;     // °´Ã¼¸¦ Çϳª ¸¸µì´Ï´Ù.
     
     MyDlg.m_iVal = 5;    // ÃʱⰪÀ» ¿©±â¼­ ¼³Á¤Çصµ µË´Ï´Ù.
     
     if(MyDlg.DoModal() == IDOK) {   // ¼³Á¤ÀÌ ¿Ï·áµÇ¸é
          // ´ëÈ­ »óÀÚÀÇ °ªÀ» ÀÐ¾î µéÀÔ´Ï´Ù.
          m_iLineWidth = MyDlg.m_iVal;

          //
          // ¿øÇÏ´Â ÀÛ¾÷À» ¼öÇàÇÕ´Ï´Ù.
     }

 

<¾Æ½ºÅ° °ªÀ» Hex °ªÀ¸·Î ¹Ù²Ù´Â ÇÔ¼ö>

¾Æ½ºÅ° °ªÀ» Hex·Î ¹Ù²Ù´Â ÇÔ¼ö°¡ ¾î¶² °ÍÀÎÁö ±Ã±ÝÇÕ´Ï´Ù.

Hex ¹®ÀÚ¿­À» Á¤¼ö°ªÀ¸·Î º¯È¯ÇÏ´Â ÇÁ·Î±×·¥À» ¸»ÇÏ´Â °Í °°Àºµ¥ ´ÙÀ½ÀÇ ·çƾÀ» ÀÌ¿ëÇØ º¸±â ¹Ù¶ø´Ï´Ù. ·±Å¸ÀÓ ¶óÀ̺귯¸®¿¡´Â ±×·± ÇÔ¼ö°¡ ¾ø´Â °É·Î ¾Ë°í ÀÖ½À´Ï´Ù.

#include "math.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#define new DEBUG_NEW
#undef

//
UINT StrHexToInt(LPCTSTR str)
{
     return (UINT)StrHexToLong(str);
}

ULONG StrHexToLong(LPCTSTR str)
{
     CString work;
     int nLength;
     ULONG ulRetVal;

     work = str;

     if(strstr(str, "0x") != NULL)
          work = strstr(str, "0x") + 2;

     //
     nLength = work.GetLength() - 1;
     ulRetVal = 0;
     
     work.MakeUpper();

     for(int i=0; i<work.GetLength(); i++, nLength--) {
          switch(work.GetAt(i)) {
          case '0' :
          case '1' :
          case '2' :
          case '3' :
          case '4' :
          case '5' :
          case '6' :
          case '7' :
          case '8' :
          case '9' :
               ulRetVal += (work.GetAt(i) - '0') * (int)pow(16, nLength);
               break;

          case 'A' :
          case 'B' :
          case 'C' :
          case 'D' :
          case 'E' :
          case 'F' :
               ulRetVal += (10 + work.GetAt(i) - 'A') * (int)pow(16, nLength);
               break;

          default :
               return ulRetVal = 0;
          }
     }
     return ulRetVal;
}

½ÊÁø¼ö·Î º¯È¯µÇ¸é ´Ù¸¥ Áø¼ö·Îµµ ÃæºÐÈ÷ ¹Ù²Ü ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù.

 

<ÇÁ¸°Æ®½Ã °¡·Î Á¦¾î¿¡ ´ëÇØ>

ÇÁ¸°Æ® ÇÁ·Î±×·¡¹ÖÀ» ÇÏ°í ÀÖ½À´Ï´Ù. ±×·±µ¥ °¡·Î·Î ÇÁ¸°Æ®¸¦ ÇØ¾ß Çϴµ¥ À־ ¹®Á¦°¡ ¹ß»ýÇß½À´Ï´Ù. ÄÚµå´Â ´ÙÀ½°ú °°½À´Ï´Ù.

DEVMODE dm;
memset(&dm, 0, sizeof(dm));
dm.dmSpecVersion = DM_SPECVERSION;
dm.dmSize = sizeof(dm);
dm.dmFields = DM_ORIENTATION;
dm.dmOrientation = DMORIENT_LANDSCAPE;
pDC->ResetDC(&dm);

 ÀÌ·¸°Ô ÁöÁ¤À» Çߴµ¥ ¹®Á¦´Â ±× ´ÙÀ½ ÆäÀÌÁöºÎÅÍ °¡·Î·Î ÀμⰡ µÈ´Ù´Â °ÍÀÔ´Ï´Ù. ±×¸®°í À©µµ¿ì NT ȯ°æ¿¡¼­´Â ÀÌ ÀÛ¾÷ÀÌ ÁøÇàµÇÁö ¾Ê½À´Ï´Ù. ÇØ°á ¹æ¹ýÀ» ¾Ë·ÁÁÖ¼¼¿ä.

°¡·Î Àμâ Á¦¾î¸¦ ´ÙÀ½°ú °°Àº ¹æ¹ýÀ¸·Î ÇØ º¸¼¼¿ä.

CDC dc;

CPrintDialog dlg1(FALSE), dlg2(FALSE);

dlg1.GetDefaults();

LPDEVMODE pDM = dlg1.GetDevMode();

// ++
if(pDM == NULL) {
     AfxMessageBox(IDS_NOT_READY_PRINTER, MB_ICONSTOP);
     return;
}

pDM->dmOrientation = DMORIENT_LANDSCAPE;
pDM->dmPrintQuality = 300;
pDM->dmYResolution = 300;

dlg2.m_pd.hDevMode = (HANDLE)pDM;

if(dlg2.DoModal() == IDOK)
     dc.Attach(dlg2.GetPrinterDC());     // PrinterDC¸¦ ¾ò´Â´Ù.
else
     return;

DOCINFO di;

::ZeroMemory(&di, sizeof(DOCINFO));

di.cbSize = sizeof(DOCINFO);
di.lpszDocName = "Preset Pulse Graph Printing...";

if(dc.StartDoc(&di) > 0) {
     // ÇÊ¿äÇÑ µ¥ÀÌÅ͸¦ Ãâ·ÂÇÑ´Ù.
}

 

<½Ã½ºÅÛ ÆùÆ® ¾ò±â>

³» ÄÄÇ»ÅÍ¿¡ ±ò·ÁÀÖ´Â ÆùÆ®¸¦ ¾òÀ¸·Á¸é ¾î¶»°Ô ÇØ¾ß Çϳª¿ä? ¿¹¸¦ µé¾î¼­ ¸®½ºÆ® ¹Ú½º³ª ÄÞº¸ ¹Ú½º¿¡ ³» ÄÄÇ»ÅÍÀÇ ÆùÆ®°¡ ¸ðµÎ º¸ÀÌ°Ô ÇÏ·Á¸é ¾î¶² ÇÔ¼ö¸¦ ½á¾ß ÇÏ´ÂÁö ±Ã±ÝÇÕ´Ï´Ù.

 ´ÙÀ½ÀÇ ÇÔ¼ö¸¦ »ç¿ëÇÏ¸é µË´Ï´Ù.

int EnumFontFamiliesEx(HDC hdc,        // DC Á¦¾î
     LPLOGFONT lpLogFont,                  // ³í¸®ÀûÀÎ ÆùÆ®Á¤º¸ Æ÷ÀÎÅÍ
     FONTENUMPROC lpEnumFontFamExProc,   // ÄݹéÇÔ¼ö Æ÷ÀÎÅÍ
     LPARAM lParam,                            // ¾ÖÇø®ÄÉÀÌ¼Ç µ¥ÀÌÅÍ 
     DWORD dwFlags                            // reserved; must be zero
);

 À§ ÇÔ¼ö´Â lpLogFont¿¡ ÁöÁ¤µÈ ÆùÆ®µéÀÌ Á¸ÀçÇϸé lpEnumFontFamExProc¿¡ µî·ÏµÈ CALLBACK ÇÔ¼ö¸¦ È£ÃâÇÕ´Ï´Ù. lpEnumFontFamExProcÀÇ ¿øÇüÀº ´ÙÀ½°ú °°½À´Ï´Ù.

 int CALLBACK EnumFontFamExProc(
     ENUMLOGFONTEX *lpelfe,       // ³í¸®ÀûÀÎ ÆùÆ® µ¥ÀÌÅÍ Æ÷ÀÎÅÍ
     NEWTEXTMETRICEX *lpntme,   // ¹°¸®ÀûÀÎ ÆùÆ® µ¥ÀÌÅÍ Æ÷ÀÎÅÍ
     int FontType,                           // ÆùÆ® ÇüÅÂ
     LPARAM  lParam                      // Á¤ÀÇµÈ ¾ÖÇø®ÄÉÀÌ¼Ç µ¥ÀÌÅÍ
);

»ç¿ëÀÚ´Â ÀÌ ÇÔ¼ö¿¡¼­ Àü´ÞµÇ´Â ÆùÆ®ÀÇ Á¤º¸·Î ¸®½ºÆ® ¹Ú½º¿¡ À̸§À» µî·ÏÇÑ´Ù´ø°¡ ¾Æ´Ï¸é ´Ù¸¥ Àå¼Ò¿¡ Á¤º¸¸¦ º¸°üÇÏ¸é µË´Ï´Ù. ÀÌÇظ¦ µ½±â À§ÇØ °£´ÜÇÑ »óȲÀ» ¸¸µé¾î ¿¹¸¦ º¸¿©µå¸®°Ú½À´Ï´Ù.

´ëÈ­ »óÀÚ¿¡ IDC_LIST1 À̶ó´Â ¸®½ºÆ® ¹Ú½º°¡ Á¸ÀçÇÑ´Ù.
´ëÈ­ »óÀÚ°¡ ¿­·ÈÀ» ¶§ IDC_LIST1 ¹Ú½º¿¡ ÆùÆ®ÀÇ ¸ñ·ÏÀ» µî·ÏÇÑ´Ù.
À̶§ ´ëÈ­ »óÀÚÀÇ Å¬·¡½º¸íÀº CMyFontDlg ÀÌ´Ù.

 ¿ì¼± WM_INITDIALOG ¸Þ½ÃÁö¸¦ ó¸®ÇÏ´Â OnInitDialog ÇÔ¼ö¸¦ »ìÆ캸°Ú½À´Ï´Ù.

BOOL CMyFontDlg::OnInitDialog()
{
     CDialog::OnInitDialog();

     CListBox *pList = (CListBox *)GetDlgItem(IDC_LIST1);
     
     if(pList != NULL) {
          CMainFrame *pMain = (CMainFrame *)AfxGetMainWnd();
          CView *pView = pMain->GetActiveView();

          CDC *pDC = pView->GetDC();

          LOGFONT lfont;

          lfont.lfCharset = DEFAULT_CHARSET;
          lfont.lfFaceName[0] = '\0';     // NULL ½ºÆ®¸µ ¼³Á¤
          lfont.lfPitchAndFamily = 0;        // ¸ðµç ¾ð¾î ¼±ÅÃ

          // MyFontCallBack ÇÔ¼ö¿¡ lParam ÀÎÀÚ·Î pListÀÇ
          // Æ÷ÀÎÅ͸¦ Àü´ÞÇÕ´Ï´Ù.
          EnumFontFamiliesEx(pDC->m_hDC, &lfont,
               MyFontCallBack,
               (LPARAM)pList,
               0 );

          pView->ReleaseDC(pDC);
     }

     return TRUE;
}

// OnInitDialog¿¡¼­ EnumFontFamiliesEx ÇÔ¼öÀÇ lParam °ª¿¡
// CListBoxÀÇ Æ÷ÀÎÅ͸¦ ³Ö¾úÀ¸¹Ç·Î ÀÌ ÇÔ¼ö´Â È£ÃâµÇ¸é
// lParam¿¡´Â CListBoxÀÇ Æ÷ÀÎÅÍ°¡ Àü´ÞµÈ´Ù.
// ±×¸®°í °è¼Ó ÆùÆ® Á¤º¸¸¦ ¹ÞÀ¸·Á¸é 0ÀÌ ¾Æ´Ñ °ªÀ»
// ¸®ÅÏÇÏ°í, ÁßÁöÇÏ·Á¸é 0À» ¸®ÅÏÇÕ´Ï´Ù.

int CALLBACK CMyFontDlg::MyFontCallBack(ENUMLOGFONTEX *lpelfe,
     NEWTEXTMETRICEX *lpntme,
     int FontType,
     LPARAM lParam )
{
     CListBox *pList = (CListBox *)lParam;

     // listbox¿¡ ÆùÆ® À̸§À» ³Ö½À´Ï´Ù.
     // lpelfeÀÇ ´Ù¸¥ Á¤º¸¸¦ »ç¿ëÇϽ÷Á¸é µµ¿ò¸»À» ÂüÁ¶..
     if(pList->AddString(lpelfe->elfLogFont.lfFameName) == LB_ERR)
          return 0;

     return 1;
}

 µ¿ÀÛÀ» »ìÆ캸¸é ¸¸ÀÏ ½Ã½ºÅÛ¿¡ '±¼¸²Ã¼', '¹ÙÅÁü', 'µ¸¿òü' µî 3°³ÀÇ ÆùÆ®°¡ ¼³Ä¡µÅ ÀÖ´Ù°í °¡Á¤Çϸé MyFontCallBack ÇÔ¼ö´Â °¢ ÆùÆ®¸¶´Ù Çѹø¾¿ È£ÃâµÇ´Ï±î ÃÑ 3¹ø È£ÃâÀÌ µË´Ï´Ù. ÆùÆ®¿¡ ´ëÇÑ ¿ÏÀüÇÑ Á¤º¸¸¦ º¸°üÇÏ°í ½ÍÀ¸¸é LOGFONTÀÇ ¹è¿­À» ¼³Á¤ÇÑ ÈÄ CallBack ÇÔ¼ö°¡ È£ÃâµÉ ¶§¸¶´Ù ±× Á¤º¸¸¦ ÀúÀåÇÏ¸é µË´Ï´Ù.

 

- the end of this article -