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