;
帖子
3919 
精华
积分
11710 
鱼币
0 ¥ 
来自
大连 
在线时间
1858 小时 
注册时间
2007-6-11 
最后登录
2009-10-20 

贴图大师勋章新人进步勋章宣传大使勋章论坛元老勋章

3
发表于 2009-1-5 19:48 | 只看该作者
VC鍒濆鑰呭叆闂ㄧ郴鍒椾箣浜岋細娑堟伅寰幆 - 缂栫▼搴 - Powered by SupeSite

浣犵殑浣嶇疆锛缂栫▼搴 >> 璧勮 >> VC >> 绯荤粺骞冲彴 >> 璇︾粏鍐呭 鍦ㄧ嚎鎶曠ǹ

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,鈥︹);

鎵撳嵃 | 鏀惰棌姝ら〉 |  鎺ㄨ崘缁欏ソ鍙 | 涓炬姤
涓婁竴绡 涓嬩竴绡
 

璇勫垎锛0

鍙戣〃璇勮
鏌ョ湅鍏ㄩ儴鍥炲銆愬凡鏈0浣嶇綉鍙嬪彂琛ㄤ簡鐪嬫硶銆