2011-11-18 43 views
5

沒有資源,我可以用一個複雜的CreateWindow()CreateWindowEx()WndProc()陣列來創建我的UI來處理我的事件。如何在Win32中使用Dialog資源?

我注意到如果我右鍵單擊資源視圖,然後單擊「添加資源」,我可以繪製一個對話框的所有控件。如果我可以像使用C#那樣繪製界面,這將爲我節省大量時間。

在我繪製了資源編輯器的界面後,如何從代碼創建窗口?有人可以用一個按鈕提供一個非常簡單的例子,並說明如何處理該按鈕上的WM_COMMAND事件?

另外,這一般是人們如何創建GUI?這樣做是否有靈活性損失?即使在C#中,我也經常需要用我自己的代碼生成的UI來補充設計師生成的UI,但大多數時候我都很樂意使用設計器。

回答

5

建立在資源編輯器對話框後,調用CreateDialog(無模式對話框,你需要手動調度消息,當您使用CreateWindow只是想)或DialogBox(模態對話框;函數不返回,直到關閉對話框。它會爲你調度)來顯示對話框。就像您將窗口過程傳遞給RegisterClass一樣,您可以將對話過程傳遞給這些對話框回調函數。 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。

1

如果您在某個對話框中放置了按鈕或任何控件,則該控件已處於創建狀態。爲了處理這個對話框中這些子控件的消息,你必須在正在實現你的對話的類中重寫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; 
} 

}