正在阅读:VC++动态链接库(DLL)编程深入浅出(四)VC++动态链接库(DLL)编程深入浅出(四)

2005-11-09 11:43 出处:PConline 作者:宋宝华 责任编辑:xietaoming

6.2 MFC扩展DLL的调用

  在DLL所在工作区新增一个dllcall工程,它是一个基于对话框的MFC EXE程序。在其中增加两个按钮SXBUTTON1、SXBUTTON2,并设置其属性为“Owner draw”,如图17。

图17 设置按钮属性为“Owner draw”

  在工程中添加两个ICON资源:IDI_MSN_ICON(MSN的图标)、IDI_REFBAR_ICON(Windows的系统图标)。

  修改工程的“calldllDlg.h”头文件为:

#include "..\..\mfcexpenddll\SXBUTTON.h"  //包含dll的导出类头文件
#pragma comment(lib,"mfcexpenddll.lib")    //隐式链接dll
/////////////////////////////////////////////////////////////////////////////
// CCalldllDlg dialog

class CCalldllDlg : public CDialog
{
// Construction
public:
 CCalldllDlg(CWnd* pParent = NULL); // standard constructor

// Dialog Data
 //{{AFX_DATA(CCalldllDlg)
 enum { IDD = IDD_CALLDLL_DIALOG };
//增加与两个按钮对应的成员变量
 CSXButton m_button1;  
 CSXButton m_button2;

}

  同时,修改“calldllDlg.cpp”文件,使得m_button1、m_button2成员变量与对话框上的按钮控件建立关联:

void CCalldllDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 //{{AFX_DATA_MAP(CCalldllDlg)
 DDX_Control(pDX, IDC_BUTTON2, m_button2);
 DDX_Control(pDX, IDC_BUTTON1, m_button1);
 //}}AFX_DATA_MAP
}

  修改BOOL CCalldllDlg::OnInitDialog()函数,在其中增加对两个按钮设置ICON的代码:

BOOL CCalldllDlg::OnInitDialog()
{
 CDialog::OnInitDialog();

 // Add "About..." menu item to system menu.

 // IDM_ABOUTBOX must be in the system command range.
 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
 ASSERT(IDM_ABOUTBOX < 0xF000);

 CMenu* pSysMenu = GetSystemMenu(FALSE);
 if (pSysMenu != NULL)
 {
  CString strAboutMenu;
  strAboutMenu.LoadString(IDS_ABOUTBOX);
  if (!strAboutMenu.IsEmpty())
  {
   pSysMenu->AppendMenu(MF_SEPARATOR);
   pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  }
 }

 // Set the icon for this dialog.  The framework does this automatically
 //  when the application's main window is not a dialog
 SetIcon(m_hIcon, TRUE);   // Set big icon
 SetIcon(m_hIcon, FALSE);  // Set small icon

 // TODO: Add extra initialization here
 m_button1.SetIcon(IDI_MSN_ICON,16,16);
 m_button2.SetIcon(IDI_REFBAR_ICON,16,16);

 return TRUE;  // return TRUE  unless you set the focus to a control
}

  运行程序,将出现如图18的对话框,图形和文字同时出现在按钮上,这说明我们正确地调用了MFC扩展DLL。

图18 DLL扩展的按钮被显示

  如果我们不修改void CCalldllDlg::DoDataExchange(CDataExchange* pDX),即不增加下列代码:

DDX_Control(pDX, IDC_BUTTON2,  m_button2);
DDX_Control(pDX, IDC_BUTTON1,  m_button1);

  我们也可以在BOOL CCalldllDlg::OnInitDialog()函数中添加如下代码实现m_button1、m_button2与IDC_BUTTON1、IDC_BUTTON2的关联:

m_button1.SubclassDlgItem(IDC_BUTTON1, this);
m_button2.SubclassDlgItem(IDC_BUTTON2, this);

  但是,DDX_Control与按钮类的SubclassDlgItem成员函数不能同时存在,否则程序会出错。

6.3 总结

  由以上分析可知,MFC扩展DLL的导出与引用方式与前几节所讲述的方式没有太大的差别,MFC扩展DLL主要强调对MFC进行功能扩展。因此,如果DLL的目标不是增强MFC的功能,其与应用程序的接口也不是MFC,请不要将DLL建立为MFC扩展DLL。

  下载本文相关源代码。 (58.3KB, Winzip压缩)

  (作者E-mail: 21cnbao@21cn.com

键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品