VC鍒濆鑰呭叆闂ㄧ郴鍒椾箣浜岋細娑堟伅寰幆
鍙戝竷: 2008-6-26 12:04 | 浣滆: admin | 鏌ョ湅: 46娆
涓銆佷紶缁烻DK绋嬪簭鐨勬秷鎭惊鐜
鍦ㄤ紶缁熺殑SDK绋嬪簭涓紝娑堟伅寰幆鏄緢绠鍗曠殑锛屼篃璁镐綘涓嶄俊锛岄偅鎴戜滑灏辩湅鐪嬩笅闈㈣繖娈典唬鐮佸惂锛
#include
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("HelloWin") ;
WNDCLASwndclass ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.lpszClassName= szAppName ;
RegisterClass (&wndclass);
hwnd = CreateWindow( szAppName,鈥︹,NULL);
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
鈥︹︹
case WM_PAINT:
鈥︹︹
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
銆銆鍦╓inMain 涓 CreateWindow閫氳繃涓涓弬鏁板皢鍒涘缓鐨勭獥鍙e拰绐楀彛绫伙紙瑙"绐楀彛绫荤殑璇炵敓"涓鏂囷級鑱旂郴璧锋潵锛岃繖鏍疯绐楀彛鐨勬墍鏈夋秷鎭兘灏嗗彂閫佸埌璇ョ獥鍙g被鐨勭獥鍙e嚱鏁癢ndProc锛屽叾鍚嶹ndProc鏍规嵁涓嶅悓鐨勬秷鎭粰浜堜笉鍚岀殑鍔ㄤ綔銆
浜屻丮FC鏈熸湜鐨勬秷鎭惊鐜
銆銆鍦ㄤ紶缁熺殑SDK绋嬪簭涓秷鎭惊鐜槸闈炲父绠鍗曠殑锛屽苟涓斿皢绐楀彛鍜岀獥鍙e嚱鏁扮粦瀹氬湪涓璧枫傝屽湪MFC涓氨鍑虹幇浜嗛棶棰橈紝姣斿CDocument绫伙紝涓嶆槸绐楀彛锛屾墍浠ユ病鏈夌獥鍙g被锛屼絾鏄垜涔熸兂璁╁畠鍝嶅簲娑堟伅锛屾庡姙锛熼棶棰樹笉浠呬粎濡傛锛屾垜浠啀鐪嬬湅MFC鐨勬秷鎭紝灏变細鍙戠幇鏇村闂銆
銆銆MFC灏嗘秷鎭垎涓轰笁澶х被锛1.鏍囧噯娑堟伅锛屽嵆闄M_COMMAND涔嬪鐨勪换浣昗M_寮澶寸殑娑堟伅锛屼换浣曟淳鐢熻嚜CWnd鐨勭被閮藉彲浠ユ帴鍙楄娑堟伅锛屽苟鎸夌収缁ф壙鍏崇郴鎺ュ彈锛堝浠嶤ScrollView鍒癈View鍐嶅埌CWnd锛夈2.鍛戒护娑堟伅锛屽嵆WM_COMMAND锛屼换浣曟淳鐢熻嚜CCmdTarget鐨勭被锛屽吋鍙帴鍙楄娑堟伅锛屾帴鍙楅『搴忓涓嬪浘鎵绀猴紝鍏朵腑鏍囧彿鏍囨敞浜嗘帴鍙楁秷鎭殑椤哄簭锛岀澶翠唬琛ㄨ皟鐢ㄩ『搴 锛
鍥1 娑堟伅鐨勬嫄寮祦鍔
3.Control Notification,閫氱煡绫绘秷鎭紝涔熶互WM_COMMAND褰㈠紡鍑虹幇锛岀敱鎺т欢浜х敓锛岄氱煡鍏剁埗绐楀彛銆
涓夈佹秷鎭畯鑳屽悗鐨勭瀵
銆銆鐭ラ亾浜哅FC娑堟伅娴佸姩鐨勮姹傦紝閭FC鏄庢牱瀹炵幇鐨勫憿锛熷綋涓涓秷鎭嚭鐜版椂锛孉pplication FrameWork鎬庝箞鐭ラ亾灏嗚娑堟伅鍙戦佺粰鍝釜瀵硅薄鐨勫憿锛熷叾瀹為兘鏄疌CmdTarget绫诲湪浣滄紝鎵鏈夎兘澶熸帴鍙楁秷鎭殑绫婚兘蹇呴』缁ф壙浜嶤CmdTarget绫伙紝鍥犱负杩欎簺绫婚兘涓涓叡鍚岀殑鐗瑰緛锛氬惈鏈塂ECLARE_MESSAGE_MAP銆丅EGIN_MESSAGE_MAP銆丒ND_MESSAGE_MAP涓変釜瀹忋傚晩锛佸氨杩欎笁涓畯缁勭粐浜嗕竴寮犲簽澶х殑娑堟伅鏄犲皠缃戯紝涔熻浣犱笉淇★紝閭f垜浠氨鐪嬬湅杩欎笁涓畯鏄庢牱瀹氫箟鐨勶細 #define DECLARE_MESSAGE_MAP()\
private:\
static const AFX_MSGMAP_ENTRY _messageEntries[];\
protected:
static AFX_DATA const AFX_MSGMAP messageMap;\
virtual const AFX_MSGMAP* GetMessageMap() const;\
#define BEGIN_MESSAGE_MAP(theClass, baseClass)\
const AFX_MSGMAP* theClass::GetMessageMap() const\
{return &theClass::messageMap;}\
AFX_DATADEF const AFX_MSGMAP theClass::messageMap = \
{&baseClass::messageMap, &theClass::_messageEntries[0]};\
const AFX_MSGMAP_ENTRY theClass::_messageEntries[]=\
{\
#define END_MESSAGE_MAP()\
{0,0,0,0,AfxSig_end,(AFX_pMSG)0}\
};\
typedef void (AFX_MSG_CALL CCmdTarget::*AFX_PMSG)(void);
struct AFX_MSGMAP_ENTRY
{
UINT nMessage;
UINT nCode;
UINT nID;
UINT nLastID;
UINT nSig;
AFX_PMSG pfn;
};
struct AFX_MSGMAP
{
const AFX_MSGMAP* pBaseMap;
const AFX_MSGMAP_ENTRY* lpEntries;
};
銆銆鍙互鐪嬪嚭DECLARE_MESSAGE_MAP瀹忓湪鍏剁被涓敵璇蜂簡涓涓叏灞缁撴瀯鍜岃幏寰楄缁撴瀯鐨勫嚱鏁帮紝鑰屽湪BEGIN_MESSAGE_MAP鍜孍ND_MESSAGE_MAP涔嬮棿濉啓鍒氭墠鐨勫叏灞缁撴瀯锛屽皢娑堟伅鍜屽搴旂殑澶勭悊鍑芥暟鑱旂郴璧锋潵锛屽苟閫氳繃AFX_MSGMAP涓殑pBaseMap鎸囬拡锛屽皢鍚勭被鎸夌户鎵块『搴忚繛鎺ヨ捣鏉ワ紝浠庤屾彁渚涙秷鎭祦鍔ㄧ殑閬撹矾锛堝嵆娑堟伅鐨勭洿娴侊紝婊¤冻鏍囧噯娑堟伅娴佸姩鐨勮姹傦級銆
涓嬮潰鎴戜滑涓句釜渚嬪瓙锛 CMyWnd : public CWnd
{
鈥︹
DECLARE_MESSAGE_MAP()
}
BEGIN_MESSAGE_MAP(CMyWnd,CWnd)
ON_WM_CREATE()
ON_WM_PAINT()
END_MESSAGE_MAP()
琚睍寮鍚庯紝浠g爜濡備笅锛 CMyWnd:public CWnd
{
鈥︹
private:
static const AFX_MSGMAP_ENTRY _messageEntries[];
protected:
static AFX_DATA const AFX_MSGMAP messageMap;
virtual const AFX_MSGMAP* GetMessageMap() const;
}
const AFX_MSGMAP* CMyWnd::GetMessageMap() const
{ return &CMyWnd::messageMap;}
AFX_DATADEF const AFX_MSGMAP CMyWnd::messageMap=
{&CWnd::messageMap, &CMyWnd::_messageEntries[0]};
const AFX_MSGMAP_ENTRY CMyWnd::_messageEntries[]=
{
{WM_CREATE,0,0,0,AfxSig_is,
(AFX_PMSG)(AFX_PMSGW)(int(AFX_MSG_CALL CWnd::*)(LPCREATESTRUCT))OnCreate},
{WM_PAINT,0,0,0,AfxSig_vv,
(AFX_PMSG)(AFX_PMSGW)(void (AFX_MSG_CALL CWnd::*)(void))OnPaint},
{0,0,0,0,AfxSig_end,(AFX_PMSG)0}
};
銆銆杩欐牱 WM_CREATE,WM_PAINT 鍦ㄦ秷鎭綉涓祦鍔紝褰撴祦鍒癈MyWnd绫荤殑 messageMap 缁撴瀯鏃讹紝鍙戠幇鏈夎娑堟伅鐨勮褰曪紝鍒欒皟鐢ㄨ褰曚腑璁拌浇鐨 OnCreate 鍜 OnPaint 鍑芥暟锛岃繘琛屽搷搴旀秷鎭紝浠庤屽畬鎴愪簡 Windows 娑堟伅椹卞姩鏈哄埗銆
鍥涖丮FC娑堟伅鐨勮捣鐐
銆銆鎴戜滑宸茬粡寤虹珛浜嗕竴寮犳秷鎭祦鍔ㄧ綉缁滐紝浣嗘槸娑堟伅鏄庢牱浠庝骇鐢熷埌鍝嶅簲鍑芥暟鏀跺埌璇ユ秷鎭紝鑰屼笖鏍囧噯娑堟伅闇瑕佺洿娴侊紝鍛戒护娑堟伅杩樻湁璁稿鎷愬集锛堝湪鏍囬浜屼腑鍙互鐪嬪埌锛夈備笉瑕佺揣寮狅紝鎴戜滑鍙渶瑕佺湅鐪婱FC鏄庢牱瀹炵幇鐨勩
銆銆涓嶇鎬庝箞璇达紝瀵广Windows 绯荤粺鏉ヨ閮芥槸涓鏍风殑锛屽畠閮芥槸涓嶆柇鍦扮敤GetMessage锛堟垨鑰呭叾瀹冿級浠庢秷鎭槦鍒椾腑鍙栧嚭娑堟伅锛岀劧鍚庣敤DispatchMessage灏嗘秷鎭彂閫佸埌绐楀彛鍑芥暟涓幓銆傚湪"绐楀彛绫荤殑璇炵敓"涓煡閬擄紝MFC灏嗘墍鏈夌殑绐楀彛澶勭悊鍑芥暟閮芥敞鍐屾垚DefWndProc锛岄偅鏄笉鏄疢FC灏嗘墍鏈夌殑娑堟伅閮藉彂閫佸埌DefWndProc涓幓浜嗗憿锛熷緢鎶辨瓑涓嶆槸锛岃屾槸閮藉彂閫佸埌浜咥fxWndProc鍑芥暟鍘讳簡銆備綘鍙兘瑕侀棶涓轰粈涔堬紝杩欎篃鏄垜鎯崇煡閬撶殑锛岄偅鎴戜滑灏辩湅鐪婱FC浠g爜鍚э細 BOOL CWnd::CreateEx(鈥︹)
{
鈥︹
PreCreateWindow(cs);
AfxHookWindowCreate(this);
HWND hWnd = ::CreateWindowEx(鈥︹);
鈥︹
}
void AFXAPI AfxHookWindowCreate(CWnd *pWnd)
{
鈥︹
pThreadState->m_hHookOldCbtFilter =
::SetWindowsHookEx(WH_CBT,_AfxCbtFilterHook,NULL,::GetCurrentThreadId());
鈥︹
}
_AfxCbtFilterHook(int code, WPARAM wParam, LPARAM lParam)
{
鈥︹
if(!afxData.bWin31)
{
_AfxStandardSubclass((HWND)wParam);
}
鈥︹
}
void AFXAPI _AfxStandardSubclass(HWND hWnd)
{
鈥︹
oldWndProc =
(WNDPROC)SetWindowLong(hWnd,GWL_WNDPROC,(DWORD)AfxGetAfxWndProc());
}
WNDPROC AFXAPI AfxGetAfxWndProc()
{
鈥︹
return &AfxWndProc;
}
銆銆鐪嬩簡涓婇潰鐨勪唬鐮侊紝涓嶇煡浣犳湁娌℃湁浜嗙劧浜庤兏鐨勬劅瑙"鍟婏紝鍘熸潵鏄繖鏍峰憖锛"鍏跺疄MFC鍦≒reCreateWindow娉ㄥ唽绐楀彛绫讳箣鍚庯紝鍦ㄥ垱寤虹獥鍙d箣鍓嶏紝璋冪敤浜咥fxHookWindowCreate鍑芥暟锛岃鍑芥暟璁剧疆浜嗛挬瀛愶紙閽╁瓙鐢⊿etWinowsHook鎴栬匰etWindowsHookEx璁剧疆锛岃繖鏍锋秷鎭湁婊¤冻璁剧疆鐨勬秷鎭椂锛岀郴缁熷氨鍙戦佺粰浣犺缃殑鍑芥暟锛岃繖閲屾槸_AfxCbtFilterHook鍑芥暟锛夛紝杩欐牱姣忔鍒涘缓绐楀彛鐨勬椂鍊欙紝璇ュ嚱鏁板氨灏嗙獥鍙e嚱鏁颁慨鏀规垚AfxWndProc銆傝嚦浜庝负浠涔堣繖鏍峰仛鍚楋紵閭f槸涓轰簡鍖呭鏂扮殑3D鎺т欢鑰屽張鍚孧FC2.5鍏煎銆
浜斻丮FC娑堟伅鐨勬祦鍔
銆銆娑堟伅鐨勮捣鐐规槸AfxWndProc鍑芥暟锛屾墍鏈夌殑娑堟伅閮借鍙戦佸埌AfxWndProc锛屼篃浠嶢fxWndProc鍐嶆娴佸悜鍚勮嚜鐨勬秷鎭搷搴斿嚱鏁扮殑锛屾庝箞娴佺殑鍛紵閭e彧鏈塎FC鐭ラ亾锛 LRESULT CALLBACK AfxWndProc(鈥︹.)
{
鈥︹
return AfxCallWndProc(pWnd,hWnd,nMsg,wParam,lParam);
}
LRESULT AFXAPI AfxCallWndProc(鈥︹)
{
鈥︹
lResult = pWnd->WindowProc(nMsg,wParam,lParam);
鈥︹
}
LRESULT CWnd::WindowProc(鈥︹)
{
鈥︹
if(!OnWndMsg(message,wParam,lParam,&lResult))
lResult = DefWindowProc(message,wParam,lParam);
鈥︹
}
BOOL CWnd::OnWndMsg(鈥︹)//璇ュ嚱鏁板師鏉ュお杩囧簽澶э紝琚垜鏀归犱簡涓涓嬶紝鍙弽鏄犳剰鎬濓紝涓嶈兘鎵ц
{
鈥︹
if(message == WM_COMMAND)
OnCommand(wParam,lParam);
if(message == WM_NOTIFY)
OnNotify(wParam,lParam,&lResult);
pMessage = GetMessageMap();
for(; pMessageMap!=NULL; pMessageMap = pMessageMap->pBaseMap)
{
if((lpEntry=AfxFindMessageEntry(pMessageMap->lpEntries,
message,0,0))!=NULL)
break;
}
(this->*(lpEntry->pnf))(鈥︹);//璋冪敤娑堟伅鍝嶅簲鍑芥暟
}
AFX_MSGMAP_ENTRY AfxFindMessageEntry(鈥︹)
{
鈥︹
while(lpEntry->nSign!=AfxSig_end)
{
if(lpEntry->nMessage==nMsg&&lpEntry->nCode==nCode&&nID>=lpEntry->nID
&&nID<=lpEntry->nLastID)
{
return lpEntry;
}
lpEntry++;
}
鈥︹
}
銆銆娑堟伅琚彂閫佸埌瀵瑰簲绐楀彛鐨凮nWndMsg鍚庯紝鐒跺悗鏍规嵁娑堟伅鐨勭被鍨嬮噰鍙栫浉搴斿姩浣滐細濡傛灉鏄爣鍑嗘秷鎭紝鍒欐鏌ヤ絾鍓嶇被涓湁鏃犲鐞嗗嚱鏁帮紙鐢盇fxFindMessageEntry瀹炵幇锛夛紝鑻ユ病鏈夛紝灏卞湪鍏剁埗浜茬被涓壘锛堥氳繃pMessageMap->pBaseMap瀹炵幇锛夛紝杩欐牱鏈涗笂椤哄簭鎼滅储娑堟伅缃戯紝鎼滅储缁撴潫涔熸壘涓嶅埌澶勭悊鍑芥暟锛岄偅涔堝洖鍒癢indowProc鍑芥暟璋冪敤榛樿DefWindowProc鍑芥暟锛涘鏋滄槸鍛戒护娑堟伅鎴栭氱煡娑堟伅鍒欏彂閫佸埌OnCommand鎴栬匫nNotify鍑芥暟涓幓澶勭悊锛屾潵瀹炵幇娑堟伅鐨勬嫄寮祦鍔細 BOOL CWnd::OnCommand(WPARAM wParam,LPARAM lParam)
{
鈥︹
return OnCmdMsg(nID,nCode,NULL,NULL);
}
BOOL CFrameWnd::OnCmdMsg(鈥︹)
{
CView* pView = GetActiveView();
if(pView!=NULL&&pView->OnCmdMsg(鈥︹)) //鐩稿綋浜庡浘1涓璅rame鎸囧悜View鐨勭澶
return TRUE;
if(CWnd::OnCmdMsg(鈥︹)) //鍥1涓璅rame鑷韩
return TRUE;
CWinApp *pApp = AfxGetApp();
if(pApp != NULL && pApp->OnCmdMsg(鈥︹)) //鍥1涓瑿WinApp瀵硅薄
return TRUE;
return FALSE;
}
BOOL CView::OnCmdMsg(鈥︹)
{
if(CWnd::OnCmdMsg(鈥︹)) //鍥1涓璙iew鏈韩
return TRUE;
if(m_pDocument!=NULL) m_pDocument->OnCmdMsg(鈥︹);//鍥1涓璙iew鍒癉oc绠ご
鈥︹
}
BOOL CDocument::OnCmdMsg(鈥︹)
{
if(CCmdTarget::OnCmdMsg(鈥︹)) //鍥1涓璂oc鏈韩
return TRUE;
if(m_pDocTemplate!=NULL&&m_pDocTemplate->OnCmdMsg(鈥︹))//鍥1涓璂oc Template
return TRUE;
return FALSE;
}
BOOL CCmdTarget::OnCmdMsg(鈥︹)//娉細CWnd娌℃湁閲嶈浇CCmdTarget鐨凮nCmdMsg
{
鈥︹
for(pMessageMap=GetMessageMap();pMessageMap!=NULL;
pMessageMap=pMessageMap->pBaseMap)
{
lpEntry = AfxFindMessageEntry(pMessageMap->lpEntries,鈥︹);




发表于 2009-1-5 19:48
| 











