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. WndProc Msg 消息列表

    WM_NULL = 0x0000; WM_CREATE = 0x0001;应用程序创建一个窗口 WM_DESTROY = 0x0002;一个窗口被销毁 WM_MOVE = 0x0003;移动一个窗口 ...

  2. Ado.net 类扩展属性

    .要扩展的类名字一样,2个类加(partial) 小例子: using System; using System.Collections.Generic; using System.Linq; usi ...

  3. 2014.9.15HTML

    <html> <title> </title> ——页面标题 <head> </head> ——网页上的控制信息 <body> ...

  4. Oracle 导入本地dmp文件 详细操作步骤

    以下操作均在命令行窗口中进行 /*连接数据库*/ C:\Users\hqbhonker>sqlplus / as sysdba SQL*Plus: Release 11.2.0.1.0 Prod ...

  5. Spark源码学习3

    转自:http://www.cnblogs.com/hseagle/p/3673132.html 一.概要 本篇主要阐述在TaskRunner中执行的task其业务逻辑是如何被调用到的,另外试图讲清楚 ...

  6. linux杂记(?)命令别名——alias

    linux中的命令别名--alias linux中的命令别名--alias 1. 用命令alias可以查询系统中有哪些可用的命令别名 2.添加命令别名 回车查看, 别名建立成功 3.查询命令的地址ty ...

  7. java新特性之可变参数

    public class NewDemo01 {     public static void main(String[] args) {         System.out.print(" ...

  8. Web开发者需具备的8个好习惯

    优秀的Web开发人员工作效率更高,因为他们拥有丰富的经验和良好的习惯.作者Gregor Dorfbauer分享了用于Web开发中的8个好习惯,这些良好的工作习惯不仅能提高效率,还能让您创建更加优秀的应 ...

  9. SQL Server 数据岸问题

    create table t2(x int constraint pk_t2 primary key);go insert into t2(x) values(1),(2),(3),(5),(7),( ...

  10. Android 在一个程序中启动另一个程序

    Android 开发有时需要在一个应用中启动另一个应用,比如Launcher加载所有的已安装的程序的列表,当点击图标时可以启动另一个应用.一般我们知道了另一个应用的包名和MainActivity的名字 ...