我在看代碼時遇到一些語法性的問題:參考下大神們的一些見解
typedef void (AFX_MSG_CALL CCmdTarget::*AFX_PMSG)(void);
這里和這個能相互轉換
(AFX_PMSG)(AFX_PMSGW) (static_cast< void (AFX_MSG_CALL CWnd::*)(CWnd*) > ( &ThisClass :: OnSetFocus)) },
這里的背景是:由于mfc要處理好多訊息,訊息處理函式有著不同的函式引數,那么無法找到一個統一的介面,mfc這里處理成所有的函式(回傳型別,引數型別、個數)轉為回傳型別為空、引數型別為空的函式,
eg: AFX_PMSG pfn=(AFX_PMSG)(AFX_PMSGW) (static_cast< void (AFX_MSG_CALL CWnd::*)(CWnd*) > ( &ThisClass :: OnSetFocus)),
那這種情況下雖然能轉換,但是卻不能直接呼叫(有點類似能強轉0為任何型別的物件,但是不能訪問他的成員)
*pfn(CWnd* ) ,//不能編譯通過
那么mfc里采取的辦法是定義一個共用體,節省記憶體
union MessageMapFunctions
{
AFX_PMSG pfn; // generic member function pointer
BOOL (AFX_MSG_CALL CCmdTarget::*pfn_b_D)(CDC*);
.........
}和一個標識回傳值和形參的
enum AfxSig
{
AfxSig_end = 0, // [marks end of message map]
AfxSig_b_D_v, // BOOL (CDC*)
AfxSig_b_b_v, // BOOL (BOOL)
AfxSig_b_u_v, // BOOL (UINT)
AfxSig_b_h_v, // BOOL (HANDLE)
........
}
根據AfxSig ,回呼函式pfn來選取回呼函式的引數,
case AfxSigCmd_b:
// normal command or control notification
ASSERT(CN_COMMAND == 0); // CN_COMMAND same as BN_CLICKED
ASSERT(pExtra == NULL);
bResult = (pTarget->*mmf.pfnCmd_b_v)();
break;
case AfxSigCmd_RANGE:
// normal command or control notification in a range
ASSERT(CN_COMMAND == 0); // CN_COMMAND same as BN_CLICKED
ASSERT(pExtra == NULL);
(pTarget->*mmf.pfnCmd_v_u)(nID);
break;
是不是那么一回事啊,
uj5u.com熱心網友回復:
順便再多加一個問題:本身windows下的靜態庫和動態庫都會使用了,但是遇到一個問題main函式可以制作成靜態庫由另一個模塊鏈接,但是為啥不能做成動態庫給其他模塊鏈接使用呢?求解mfc的是WinMain是怎么做到的
uj5u.com熱心網友回復:
附上第二個問題的示范:http://www.zhangley.com/article/mfc-winmain/
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/66061.html
上一篇:影像的傅里葉變換 matlab
