MFCGrid control是一款非常優秀的網格控件,支援非常豐富的界面元素,如下圖:

因而在資料庫程式及報表程式應用較為廣泛,其源碼可以在下面下載下傳到:
<a href="http://www.codeproject.com/KB/miscctrl/gridctrl.aspx">MFC Grid control2.27源碼下載下傳</a>
MFC Gridcontrol的作者并沒有将其封裝為DLL,因為在程式的多個子產品複用這個控件比較麻煩(需要在多個工程中加入其源碼),是以最好将其封裝為一個DLL。今天有同僚反映在DLL的對話框中無法使用封裝好的MFC Grid control,于是上網查了下資料,晚上摸索了一下,解決了這個問題。
MFC Grid control的作者在設計該控件并沒考慮到在DLL中使用該控件,是以在其控件類CGridCtrl類的構造函數注冊視窗類時指定該視窗類的視窗過程所屬的應用執行個體句柄皆為主程式的程式句柄(一般為exe程式),是以在DLL中無法顯示。是以要解決該問題,就必須将注冊視窗類函數改寫,将應用執行個體句柄傳給控件類。具體注冊函數為:
BOOL CGridCtrl::RegisterWindowClass(HINSTANCE hInstance)
{
WNDCLASS wndcls;
HINSTANCE hInst = hInstance ? hInstance : AfxGetInstanceHandle();
//HINSTANCE hInst = AfxGetResourceHandle();
if (!(::GetClassInfo(hInst, GRIDCTRL_CLASSNAME, &wndcls)))
{
// otherwise we need to register a new class
wndcls.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
wndcls.lpfnWndProc = ::DefWindowProc;
wndcls.cbClsExtra = wndcls.cbWndExtra = 0;
wndcls.hInstance = hInst;
wndcls.hIcon = NULL;
#ifndef _WIN32_WCE_NO_CURSOR
wndcls.hCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
#else
wndcls.hCursor = 0;
#endif
wndcls.hbrBackground = (HBRUSH) (COLOR_3DFACE + 1);
wndcls.lpszMenuName = NULL;
wndcls.lpszClassName = GRIDCTRL_CLASSNAME;
if (!AfxRegisterClass(&wndcls))
{
AfxThrowResourceException();
return FALSE;
}
}
return TRUE;
}
下面介紹如何在DLL工程中使用CGridCtrl類。建立一個MFC 正常DLL,接着建立一個對話框資源,拖一個Custom Control進對話框,Class填:MFCGridCtrl,ID取為IDC_GRID,
如下圖:
在對話框類中添加成員變量:
CGridCtrl m_Grid;
在對話框的實作代碼中添加控件綁定以及注冊視窗代碼:
void CGridDlg::DoDataExchange(CDataExchange* pDX)
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_GRID, m_Grid);
extern CDllGridApp theApp;
CGridDlg::CGridDlg(CWnd* pParent /*=NULL*/)
: CDialog(CGridDlg::IDD, pParent)
// 最好在構造函數注冊,其它地方不保證成功,傳入是DLL的子產品句柄
m_Grid.RegisterWindowClass(theApp.m_hInstance);
效果圖如下,其中彈出對話框的操作在DLL實作:
相關源碼下載下傳: