将MFC Grid control封装为DLL的做法及其在DLL中的使用方法

MFCGrid control是一款非常优秀的网格控件,支持非常丰富的界面元素,如下图:

 

因而在数据库程序及报表程序应用较为广泛,其源码可以在下面下载到:

MFC Grid control2.27源码下载

       MFC Gridcontrol的作者并没有将其封装为DLL,因为在程序的多个模块复用这个控件比较麻烦(需要在多个工程中加入其源码),因此最好将其封装为一个DLL。今天有同事反映在DLL的对话框中无法使用封装好的MFC Grid control,于是上网查了下资料,晚上摸索了一下,解决了这个问题。

 

       MFC Grid control的作者在设计该控件并没考虑到在DLL中使用该控件,因此在其控件类CGridCtrl类的构造函数注册窗口类时指定该窗口类的窗口过程所属的应用实例句柄皆为主程序的程序句柄(一般为exe程序),因此在DLL中无法显示。因此要解决该问题,就必须将注册窗口类函数改写,将应用实例句柄传给控件类。具体注册函数为:

[cpp] view plaincopy

  1. BOOL CGridCtrl::RegisterWindowClass(HINSTANCE hInstance)  
  2. {  
  3.     WNDCLASS wndcls;  
  4.     HINSTANCE hInst = hInstance ? hInstance : AfxGetInstanceHandle();  
  5.     //HINSTANCE hInst = AfxGetResourceHandle();  
  6.   
  7.     if (!(::GetClassInfo(hInst, GRIDCTRL_CLASSNAME, &wndcls)))  
  8.     {  
  9.         // otherwise we need to register a new class  
  10.         wndcls.style            = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;  
  11.         wndcls.lpfnWndProc      = ::DefWindowProc;  
  12.         wndcls.cbClsExtra       = wndcls.cbWndExtra = 0;  
  13.         wndcls.hInstance        = hInst;  
  14.         wndcls.hIcon            = NULL;  
  15. #ifndef _WIN32_WCE_NO_CURSOR  
  16.         wndcls.hCursor          = AfxGetApp()->LoadStandardCursor(IDC_ARROW);  
  17. #else  
  18.         wndcls.hCursor          = 0;  
  19. #endif  
  20.         wndcls.hbrBackground    = (HBRUSH) (COLOR_3DFACE + 1);  
  21.         wndcls.lpszMenuName     = NULL;  
  22.         wndcls.lpszClassName    = GRIDCTRL_CLASSNAME;  
  23.   
  24.         if (!AfxRegisterClass(&wndcls))  
  25.         {  
  26.             AfxThrowResourceException();  
  27.             return FALSE;  
  28.         }  
  29.     }  
  30.   
  31.     return TRUE;  
  32. }  

 

        下面介绍如何在DLL工程中使用CGridCtrl类。新建一个MFC 常规DLL,接着新建一个对话框资源,拖一个Custom Control进对话框,Class填:MFCGridCtrl,ID取为IDC_GRID,

 

如下图:

在对话框类中添加成员变量:

[cpp] view plaincopy

  1. CGridCtrl m_Grid;  

在对话框的实现代码中添加控件绑定以及注册窗口代码:

[cpp] view plaincopy

  1. void CGridDlg::DoDataExchange(CDataExchange* pDX)  
  2. {  
  3.     CDialog::DoDataExchange(pDX);  
  4.     DDX_Control(pDX, IDC_GRID, m_Grid);    
  5. }  
  6.   
  7. extern CDllGridApp theApp;  
  8. CGridDlg::CGridDlg(CWnd* pParent /*=NULL*/)  
  9.     : CDialog(CGridDlg::IDD, pParent)  
  10. {  
  11.     // 最好在构造函数注册,其它地方不保证成功,传入是DLL的模块句柄  
  12.     m_Grid.RegisterWindowClass(theApp.m_hInstance);  
  13. }  

效果图如下,其中弹出对话框的操作在DLL实现:

 

相关源码下载:

MFC Gridcontrol封装为DLL的源码

时间: 2024-09-20 13:36:34

将MFC Grid control封装为DLL的做法及其在DLL中的使用方法的相关文章

c++ mfc-c++中MFC程序在别人的机器上显示缺少mfco42d.dll文件怎么办?

