<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    將MFC Grid control封裝為DLL的做法及其在DLL中的使用方法

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

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

    RFID設備管理軟件

     

    因而在數據庫程序及報表程序應用較為廣泛,其源碼可以在下面下載到:

    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,

     

    如下圖:

    RFID設備管理軟件

    在對話框類中添加成員變量:

    [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實現:

    RFID設備管理軟件

     

    相關源碼下載:

    MFC Gridcontrol封裝為DLL的源碼



    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全