在DLL中產生對話方塊的方法二(MFC Regular DLL)

來源:互聯網
上載者:User

 

http://blog.csdn.net/hailongchang/archive/2006/12/26/1462316.aspx

在MFC Regular Dll 中建立modal對話方塊

    在MFC Regular Dll中建立modal對話方塊非常簡單,Cdialog基類提供有一個方法DoModal(),能夠建立一個modal對話方塊,因此在MFC Regular Dll中建立modal對話方塊,僅僅需要自己繼承對話方塊基類,在匯出函數中調用DoModal就可以了.
  在MFC Regular Dll 中建立modeless對話方塊.
    因為MFC應用程式架構僅僅是對Win32函數的封裝,所以在MFC Regular Dll中建立modeless對話方塊其實與在DLL中產生對話方塊的方法一(Win32 DLL)介紹的產生modeless對話方塊的內部原理是一致的,差別僅僅是在MFC架構中還需要一點小技巧。
    我們知道在Win32 SDK編程中,有一個主視窗控制代碼hwnd,同樣在MFC中,也有這樣一個變數,只不過它現在被封裝進了CwindThread中,我們可以在AFXWIN.H中看到這樣的定義:
……
CWnd* m_pMainWnd;   // main window (usually same AfxGetApp()->m_pMainWnd)
……
並且我們知道CWinApp是繼承於CWinThread的。
    我們再來看視窗過程的封裝,在MFC中,CFrameWnd類別可以用來建立視窗,並在內部定義了視窗過程,具體地說,就是CreateWindow,MessageLoop這樣的機制都是在該類別中實現的。
    有了上面地基礎,再來看在DLL中產生對話方塊的方法一(Win32 DLL)這篇文章中產生modeless對話方塊的步驟:
1:我們首先建立了一個主視窗,但是並不顯示該視窗,我們真正需要的是視窗控制代碼hwnd.
2: 建立對話方塊,將該對話方塊的owner控制代碼設定為hwnd。
3:進行訊息分流。
    在上面步驟後面其實隱藏了一個技巧在裡面:我們可以拋棄hwnd,也就是說我們可以將對話方塊的控制代碼設定為hwnd,這樣我們就可以省略第三步,不用在訊息迴圈的地方做訊息分流,
那麼我們的代碼看上去是這個樣子
……
     hwnd = CreateWindow (szAppName, TEXT ("Modeless_Dialog"),
                          WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
                          CW_USEDEFAULT, CW_USEDEFAULT,
                          CW_USEDEFAULT, CW_USEDEFAULT,
                          NULL, NULL, hInstance, NULL) ;
    
    // ShowWindow (hwnd, iCmdShow) ;       //並不在這裡顯示主視窗
    // UpdateWindow (hwnd) ; 
hwnd = CreateDialog (hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc) ;
    
     while (GetMessage (&msg, NULL, 0, 0))
     {
          TranslateMessage (&msg) ;
          DispatchMessage (&msg) ;
     }
……
    OK這下我們可以按照上面的步驟來在MFC Regular DLL中產生對話方塊了
1:利用AppWizard建立一個MFC Regular DLL.
2: 從CFrameWnd派生出一個新的類CmyFrameWnd類,因為我們僅僅是需要產生一個不顯示的視窗,所以一切動作採用預設的操作就可以了。
class CMyFrame:public CFrameWnd
{
public:
    CMyFrame();
DECLARE_MESSAGE_MAP()
};
3:從CDialog派生一個新的CMyDialog類。
4:因為CWinApp的InitInstance()是用來對應用程式進行初始化動作的。所以我們在CMyWinApp的InitInstance方法中加入如下代碼:
    m_pMainWnd = new CMyFrame();
    m_pMainWnd = pDlg;   //pDlg是一個指向CmyDialg對象的指標。
5:寫匯出函數:
extern"C" void __declspec(dllexport) Show()
{
    pDlg->DoModal(); //顯示對話方塊
}
    從以上的步驟我們可以看出,在MFC Regular DLL中顯示modeless對話方塊的方法還是遵從了Win32 DLL中的方法,當然因為MFC的物件導向的特性,只要遵從這種方法,我們可以有更多的辦法實現,只是這裡介紹的應該是最簡單的也是最直接的方式。

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/stamhe/archive/2009/05/05/4150906.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.