VisualFC使用 - 内联函数选择,与原始代码保持一致

       WTL应用程序中的类一般分为内联函数方式和非内联函数方式,通过在WTL的应用程序向导生成时选择是否生成.cpp文件可以控制是否生成内联函数类型,另外WTL类还存在另一种部分内联方式,即在.h文件中将函数体放在类外的方式。VisualFC将根据这三种方式自动选择如何插入源代码,并与原始代码保持一致。具体介绍如下:

      一、完全内联方式:对于只使用.h文件并完全使用内联函数的WTL类,在使用WTL Event和WTL Notify页面进行函数插入时将自动生成内联函数,程序代码如下:

// 文件 maindlg.h
// 注意 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文件之中。代码如下:

// maindlg.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将自动生成非内联函数,代码如下:

// maindlg.h文件
// 注意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);
}
;
// maindlg.cpp文件
// 注意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中查找是否有非内联函数来判断是否生成非内联方式,如果没有发现非内联函数则插入函数时自动生成内联函数,否则生成非内联函数。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值