对话框中的静态控件如何被创建和显示
大家都知道,用VC的资源编辑器可以在一个工程中插入对话框资源,之后还可以往对话框上放置各种控件,例如按钮、列表框、组合框啦。
我也知道控件也是窗口,要创建控件从Windows编程的思想上来说也必然要经过 注册窗口类、创建窗口、显示窗口、更新窗口这几个步骤。无论是在直接用API函数编写的程序中还是用MFC应用程序向导生成的程序中,对主框架窗口的创建,这个线索我都可以找得到。
而在MFC生成的程序中使用对话框时,只是调用了一个由CDialog派生的子类的一个成员函数DoModal就把包括对话框的创建及显示、对话框上静态控件的创建和显示的各个过程都隐藏了起来,让人感觉对话框上的静态控件不用像主窗口那样在创建时经历前述各个过程。
我想微软在思考Windows程序方案时应该是将各种控件的操作与各种框架窗口的基本操作用Windows API函数进行了统一的,只是MFC类在使用时将各种操作封装在类成员函数内部了而已,可是我不知道这是怎么实现的。如果哪位VC高手知道这里面的道道,敬请详细告知!
[解决办法]
CreateDialogParam时不能用DefDlgProc, 应自已写一个回调函数:
BOOL CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
int lo, hi;
switch(uMsg)
{
case WM_INITDIALOG:
//可以在此创建控件
return TRUE;
case WM_COMMAND:
lo=LOWORD(wParam);
hi=HIWORD(wParam);
if(IDOK==lo || IDCANCEL==lo)
{
DestroyWindow(hDlg);
}
return 0L;
case WM_DESTROY:
PostQuitMessage(0);
return 0L;
default: break;
}
return 0L;
}
HINSTANCE g_hInst;
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
{
g_hInst=hInstance;
HWND hWnd=CreateDialogParam(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,(DLGPROC)DlgProc,0);
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
MSG msg;
while(GetMessage(&msg,hWnd,0,0))
{
if(!IsDialogMessage(hWnd, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return 0;
}
[解决办法]
我给你的代码没有问题,你需要增加一个资源文件,包含 一个对话框,里面包含了一个ID为IDD_ABOUTBOX的对话框.
模态对话框是不需要
MSG msg;
while(GetMessage(&msg,hWnd,0,0))
{
if(!IsDialogMessage(hWnd, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
这样的消息循环.
消息循环在DialogBoxParam这个api里面.对话框上的控件是,都使用默认的消息处理函数.
如果你还有问题,可以给我发邮件akirya(at)gmail.com我给 我的测试代码.