<´ÙÀ̾ó·Î±× ¹Ú½º ¾øÀÌ ºä ȸ鿡 ¹öÆ° ¸¸µé±â>
ºä¿¡¼ ´ÙÀ̾ó·Î±× ¹Ú½º¸¦ ¸¸µéÁö ¾Ê°í ¹öÆ°À» ºä ȸ鿡 ¸¸µå´Â ¹æ¹ýÀ» ¾Ë°í ½Í½À´Ï´Ù.
ÀϹÝÀûÀ¸·Î 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 -