图8-8 客户程序的对话框界面
2.添加控件变量
为了动态获取用户输入的数据,我们需要为2个表示操作数据的文本编辑框,添加控件的Value值类别int型变量m_iData1和m_iData2。
3.添加事件处理
分别对5个计算按钮,为对话框类CExtClientDlg添加按钮通知消息BN_CLICKED(鼠标单击)事件的处理程序OnBnClickedAdd等。
4.编写代码
为了让客户程序可以使用DLL项目中的计算类CCompute,需要在客户程序对话框类CExtClientDlg的头文件
在ExtClientDlg.h 中
添加 #include "..\ExtDll\Compute.h"//相对路径(这个比绝对路径要好),看情况..\表示相对自己上一级目录。用来引入CCompute类。
检查class CAboutDlg : public CDialogEx 中的,对话框数据enum { IDD = 操作对话框数据ID };
在对话框类的定义中,手工添加公共型类变量和成员函数:
public: CCompute *m_pComp; void Comp(UINT nID);
ExtClientDlg.c //文件
// CExtClientDlg 对话框
class CExtClientDlg : public CDialog
{
……
public:
int m_iData1;
int m_iData2;
CCompute *m_pComp;
void Comp(UINT nID);
afx_msg void OnBnClickedAdd();
afx_msg void OnBnClickedSub();
afx_msg void OnBnClickedMul();
afx_msg void OnBnClickedDiv();
afx_msg void OnBnClickedMod();
};
在客户对话框类ExtClientDlg.cpp的初始化对话框成员函数OnInitDialog中,手工添加设置数据编辑框初值的代码(红色部分):
BOOL CExtClientDlg::OnInitDialog()
{
CDialog::OnInitDialog();
……
// TODO: 在此添加额外的初始化代码
SetDlgItemInt(IDC_DATA1, 5);
SetDlgItemInt(IDC_DATA2, 3);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
代码文件ExtClientDlg.cpp中其他新加内容有:(其中红色部分为手工添加的)
void CExtClientDlg::OnBnClickedAdd()
{
// TODO: 在此添加控件通知处理程序代码
Comp(IDC_ADD);
}
void CExtClientDlg::OnBnClickedSub()
{
// TODO: 在此添加控件通知处理程序代码
Comp(IDC_SUB);
}
void CExtClientDlg::OnBnClickedMul()
{
// TODO: 在此添加控件通知处理程序代码
Comp(IDC_MUL);
}
void CExtClientDlg::OnBnClickedDiv()
{
// TODO: 在此添加控件通知处理程序代码
Comp(IDC_DIV);
}
void CExtClientDlg::OnBnClickedMod()
{
// TODO: 在此添加控件通知处理程序代码
Comp(IDC_MOD);
}
void CExtClientDlg::Comp(UINT nID)
{
UpdateData(); // 动态获取用户输入的数据并赋值给对应的控件变量
m_pComp = new CCompute(m_iData1, m_iData2); // 创建计算对象
int r;
double dr;
switch(nID) { // 进行四则和取模运算
case IDC_ADD: r = m_pComp->Add(); break;
case IDC_SUB: r = m_pComp->Sub(); break;
case IDC_MUL: r = m_pComp->Mul(); break;
case IDC_DIV: dr = m_pComp->Div(); break;
case IDC_MOD: r = Mod(m_iData1, m_iData2); break;
}
delete m_pComp;
if (nID != IDC_DIV) SetDlgItemInt(IDC_RESULT, r); // 显示整数结果
else { // 显示除法所得的实数结果
wchar_t buf[20];
swprintf_s(buf, 20, L"%g", dr);
SetDlgItemText(IDC_RESULT, buf);
}
}
//修改点击退出按钮动作----退出
void CExtClientDlg::OnBnClickedCancel()
{
// TODO:在此添加控件通知处理程序代码
exit(0); }
8.2.7编译运行
为了运行客户程序,需要将客户程序项目设置成启动项目。具体做法是,先在项目管理区中选中ExtClient项目,然后选择菜单项“项目\设为启动项目”。
编译后,会在解决方案的Debug或Release目录中生成动态链接库文件ExtDll.dll和客户程序的可执行文件ExtClient.exe,以及DLL的导出文件ExtDll.exp和(静态连接)库文件ExtDll.lib。如果出现:
>ExtClientDlg.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall CCompute::CCompute(int,int)" (__imp_??0CCompute@@QAE@HH@Z),该符号在函数 "public: void __thiscall CExtClientDlg::Comp(unsigned int)" (?Comp@CExtClientDlg@@QAEXI@Z) 中被引用
1>ExtClientDlg.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: virtual __thiscall CCompute::~CCompute(void)" (__imp_??1CCompute@@UAE@XZ),该符号在函数 "public: virtual void * __thiscall CCompute::`scalar deleting destructor'(unsigned int)" (??_GCCompute@@UAEPAXI@Z) 中被引用
1>D:\ExtDll\Debug\ExtClient.exe : fatal error LNK1120: 7 个无法解析的外部命令
这样的错误是因为缺少lib库导致添加操作如下,这里是缺少
右键“ExtClient”项目名称出现
下一步添加lib库
添加路径:
问题解决。
运行结果如图8-9所示: