1銆佹秷鎭槧灏勭殑閾炬帴
濡傛灉杩欎釜绫绘槸ATL绐楀彛绫伙紝鎴戜滑鍙互浠庤繖涓獥鍙g被娲剧敓鑷繁鐨勭被锛屽氨璞ase Class Chaining涓弿杩扮殑涓鏍枫?BR>class CBase : public CWindowImpl<CBase>
{
public:
BEGIN_MSG_MAP(CBase)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
MESSAGE_HANDLER(WM_LBUTTONDOWN, OnButtonDown)
ALT_MSG_MAP(100)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
MESSAGE_HANDLER(WM_LBUTTONDOWN, OnButtonDown2)
END_MSG_MAP()
public:
CBase();
virtual ~CBase();
LRESULT OnDestroy(UINT, WPARAM, LPARAM, BOOL&)
{
PostQuitMessage(0);
return 0;
}
LRESULT OnButtonDown(UINT, WPARAM, LPARAM, BOOL&)
{
MessageBox("baseclass : button down\n");
return 0;
}
LRESULT OnButtonDown2(UINT, WPARAM, LPARAM, BOOL&)
{
MessageBox("baseclass : button down2\n");
return 0;
}
};
class CDerived: public CBase
{
BEGIN_MSG_MAP(CDerived)
MESSAGE_HANDLER(WM_LBUTTONDOWN, OnButtonDown)
CHAIN_MSG_MAP_ALT(CBase, 100) //閾炬帴鍒板熀绫?BR> END_MSG_MAP()
LRESULT OnButtonDown(UINT, WPARAM, LPARAM, BOOL& bHandle)
{
MessageBox("derivedclass : button down\n");
bHandle = FALSE; //鍐冲畾鏄惁缁х画浼犳秷鎭?BR> return 0;
}
};
2銆佽秴绫诲寲
濡傛灉鎴戜滑鎯虫墿灞曚竴涓瀹氫箟鐨勭獥鍙g被锛堝鎸夌航绫绘垨鍒楄〃妗嗙被锛夌殑鍔熻兘锛屾垜浠彲浠ヨ秴绫诲寲瀹冦傚氨鏄垱寤轰竴涓熀浜庤繖涓瀹氫箟绫荤殑鏂扮被锛屽苟鍦ㄦ秷鎭槧灏勮〃涓坊鍔犳秷鎭槧灏勪互澧炲己瀹冪殑鍔熻兘銆傝繖涓湪浣跨敤MFC寮鍙戜娇鐢ㄦ渶澶氥?BR>class CBeepButton : public CWindowImpl<CBeepButton>
{
public:
CBeepButton();
virtual ~CBeepButton();
DECLARE_WND_SUPERCLASS(_T("BeepButton"), _T("Button"))
BEGIN_MSG_MAP(CBeepButton)
MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown)
END_MSG_MAP()
LRESULT OnLButtonDown(UINT, WPARAM, LPARAM, BOOL& bHandled)
{
MessageBeep(MB_ICONASTERISK);
bHandled = FALSE; //缁х画璋冪敤鍩虹被鐨勫嚱鏁?BR> return 0;
}
};
3銆佸瓙绫诲寲
鏈変簺鏃跺欙紝鎴戜滑闇瑕佹敼鍙樹竴涓凡缁忓瓨鍦ㄧ殑绐楀彛瀹炰緥鐨勮涓猴紝鑰屼笉鏄竴涓獥鍙g被鈥斺旀垨璁告垜浠璁╀竴涓璇濇涓婄殑缂栬緫妗嗗仛鐐逛粈涔堢壒鍒殑浜嬫儏銆傚湪杩欑鎯呭喌涓嬶紝鎴戜滑鍙互鍐欎竴涓柊鐨凙TL绐楀彛绫伙紝骞跺瓙绫诲寲杩欎釜宸茬粡瀛樺湪鐨勭紪杈戞銆備换浣曟湰璇ュ彂閫佸埌杩欎釜缂栬緫妗嗙殑娑堟伅閮戒細鍏堣鍙戦佸埌杩欎釜瀛愮被鐨勫璞°?BR>
class CNoNumEdit : public CWindowImpl<CNoNumEdit>
{
public:
CNoNumEdit();
virtual ~CNoNumEdit();
BEGIN_MSG_MAP(CNoNumEdit)
MESSAGE_HANDLER(WM_CHAR, OnChar)
END_MSG_MAP()
LRESULT OnChar(UINT, WPARAM wParam, LPARAM, BOOL& bHandled)
{
TCHAR ch = wParam;
if(_T('0')<=ch && ch<=_T('9'))
MessageBeep(0);
else
bHandled = FALSE; //涓嶅鐞嗭紝浜ょ粰缂栬緫妗嗚嚜宸卞鐞?BR> return 0;
}
};
4銆佸鍣ㄧ獥鍙?BR>
鍙﹀涓绉嶅彲閫夌殑鏂规硶锛氭垜浠篃鍙互璁╄繖涓紪杈戞鎴愪负涓涓鍖呭惈鐨勭獥鍙o紝鎵鏈夊彂閫佸埌杩欎釜缂栬緫妗嗙殑娑堟伅閮戒細缁忚繃瀹冪殑瀹瑰櫒绐楀彛锛涙垜浠彲浠ュ湪杩欎釜瀹瑰櫒绐楀彛涓负杩欎釜琚寘鍚殑绐楀彛瀹炵幇鐗规畩鐨勬秷鎭鐞嗐?BR>
class CMyWindow : public CWindowImpl<CMyWindow>
{
public:
CMyWindow();
virtual ~CMyWindow();
BEGIN_MSG_MAP( CMyWindow )
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
ALT_MSG_MAP(99) //contained window's messages come here...
MESSAGE_HANDLER(WM_CHAR, OnChar)
END_MSG_MAP()
LRESULT OnCreate(UINT, WPARAM, LPARAM, BOOL&)
{
RECT rc = { 10, 10, 200, 35 };
m_wndContained.Create(m_hWnd, rc, _T("non-numeric edit"),
WS_CHILD|WS_VISIBLE|WS_BORDER, 0, 666);
return 0;
}
LRESULT OnChar(UINT, WPARAM wParam, LPARAM, BOOL& bHandled)
{
TCHAR ch = wParam;
if(_T('0')<=ch && ch<=_T('9'))
MessageBeep( 0 );
else
bHandled = FALSE; //涓嶅鐞嗭紝浜ょ粰缂栬緫妗嗚嚜宸卞鐞?BR> return 0;
}
LRESULT OnDestroy(UINT, WPARAM, LPARAM, BOOL&)
{
PostQuitMessage( 0 );
return 0;
}
private:
CContainedWindow m_wndContained;
};
CMyWindow::CMyWindow() : m_wndContained(_T("edit"), this, 99)
{
}
5銆佹秷鎭弽灏?BR>
鏈鍚庣殑涓绉嶆柟娉曞氨鏄秷鎭弽灏勶紝褰撲竴涓獥鍙f敹鍒颁竴涓秷鎭悗涓嶅鐞嗗畠锛岃屾槸鍙嶅皠缁欏彂閫佽繖涓秷鎭殑绐楀彛鑷繁澶勭悊锛岃繖绉嶆妧鏈彲浠ョ敤鏉ュ垱寤鸿嚜鍖呭惈鐨勬帶浠躲?BR>
class CStaticLink : public CWindowImpl<CStaticLink>
{
public:
DECLARE_WND_SUPERCLASS(_T("StaticLink"), _T("Static"))
CStaticLink();
virtual ~CStaticLink();
void SetLinkText(LPCTSTR szLink)
{
USES_CONVERSION;
m_bstrLink = T2OLE(szLink);
}
BEGIN_MSG_MAP(CStaticLink)
//uses message reflection: WM_* comes back as OCM_*
MESSAGE_HANDLER(OCM_COMMAND, OnCommand)
MESSAGE_HANDLER(OCM_CTLCOLORSTATIC, OnCtlColor)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy) //not a reflected message
DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()
LRESULT OnDestroy(UINT, WPARAM, LPARAM, BOOL&)
{
if(m_hFont)
{
DeleteObject(m_hFont);
m_hFont = NULL;
}
return 0;
}
LRESULT OnCommand(UINT, WPARAM wParam, LPARAM, BOOL&)
{
USES_CONVERSION;
int code = HIWORD(wParam);
if(code==STN_CLICKED || code==STN_DBLCLK)
{
if(m_bstrLink.Length() == 0)
{
GetWindowText(&m_bstrLink);
}
if((int)ShellExecute(m_hWnd, _T("open"),
OLE2T(m_bstrLink), NULL, NULL, SW_SHOWNORMAL) > 32)
{
m_bVisited = TRUE; //return codes>32 => success
Invalidate();
}
else
{
MessageBeep(0);
ATLTRACE(_T("Error: CStaticLink couldn't open file"));
}
}
return 0;
}
LRESULT OnCtlColor(UINT, WPARAM wParam, LPARAM, BOOL&)
{
// notify bit must be set to get STN_* notifications
ModifyStyle(0, SS_NOTIFY);
HBRUSH hBr = NULL;
if((GetStyle()&0xff) <= SS_RIGHT)
{
// it's a text control: set up font and colors
if(!m_hFont)
{
LOGFONT lf;
GetObject(GetFont(), sizeof(lf), &lf);
lf.lfUnderline = TRUE;
m_hFont = CreateFontIndirect(&lf);
}
HDC hDC = (HDC)wParam;
SelectObject(hDC, m_hFont);
SetTextColor(hDC, m_bVisited?m_clrVisited:m_clrUnvisited);
SetBkMode(hDC, TRANSPARENT);
hBr = (HBRUSH)GetStockObject(HOLLOW_BRUSH);
}
return (LRESULT)hBr;
}
private:
COLORREF m_clrUnvisited;
COLORREF m_clrVisited;
BOOL m_bVisited;
HFONT m_hFont;
CComBSTR m_bstrLink;
};
class CReflectDlg : public CDialogImpl<CReflectDlg>
{
public:
enum { IDD = IDD_DIALOG1 };
BEGIN_MSG_MAP(CReflectDlg)
COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, OnClose)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
REFLECT_NOTIFICATIONS() //reflect messages back to static links
END_MSG_MAP()
LRESULT OnInitDialog(UINT, WPARAM, LPARAM, BOOL&)
{
CenterWindow( GetParent() );
//a textual static control:
s1.SubclassWindow(GetDlgItem(IDS_TEST1));
//a static control displaying an icon
s2.SubclassWindow(GetDlgItem(IDS_TEST2));
//set the icon's link
s2.SetLinkText(_T("http://www.microsoft.com"));
return 0;
}
LRESULT OnClose(UINT, WPARAM wID, HWND, BOOL&)
{
EndDialog(wID);
return 0;
}
private:
CStaticLink s1, s2;
};
浠ヤ笂渚挎槸杩?绉嶆柟娉曪紝鍦ㄨ蒋浠惰璁℃椂鏈夋椂鍊欒揪鍒颁竴涓洰鐨勭殑鏂规硶寰堝锛岃繖鏃跺欐渶閲嶈鐨勫氨鏄夋嫨鏈閫傚悎鐨勬柟娉曪紝浣块」鐩敼鍔ㄦ洿灏忥紝鎵╁睍鏈濂姐?BR>
涓嬭浇鎵鏈夋紨绀轰緥瀛?/A>
posted on 2006-01-02 15:29
涓囪繛鏂?/a> 闃呰(114) 璇勮(0) 缂栬緫 鏀惰棌 鏀惰棌鑷?65Key 鎵灞炲垎绫?
ATL