如何在Win32中使用Dialog资源?

时间:2011-11-18 03:08:19

标签: c++ windows winapi resources

如果没有资源,我可以创建一个包含CreateWindow()CreateWindowEx()以及WndProc()的复杂数组的UI来处理我的事件。

我注意到如果我在资源视图中右键单击并单击“添加资源”,我可以绘制一个包含所有控件的对话框。如果我可以像通常使用C#那样绘制界面,这将节省大量时间。

在我使用资源编辑器绘制界面后,如何从代码创建窗口?有人可以用按钮提供一个非常简单的例子,并说明如何处理该按钮上的WM_COMMAND事件吗?

此外,人们通常如何创建GUI?这样做是否有灵活性的损失?即使在C#中,我经常需要使用自己的代码生成的UI来补充设计者生成的UI,但大多数时候我都很乐意使用设计器。

2 个答案:

答案 0 :(得分:5)

在资源编辑器中创建对话框后,调用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。

答案 1 :(得分:1)

如果您已将按钮或任何控件放在某个对话框上,则该控件已处于已创建状态。要在此对话框中处理这些子控件的消息,必须在实现对话框的类中重写OnCommand Method。

例如:

//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;
}

}