……………………………………………………………………..//省略
图16 产生.map文件 (+放大该图片)
所以,对于MFC扩展DLL,我们不宜以.lib文件导出类。 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 \//包含dll的导出类头文件 #pragma comment(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 \
// 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压缩)