在DLL中产生对话框的方法.doc_第1页
在DLL中产生对话框的方法.doc_第2页
在DLL中产生对话框的方法.doc_第3页
在DLL中产生对话框的方法.doc_第4页
在DLL中产生对话框的方法.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在DLL中产生对话框的方法一(Win32 DLL)什么是Dll?Stands for Dynamic Link Library. A DLL (.dll) file contains a library of functions and other information that can be accessed by a Windows program. When a program is launched, links to the necessary .dll files are created. If a static link is created, the .dll files will be in use as long as the program is active. If a dynamic link is created, the .dll files will only be used when needed. Dynamic links help programs use resources, such as memory and hard drive space, more efficiently.对话框:对话框可以分为modal和modeless两种。在Win32 Dll中创建modal对话框。 在一个Win32Dll中创建modal对话框非常简单,我们都知道,Win32函数DialogBox能够创建一个modal对话框,并且modal对话框的消息是独立于主程序消息循环的,所以可以直接在Dll内部建立对话框自己的窗口过程。下面就是一个在Win32 Dll中创建modal对话框的示例:/name: Modal_Dialog.cpp#include#includeresource.hBOOL CALLBACK DlgProc(HWND hwnd,UINT Msg,WPARAM wParam,LPARAM lParam)switch(Msg)case WM_INITDIALOG:return TRUE;case WM_COMMAND:switch(wParam)case IDOK:MessageBox(NULL,这是一个modal对话框的例子,提示,MB_OK); EndDialog(hwnd, 0);return TRUE;break;return FALSE;externC _declspec(dllexport) void ShowDialog()HINSTANCE hinst;hinst=LoadLibrary(Modal_Dialog.dll); /获取库所在的实例句柄DialogBox(hinst,MAKEINTRESOURCE(IDD_DIALOG1),NULL,DlgProc);FreeLibrary(hinst);/name: Test.cpptypedef void (*fp)();HINSTANCE hDll;fp Show;hDll = LoadLibrary(Modal_Dialog.dll);Show = (fp)GetProcAddress(hDll,ShowDialog);(*Show)();FreeLibrary(hDll);在Win32 Dll 中创建modeless对话框。 与modal对话框不同,modeless对话框的消息是要经过主程序消息循环的,这样一来,就必须在调用该Dll的主程序中处理对话框的消息循环,这就无法达到利用Dll来完成组件化开发的要求。其实我们可以人为的Modeless对话框创建一个窗口类,我们知道窗口过程是属于窗口类的,这样一来就有了主窗口的消息循环。/name: Modeless_Dialog.cpp#include #includeresource.hLRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;BOOL CALLBACK DlgProc (HWND, UINT, WPARAM, LPARAM) ;externC int _declspec(dllexport) ShowDialog()static TCHAR szAppName = TEXT (Modeless_Dialog) ;HWND hwnd ;MSG msg ;WNDCLASS wndclass ;HINSTANCE hInstance;HWND hDialog;hInstance = LoadLibrary(Modeless_Dialog.dll);wndclass.style = CS_HREDRAW | CS_VREDRAW;wndclass.lpfnWndProc = WndProc ;wndclass.cbClsExtra = 0 ;wndclass.cbWndExtra = DLGWINDOWEXTRA ; / Note!wndclass.hInstance = hInstance ;wndclass.hIcon = LoadIcon (hInstance, szAppName) ;wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;wndclass.lpszMenuName = NULL ;wndclass.lpszClassName = szAppName ;hwnd = CreateWindow (szAppName, TEXT (Modeless_Dialog),WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,NULL, NULL, hInstance, NULL) ;/ ShowWindow (hwnd, iCmdShow) ; /并不在这里显示主窗口/ UpdateWindow (hwnd) ; hDialog = CreateDialog (hInstance, MAKEINTRESOURCE(IDD_DIALOG1), hwnd, DlgProc) ;while (GetMessage (&msg, NULL, 0, 0)if(hDialog=0|!IsDialogMessage(hDialog,&msg)TranslateMessage (&msg) ;DispatchMessage (&msg) ;return msg.wParam ;BOOL CALLBACK DlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)switch(message)case WM_INITDIALOG :return true;case WM_COMMAND:switch(wParam)case(IDOK):MessageBox(NULL,这是一个modeless对话框的例子,提示,MB_OK);DestroyWindow(hDlg);PostQuitMessage (0) ;return TRUE;return FALSE;LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) switch (message)case WM_DESTROY:PostQuitMessage (0) ;return 0 ;return DefWindowProc (hwnd, message, wParam, lParam) ; CreateDialog用来创建窗口,并且对话框模板要指定visible属性为True,只有这样才能显示对话框. if(hDialog=0|!IsDialogMessage(hDialog,&msg)这一句是起消息分流作用的,对于属于对话框的消息一律交给对话框过程DlgProc来处理。 处理对话框的退出一定要使用DetroyWindow函数,并且要发送一个退出消息,使那个没有显示的主窗口也能够退出消息循环,不至于造成内存泄露。在DLL中产生对话框的方法二(MFC Regular DLL)在MFC Regular Dll中创建modal对话框非常简单,Cdialog基类提供有一个方法DoModal(),能够创建一个modal对话框,因此在MFC Regular Dll中创建modal对话框,仅仅需要自己继承对话框基类,在导出函数中调用DoModal就可以了. 在MFC Regular Dll 中创建modeless对话框. 因为MFC应用程序框架仅仅是对Win32函数的封装,所以在MFC Regular Dll中创建modeless对话框其实与在DLL中产生对话框的方法一(Win32 DLL)介绍的产生modeless对话框的内部原理是一致的,差别仅仅是在MFC框架中还需要一点小技巧。 我们知道在Win32 SDK编程中,有一个主窗口句柄hwnd,同样在MFC中,也有这样一个变量,只不过它现在被封装进了CwindThread中,我们可以在AFXWIN.H中看到这样的定义:CWnd* m_pMainWnd; / main window (usually same AfxGetApp()-m_pMainWnd)并且我们知道CWinApp是继承于CWinThread的。 我们再来看窗口过程的封装,在MFC中,CFrameWnd类别可以用来创建窗口,并在内部定义了窗口过程,具体地说,就是CreateWindow,MessageLoop这样的机制都是在该类别中实现的。 有了上面地基础,再来看在DLL中产生对话框的方法一(Win32 DLL)这篇文章中产生modeless对话框的步骤:1:我们首先建立了一个主视窗,但是并不显示该视窗,我们真正需要的是窗口句柄hwnd.2: 建立对话框,将该对话框的owner句柄设置为hwnd。3:进行消息分流。 在上面步骤后面其实隐藏了一个技巧在里面:我们可以抛弃hwnd,也就是说我们可以将对话框的句柄设置为hwnd,这样我们就可以省略第三步,不用在消息循环的地方做消息分流,那么我们的代码看上去是这个样子hwnd = CreateWindow (szAppName, TEXT (Modeless_Dialog), WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ;/ ShowWindow (hwnd, iCmdShow) ; /并不在这里显示主窗口/ UpdateWindow (hwnd) ; hwnd = CreateDialog (hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc) ;while (GetMessage (&msg, NULL, 0, 0)TranslateMessage (&msg) ;DispatchMessage (&msg) ; OK这下我们可以按照上面的步骤来在MFC Regular DLL中产生对话框了1:利用AppWizard建立一个MFC Regular DLL.2: 从CFrameWnd派生出一个新的类CmyFrameWnd类,因为我们仅仅是需要产生一个不显示的窗口,所以一切动作采用默认的操作就可以了。class CMyFrame:public CFrameWndpublic:CMyFrame();DECLARE_MESSAGE_MAP();3:从CDialog派生一个新的CMyDialog类。4:因为CWinApp的InitInstance()是用来对应用程序进行初始化动作的。所以我们在CMyWinApp的InitInstance方法中加入如下代码:m_pMainWnd = new CMyFrame();m_pMainWnd = pDlg; /pDlg是一个指向CmyDialg对象的指针。5:写导出函数:externC void _declspec(dllexport) Show()pDlg-DoModal(); /显示对话框 从以上的步骤我们可以看出,在MFC Regular DLL中显示modeless对话框的方法还是遵从了Win32 DLL中的方法,当然因为MFC的面向对象的特性,只要遵从这种方法,我们可以有更多的办法实现,只是这里介绍的应该是最简单的也是最直接的方式。/-实例说明-/VC 动态链接库的使用这里主要说明件事情,就是如果要使用dll里面定义的数据类型如:我在使用openssl/blowfish的BF_KEY类型,那么就要自己在程序里按照dll说明文件重新定义一次,而且格式要与dll里面的一致使用动态链接库其实很简单,只要先按照dll说明定义一个函数指针就可以了typedef int(*lpfunc)(argc0, argc1,.)然后用MFC的dll句柄获得dllHINSTANCE hdllhdll = LoadLibrary();lpfunc Func = (lpfunc)GetProcAddress(hdll,funcname); funcname指你想用dll中的那个声明的函数名然后就可以用Func了下面这部分简单示例是从网上转载来的,虽然简单但是还是蛮有代表意义的非mfc的dll生成1。建立win32 dynamiclink libray的工程2。源码如下:#ifndef LIB_H#define LIB_Hextern C int _declspec(dllexport)add(int x,int y);#endif#include dll.hint add(int x,int y)return x +5+y;3。编译后即生成dll.dll文件控制台程序调用dll1。建立win32 console application工程2。源码如下:#include#includetypedef int(*lpAddFun)(int, int);int main(int argc

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论