(一般來說要做一個 Dialog 是非常簡單的,所以這篇教程是寫給初學者的。但是由于篇幅所限,對窗體過程或事件驅動不做介紹。)
好了,言歸正傳。我們就馬上來做吧。
打開你的 VC6 (如果有工程的請Close Workspace),選擇新建工程(Win32 Application - An empty project ,記得選好保存路徑),然后在該路徑里新建一個 .cpp文件(比如WinMain.cpp),最后在工程管理窗口的 "FileView" 那里,選擇 Add Files to project , 把剛新建的 WinMain.cpp 加入到工程里面去。
好了,你現在已經有了一個工程文件了,如果你希望加入你自己定義的對話框,還要做一個資源文件,并包含到你的工程中來,就好像 WinMain.cpp 的那樣。
在 VC6 的菜單 "Insert" – "Resource... Ctrl+R" 中,理所當然要加入一個 Dialog ,選擇 "New" (不是Import)。 然后你就可以得到一個默認模板的對話框了,隨便給這個新建的 Dialog 設置一些屬性(雙擊該對話框的標題欄可以得到設置屬性的對話框),比方說,那個對話框的 ID: 默認的是 IDD_DIALOG1 ,你就把它改為 "MYDIALOG" (請記住要給ID 加上雙引號,默認的是沒有引號的,這樣做是為了可以不包含 Resource.h 的頭文件);跟著你喜歡的話就改改標題吧,在 Caption: 里填入 my first Dialog 。 好了,剩下的就是保存工作了。請選擇 Save All,選在你的工程的目錄里保存該資源文件(我這里的名字選擇 Resource.rc)。
好了,現在資源文件已經有了,剩下的就是把它加入到工程中來了,方法可以參考 WinMain.cpp 的加入,不再累敘 (在 FileView 里面加入)。
好了,以下剩下的就是編輯你的 WinMaiin.cpp 了,也是我所說的可以取巧的地方。
首先,你首先必須加入的是 這一句: #include <windows.h>。 然后另起一行,鍵入 winmain之后再按 F1 鍵。 你是不是看到 MSDN 出來了呢? 那里面就有關于 WinMain 的定義和參數可以 copy 了,好了,拿來就用吧。把剛才鍵入的 winmain 刪掉,拿從 MSDN 里 copy 來的代替??梢猿蔀橄旅娴臉幼?還要加入 return 0;語句)。
#include <windows.h>
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
{ // 你可以插入你的代碼于此
return 0;
}
好了,你試試編譯一下,看看能不能夠通過編譯? OK 吧?取巧第一步成功了?,F在函數入口總算出來了,可是你要建一個對話框的話,還需要一個對話框的 CALLBACK 過程。下面介紹小小的取巧辦法。
這個過程實際上是一個函數,要在 WinMain 中使用的話就必須在 WinMain 之前定義了。那么請在 WinMain 的定義之前的位置某個空行輸入 DialogProc 然后再次按下 F1 , call 出 MSDN 來。哈哈,關于 DialogProc 的定義及參數又可以抄了。代替你剛才鍵入的 DialogProc 吧,經過加工后就如下面的樣子:
INT_PTR CALLBACK DialogProc(
HWND hwndDlg, // handle to dialog box
UINT uMsg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{ // 你可以插入你的代碼于此
return 0;
}
這樣還不行,還得對消息進行處理,加入如下句子:
switch (uMsg)
{
case WM_COMMAND:
if (LOWORD(wParam) == IDOK) EndDialog( hwndDlg, 0 );
if (LOWORD(wParam) == IDCANCEL) EndDialog( hwndDlg, 0 );
}
剩下的就只有一件事,就是在 WinMain 里面調用 DialogBox 函數了,(詳細的參數請看 MSDN)
也就是在 WinMain 里面的第一句那里寫入如下句子:
DialogBox( hInstance,"MYDIALOG", NULL, (DLGPROC)DialogProc );
現在已經可以完全的編譯和調用了。試試看,效果如何?是不是簡單得來又顯得比較專業?? 哈哈哈,其實不過滿足了我自個的一點偷懶的心理而已(并非真的取巧!被騙了.....)。
詳細的代碼見下面,<全文完>
// WinMain.cpp 源程序
#include <windows.h>
INT_PTR CALLBACK DialogProc(
HWND hwndDlg, // handle to dialog box
UINT uMsg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
switch (uMsg)
{
case WM_COMMAND:
if (LOWORD(wParam) == IDOK) EndDialog( hwndDlg, 0 );
if (LOWORD(wParam) == IDCANCEL) EndDialog( hwndDlg, 0 );
} // End of switch (uMsg)
return 0;
}
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
{
DialogBox( NULL, "MYDIALOG", NULL, (DLGPROC) DialogProc);
return 0;
}
// End of source file
原文轉自:http://www.anti-gravitydesign.com