如何在 Win32 中使用对话框资源?
Posted
技术标签:
【中文标题】如何在 Win32 中使用对话框资源?【英文标题】:How do I use Dialog resources in Win32? 【发布时间】:2011-11-18 03:08:19 【问题描述】:在没有资源的情况下,我可以创建包含 CreateWindow()
和 CreateWindowEx()
和 WndProc()
的复杂数组的 UI 来处理我的事件。
我注意到如果我在资源视图中右键单击并单击“添加资源”,我可以绘制一个包含所有控件的对话框。如果我可以像通常使用 C# 那样绘制界面,这将为我节省大量时间。
使用资源编辑器绘制界面后,如何从代码中创建窗口?有人可以提供一个非常简单的按钮示例,并说明如何处理该按钮上的 WM_COMMAND 事件吗?
另外,这通常是人们创建 GUI 的方式吗?这样做是否有任何灵活性损失?即使在 C# 中,我也经常需要用我自己的代码生成的 UI 来补充设计器生成的 UI,但大多数时候我很乐意使用设计器。
【问题讨论】:
【参考方案1】:在资源编辑器中创建对话框后,调用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。
【讨论】:
【参考方案2】:如果您已将按钮或任何控件放在某个对话框上,则该控件已处于创建状态。要在此对话框上处理这些子控件的消息,您必须在实现对话框的类中重写 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;
【讨论】:
以上是关于如何在 Win32 中使用对话框资源?的主要内容,如果未能解决你的问题,请参考以下文章
win32day09-对话框/子控件/静态块/按钮/文本编辑框
win32day08-位图的使用/坐标系和映射模式/文字和字体/对话框