WTL应用程序中的类一般分为内联函数方式和非内联函数方式,通过在WTL的应用程序向导生成时选择是否生成.cpp文件可以控制是否生成内联函数类型,另外WTL类还存在另一种部分内联方式,即在.h文件中将函数体放在类外的方式。VisualFC将根据这三种方式自动选择如何插入源代码,并与原始代码保持一致。具体介绍如下:
一、完全内联方式:对于只使用.h文件并完全使用内联函数的WTL类,在使用WTL Event和WTL Notify页面进行函数插入时将自动生成内联函数,程序代码如下:
// 注意 OnTestBtn和OnContextMenu函数是我们使用VFC的WTL类向导自动生成的
class CMainDlg : public CDialogImpl < CMainDlg > , public CUpdateUI < CMainDlg > ,
public CMessageFilter, public CIdleHandler
... {
。。。。。。
BEGIN_MSG_MAP(CMainDlg)
COMMAND_ID_HANDLER(IDC_TEST_BTN, OnTestBtn)
MESSAGE_HANDLER(WM_CONTEXTMENU, OnContextMenu)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
COMMAND_ID_HANDLER(ID_APP_ABOUT, OnAppAbout)
COMMAND_ID_HANDLER(IDOK, OnOK)
COMMAND_ID_HANDLER(IDCANCEL, OnCancel)
END_MSG_MAP()
。。。。。。
LRESULT OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
...{
return 0;
}
LRESULT OnTestBtn(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
...{
return 0;
}
}
二、部分内联方式:对于只使用.h文件的WTL类,可能存在部分内联方式,即部分函数内联,另一部分函数仍放在.h文件中以非内联方式存在。如果我们将一个只使用,h文件的WTL类CMainDlg中的 void CloseDialog(int nVal);函数改为非内联方式,那么VFC的WTL向导将发现这种部分内联方式的存在并自动选择使用非内联的方式进行函数插入,注意插入位置仍然选择在.h文件之中。代码如下:
// 部分内联方式,注意OnTestBtn和OnContextMenu是VFC自动生成的
class CMainDlg : public CDialogImpl < CMainDlg > , public CUpdateUI < CMainDlg > ,
public CMessageFilter, public CIdleHandler, public CDialogFont < CMainDlg >
... {
。。。。。。
BEGIN_MSG_MAP(CMainDlg)
COMMAND_ID_HANDLER(IDC_TEST_BTN, OnTestBtn)
MESSAGE_HANDLER(WM_CONTEXTMENU, OnContextMenu)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
COMMAND_ID_HANDLER(ID_APP_ABOUT, OnAppAbout)
COMMAND_ID_HANDLER(IDOK, OnOK)
COMMAND_ID_HANDLER(IDCANCEL, OnCancel)
END_MSG_MAP()
。。。。。。
void CloseDialog(int nVal);
LRESULT OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnTestBtn(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
} ;
// 我们手工将CloseDialog改为非内联方式,VFC将识别这种区别并采用。
void CMainDlg::CloseDialog( int nVal)
... {
}
LRESULT CMainDlg::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled)
... {
return 0;
}
LRESULT CMainDlg::OnTestBtn(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL & bHandled)
... {
return 0;
}
三、完全非内联方式: 对于使用了.h文件和.cpp文件的WTL类,在使用WTL Event和WTL Notify页面进行函数插入时VFC将自动生成非内联函数,代码如下:
// 注意OnTestBtn和OnContextMenu是使用VFC自动生成的
class CMainDlg : public CDialogImpl < CMainDlg > , public CUpdateUI < CMainDlg > ,
public CMessageFilter, public CIdleHandler
... {
。。。。。。
BEGIN_MSG_MAP(CMainDlg)
COMMAND_ID_HANDLER(IDC_TEST_BTN, OnTestBtn)
MESSAGE_HANDLER(WM_CONTEXTMENU, OnContextMenu)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
COMMAND_ID_HANDLER(ID_APP_ABOUT, OnAppAbout)
COMMAND_ID_HANDLER(IDOK, OnOK)
COMMAND_ID_HANDLER(IDCANCEL, OnCancel)
END_MSG_MAP()
。。。。。。
LRESULT OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnTestBtn(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
} ;
// 注意OnTestBtn和OnContextMenu是VFC自动生成的
。。。。。。
LRESULT CMainDlg::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled)
... {
return 0;
}
LRESULT CMainDlg::OnTestBtn(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL & bHandled)
... {
return 0;
}
四、VFC 选择是否生成内联函数的依据,VFC通过在类CMainDlg中查找是否有非内联函数来判断是否生成非内联方式,如果没有发现非内联函数则插入函数时自动生成内联函数,否则生成非内联函数。