问题描述 c++中MFC程序在别人的机器上显示缺少mfco42d.dll文件怎么办? 有什么解决办法?希望在别人的电脑上都可以用,有什么好点的办法. 解决方案 你把debug全删除后rebuild all看看 解决方案二: 在项目属性里,选择静态编译下就可以了,这样的话你的exe用到的库会封装到你的exe里

C++中MFC Tab Control控件的使用详解

  这篇文章主要介绍了C++中MFC Tab Control控件的使用详解的相关资料,需要的朋友可以参考下 1. 新建一个MFC工程, 取名MyTab, 选择Dialog based, 然后Finish. 2. 删除对话框上默认添加的三个控件. 添加Tab Control控件并在Property属性中设置ID为IDC_TABTEST 在More Styles里勾上Bottom. 调速尺寸使其布满整个对话框, 我这边Tab Control的尺寸最后为164X203. 在ClassWizard为其添

mfc-VS2010 MFC tab control控件

问题描述 VS2010 MFC tab control控件 我将标签设置在bottom时,可以显示标签并可以点击,但是对话框没有内容显示 更没有切换效果,请问这是何故?但是我设置在顶部时,一切正常! 附上简短的代码: 在OnInitDialog中如下: SetIcon(m_hIcon TRUE); // 设置大图标SetIcon(m_hIcon FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 CRect tabRect; // 标签控件客户区的位置和大小 m_tab

MFC Tab Control控件的详细使用

1. 新建一个MFC工程, 取名MyTab, 选择Dialog based, 然后Finish. 2. 删除对话框上默认添加的三个控件. 添加Tab Control控件并在Property属性中设置ID为IDC_TABTEST 在More Styles里勾上Bottom. 调速尺寸使其布满整个对话框, 我这边Tab Control的尺寸最后为164X203. 在ClassWizard为其添加变量, 变量名为m_tab. 类型为CTabCtrl. 3. 在对话框的初始化函数OnInitDialog

关于mfc tree control设置焦点的问题

问题描述 关于mfc tree control设置焦点的问题 选中一个tree control的子项后 在进行另一个操作时会失去刚才的焦点,我现在直想让刚才的选中项保持长亮,就像list control一样,求解决方案,谢谢 解决方案 我自己找到了 tree control有个always show selection属性. 解决方案二: 在进行另一个操作时,具体是什么操作呢?会影响 Tree 控件的选中项?

C++ 关于MFC List Control 控件的总结_C 语言

1\在开发项目时,使用到了 listcontrol 控件,就一些问题,做一下备注,以备以后使用 (1)  给list项目 删除所有的项目  DeleteAllItems(); (2) 给list项目 添加一个列 .InsertColumn(0, _T("编号")); (3)给list a项目 设置列的宽度 .SetColumnWidth(0, 50); (4) 在添加项目之前 可以使用 .SetRedraw(false); 来禁止 重画,这样可以提高效率.当添加完成后,可以 使用 .S

C++中MFC Tab Control控件的使用详解_C 语言

1. 新建一个MFC工程, 取名MyTab, 选择Dialog based, 然后Finish. 2. 删除对话框上默认添加的三个控件. 添加Tab Control控件并在Property属性中设置ID为IDC_TABTEST 在More Styles里勾上Bottom. 调速尺寸使其布满整个对话框, 我这边Tab Control的尺寸最后为164X203. 在ClassWizard为其添加变量, 变量名为m_tab. 类型为CTabCtrl. 3. 在对话框的初始化函数OnInitDialog

封装dll-如何把一个能够实现完整功能的C语言写的项目封装为DLL,然后在java项目中调用

问题描述 如何把一个能够实现完整功能的C语言写的项目封装为DLL,然后在java项目中调用 前段时间调试了一个C程序的源码,现在要在一个java web的项目中调用它来完成一个功能,求指点! 解决方案 考虑下jni,编译成so后,在java程序中引入即可 static{ System.loadLibrary("AirPos"); } 解决方案二: 但要注意路径问题,载入路径要指定正确,放置调用失败.

OCX控件在IE中无法侦测到键盘消息( MFC ActiveX Control in IE Doesn't Detect Keystrokes)

症状描述: Accelerator keys, such as ARROW keys, are first received by the message pump of the ActiveX control's container. Even if the control has the focus, it does not receive messages for keystrokes that have special meaning to control containers, suc