2011-11-18 122 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; 
} 

} 
相关问题