更新时间:2015-06-25 16:51:49浏览次数:1+次
控件中发生了一些事件,是在控件的父窗口中响应事件,而不是在控件本身响应的。程序实现时,就相应的将这些事件的处理统统放在控件的父窗口对象的消息成员函数中。控件通知消息只适用于标准的窗口控件如按钮、列表框、组合框、编辑框,以及树状视图、列表视图等公共控件。例如,单击或双击一个控件、在控件中选择文本、操作控件的滚动条都会产生通知消息。
由于我们只是想使用DLL导出的对话框资源,而且还想着有可能在非MFC环境中使用该对话框资源,规则的MFC DLL可以胜任,就没必要使用MFC扩展DLL了,另外如果使用了扩展的MFC DLL,那么你的应用程序也必须使用MFC库。
控件仅能以子窗口的形式出现,它要依附对话框这样的父窗口。 可以在DLL项目中直接添加对话框资源和对话框类来实现。
以下是建立DLL的过程:
VS中建立一个DLL的过程如下:
说明:DLL是无法自动进入内存开始运行的,要被其它可执行文件的加载才可以。对话框是在DLL中创建的,而常规的MFC DLL是无法导出MFC对象给其它应用程序使用的,只能通过输出函数来做。可以参考一下《动态链接库dll创建和使用相关详细说明》。
- 菜单->文件->新建->项目,在弹出的项目对话框的左栏,选择Visual C++项目,在右栏选择MFC DLL。然后在下面的文本框中输入项目的名字,确定,进入MFC DLL向导。
- MFC DLL向导,在"应用程序设置"中,选择'使用共享MFC DLL的规则DLL",完成向导设置后,生成一个空的MFC DLL项目。注意,共享的Dll需要使用的计算机中安装有MFC库,否则无法运行。要在没有MFC库的计算机中运行,请选择静态DLL版本。
- 菜单:项目->添加资源,在添加资源对话框中,选择"Dialog",然后点击按钮"新建"。VS会自动切换到资源视图界面,删去默认的"OK"和"CANCEL" 按钮。
- 的对话框ID修改为合适的ID号。
- 添加话框类CMyDllDlg。
- 建立输出函数ShowMyDllDlg()
//--------------------------------------------
//ExportFunc.h,
//声明欲输出的函数
//-------------------------------------------
#ifndef _EXPORTFunc_H
#define _EXPORTFunc_H
#ifdef _cplusplus
extern "C"{
#endif
void ShowMyDllDlg(HWND hMainWnd);
#ifdef _cplusplus
}
#endif
#endif
//--------------------------------------------
//ExportFunc.cpp文件
//定义输出函数
//------------------------------------------- //////////////////////////////////////////////////////
//功能:DLL的输出函数,当其他应用程序加载该DLL后,调用这个函数,可以显示该DLL内建的对话框
//输入参数1:HWND hMainWnd,对话框父窗口的句柄
///////////////////////////////////////////////
void ShowMyDllDlg(HWND hMainWnd)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CMyDllDlg *pTreeDlg=new CMyDllDlg;
CWnd * pMainWnd=CWnd:: FromHandle(hMainWnd);
ASSERT(pMainWnd);
BOOL retValue=CMyDllDlg->Create(IDD_DLG,pMainWnd);
// - IDD_DLG就是添加的对话框的ID
if(!retValue)
{
AfxMessageBox("创建包含树列表控件的对话框失败了!");
}
CMyDllDlg->ShowWindow(SW_SHOW);
}
下面是模块定义文件的内容,通常我们是使用_declspec(dllexport)直接修饰输出的函数,这样导出的接口很容易就被查看DLL文件的工具观察到,保密性不够好。为了向外界隐藏你的DLL对外接口的名称,只有def文件可以做。
DlgWithCtrl.def : 声明 DLL 的模块参数。
LIBRARY "DlgWithCtrl"
EXPORTS
此处可以是显式导出
ShowMyDllDlg @1 NONAME
//-------------------------------------------------------------------------
//该函数显示一个非模态对话框,写法极简,仅作示例
//-------------------------------------------------------------------------
void ShowDlg(void)
{
CDlg *pDlg = new CDlg;
Create(IDD_DLG,NULL);
pDlg->ShowWindow(SW_SHOW);
}
//---------------------------
//testDll.cpp
//--------------------------
#include "stdafx.h"
#include "..\DlgWithCtrl\ExportFunc.h"
#pragma comment(lib, "..\\DlgWithCtrl\\release\\DlgWithCtrl.lib")
void main(void)
{
ShowTreeDlg(NULL);
}
5. 编译连接,运行。相关资讯