[英]How do I use Dialog resources in Win32?
沒有資源,我可以使用CreateWindow()
和CreateWindowEx()
以及WndProc()
的復雜數組創建UI來處理事件。
我注意到如果右鍵單擊資源視圖並單擊“添加資源”,則可以繪制一個包含所有控件的對話框。 如果像我通常使用C#那樣繪制界面,這將為我節省大量時間。
使用資源編輯器繪制界面后,如何使用代碼創建窗口? 有人可以提供一個帶有按鈕的非常簡單的示例,並請演示如何處理該按鈕上的WM_COMMAND事件嗎?
另外,這通常是人們創建GUI的方式嗎? 這樣做會不會有任何損失? 即使在C#中,我也經常不得不用自己的代碼生成的UI來補充設計器生成的UI,但是大多數時候我很高興使用設計器。
在資源編輯器中創建對話框后,調用CreateDialog
(無模式對話框;您需要像使用CreateWindow
一樣手動分派消息)或DialogBox
(模式對話框;該函數直到關閉對話框后才會返回。)給您)以顯示對話框。 就像將窗口proc傳遞給RegisterClass一樣,您也將對話框proc傳遞給那些用於對話框回調的函數。 DialogProc的示例如下所示:
BOOL DialogProc( HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam ){
switch( iMessage ){
case WM_COMMAND:
switch( LOWORD( wParam ) ){
case BTOK:
MessageBox( hDlg, "Hello, World!", NULL, NULL );
return TRUE;
break;
}
break;
}
return FALSE;
}
這是創建對話框的基本方法。 更復雜的方法通常涉及OOP,通常將每個資源(按鈕,窗口等)包裝為C ++對象或使用MFC。
如果您已將按鈕或任何控件放在某個對話框上,則該控件已經處於創建狀態。 為了在此對話框上處理這些子控件的消息,您必須在實現您的對話框的類中重寫OnCommand方法。
例如:
//CDialog_ControlDlg is my Dialog class derived from CDialog
//IDC_BUTTON_SAMPLE is the ID of the button which was palced on the dialog in the resource Editor..
BOOL CDialog_ControlDlg::OnCommand(WPARAM wParam,LPARAM lparam){
int iNotiFicationMsg=HIWORD(wParam);//This is thenotification Msg from the child control
int iCommandId=LOWORD(wParam);//And Control ID of the Child control which caused that Msg
BOOL result=FALSE;
switch(iCommandId){
case IDC_BUTTON_SAMPLE:
if(iNotiFicationMsg==BN_CLICKED)
{
//Your Code for handling this type of Msg for this control..
}
break;
default:
{
//Specific Code;
}
return result;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.