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

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

MFC Grid control2.27源码下载

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

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

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

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

如下图:

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

  1. CGridCtrl m_Grid;

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

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

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

相关源码下载:

MFC Gridcontrol封装为DLL的源码

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

  1. MFC Grid control 2.27

    原文链接地址:http://www.codeproject.com/Articles/8/MFC-Grid-control MFCGridCtrl是个强大的类,用于数据的表格显示. 1.类特征 Cel ...

  2. MFC 使用MFC EditBrowse Control控件选择文件或者文件夹

    从工具箱中拖拽一个MFC EditBrowse Control到窗体中, 通过设置“Browse Mode”属性指定“文件浏览”还是“文件夹浏览” 可以通过添加对象的方式将其与一个CString se ...

  3. mfc中Button、Edit Control和MFC EditBrowse Control的用法

    [前(fei)言(hua)] 写LL(1)分析器被CString转string卡了一个多小时也是醉了. 趁着还算清醒写下这次用到的控件的使用方法好了. 这次实验的mfc用到了四个控件:Edit Con ...

  4. 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 co ...

  5. Oracle Grid control 11g及Active DataGuard 11g安装部署

    Oracle Grid control 11g及Active DataGuard 11g安装部署(一) 原贴 http://blog.csdn.net/lichangzai/article/detai ...

  6. grid control 11.1.0.1 安装指南

    grid control 11.1.0.1 安装指南 废话少说,进入正题 系统版本号 [root@gridcontrol ~]# lsb_release -a LSB Version:    :bas ...

  7. 转 11g Grid Control: Overview of the EMCTL Options Available for Managing the Agent

    1.概念: The Enterprise Manager DBConsole consists of the following components: - A Standalone OC4J Man ...

  8. 10.2.0.1.1 grid control的启动和关闭

    一.Stopping Grid Control and All Its Components 1.停止OMS服务 [oracle@ocm2 oms10g]$ cd /u01/app/oracle/Or ...

  9. Access Grid Control Properties 访问网格控件属性

    In this lesson, you will learn how to access the properties of a list form's Grid Control in WinForm ...

随机推荐

  1. iOS 模态视图转场的动画效果

    ModalViewController * modalView = [[ModalViewController alloc]init]; modalView.modalTransitionStyle ...

  2. 修改UISearchBar背景颜色

    UISearchBar是由两个subView组成的,一个是UISearchBarBackGround,另一个是UITextField. 要IB中没有直接操作背景的属性.方法一:是直接将 UISearc ...

  3. STL模板_容器概念

    一.STL(Standard Template Library,标准模板库)概述1.容器:基于泛型的数据结构.2.算法:基于泛型的常用算法.3.迭代器:以泛型的方式访问容器中的元素,是泛型的算法可以应 ...

  4. 自己拼接json字符串,现在用Gson来实现

    StringBuilder stringBuilder = new StringBuilder("["); String ssString; ArrayList<Compet ...

  5. 一周学会Mootools 1.4中文教程:(5)Ajax

    ajax在我们前台的开发中是非常重要的,所以我们单独拿出一节课来讲述,首先我们看一下mootools的ajax构成 语法: var myRequest=new Request([参数]); 参数: u ...

  6. STL"源码"剖析

    STL"源码"剖析-重点知识总结   STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点略 ...

  7. linux 怎么查找oracle11g的安装目录

    一般来说,/etc/oraInst.loc文件里会记录oracle的路径,如[oracle@ruby ~]$ cat /etc/oraInst.loc inventory_loc=/u01/app/o ...

  8. NAND闪存颗粒结构及工作原理

    NAND闪存是一种电压元件,靠其内存电压来存储数据,现在我们就来谈谈它的结构及工作原理. 闪存的内部存储结构是金属-氧化层-半导体-场效晶体管(MOSFET),里面有一个浮置栅极(Floating G ...

  9. 组合框里添加复选框的方法(使用勾选的假象,用图片代替而已,并非QT原生支持)

    组合框可以看作是列表框和文本框的组合,因其占据的空间少,使用操作方便,常被界面设计人员用于界面开发设计中,在有限个输入的条件下,组合框常用来代替文本框,这样从用户使用角度来看,更趋人性化,所见即所得. ...

  10. 利用 Android Studio 和 Gradle 打包多版本APK

    在项目开发过程中,经常会有需要打包不同版本的 APK 的需求. 比如 debug版,release版,dev版等等. 有时候不同的版本中使用到的不同的服务端api域名也不相同. 比如 debug_ap ...