如果没有资源,我可以创建一个包含CreateWindow()
和CreateWindowEx()
以及WndProc()
的复杂数组的UI来处理我的事件。
我注意到如果我在资源视图中右键单击并单击“添加资源”,我可以绘制一个包含所有控件的对话框。如果我可以像通常使用C#那样绘制界面,这将节省大量时间。
在我使用资源编辑器绘制界面后,如何从代码创建窗口?有人可以用按钮提供一个非常简单的例子,并说明如何处理该按钮上的WM_COMMAND事件吗?
此外,人们通常如何创建GUI?这样做是否有灵活性的损失?即使在C#中,我经常需要使用自己的代码生成的UI来补充设计者生成的UI,但大多数时候我都很乐意使用设计器。
答案 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;
}
}