用sdk写基于对话框的win32应用程序时出现问题?

maltose 2003-01-22 11:17:26
很多例子都是基于窗口的win32应用程序,
而我在写基于对话框的win32应用程序时,
出现程序运行后没有反映,
但是在系统的进程列表中却有。

下面是源代码:
#include "stdafx.h"

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int iCmdShow)
{
static TCHAR szAppName[] = TEXT("ChangeDisp");
HWND hWnd; //?主窗口句柄
MSG msg;
WNDCLASS wndclass;

//填写窗口类结构,使得其参数描述主窗口各方面的属性
wndclass.style = CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = DLGWINDOWEXTRA;

wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(hInstance, szAppName);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;

if(!RegisterClass(&wndclass))
{
MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR);
return 0;
}

//下面这句话是基于对话框的--不好用
hWnd = CreateDialog(hInstance, szAppName, 0, NULL);

//下面这句话是基于窗口的--好用
/*
hWnd = CreateWindow (
szAppName, //窗口类名
TEXT ("ChangeDisp"), //窗口标题
WS_OVERLAPPEDWINDOW, //窗口的风格
CW_USEDEFAULT,
CW_USEDEFAULT, //窗口左上角坐标为缺省值
CW_USEDEFAULT,
CW_USEDEFAULT, //窗口的高和宽为缺省值
NULL, //父窗口的句柄
NULL, //窗口无主菜单
hInstance, //创建此窗口的应用程序的当前句柄
NULL); //不使用该值
*/

//如果创建窗口失败,则返回FALSE
if (!hWnd)
return (FALSE);

//让窗口显示出来;并更新其客户区;最后返回TRUE
ShowWindow (hWnd, iCmdShow);
UpdateWindow (hWnd);

while(GetMessage(&msg, NULL, 9, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return msg.wParam;

}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{

case WM_COMMAND:

SetFocus(hWnd);
MessageBox(NULL, TEXT("Hello World!"), TEXT("Title!"), MB_ICONERROR);

return 0;

case WM_DESTROY:

PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
...全文
104 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
maltose 2003-01-27
  • 打赏
  • 举报
回复
谢谢大家捧场,结贴。

虽然问题是我自己解决的,不过
没有大家的帮助,

我是有天大的本事也解决不了的。
yuliangpei 2003-01-23
  • 打赏
  • 举报
回复
HWND hWnd ;
hWnd = CreateDialog( hInstance, MAKEINTRESOURCE(IDD_DIALOG1), GetDesktopWindow(), (DLGPROC)DialogFunc) ;

然后在
while( GetMessage( &msg, NULL, 0, 0 ) )
{
if( !IsWindow( hWnd ) && !IsDialogMessage( hWnd, &msg ) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

如果在CreateDialog时不指定回调的函数,则不会有WM_INITDIALOG及WM_COMMAND的。 因为你创建的是非模态对话框,WINDOWS不知道需将消息发给他,还是一个劲的将消息发给窗口函数。有了IsDialogMessage(hwnd, &msg)这句,就通知WINDOWS这是Dialog的Message!
我试过的应该没问题的,你试一下吧!
mzz_810 2003-01-22
  • 打赏
  • 举报
回复
CreateDialog最后一个参数是窗口函数指针,不能为NULL。
对话框也需要窗口处理函数,类似下面的,return(0)表示由系统处理消息。
LRESULT CALLBACK MainWndProc(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)
{
switch(Msg)
{
case WM_INITDIALOG:
break;
case WM_COMMAND:
break;
case WM_CLOSE:
EndDialog(hWnd,0);
PostQuitMessage(0);
break;
default:
return(0);
}
return(1);
}
maltose 2003-01-22
  • 打赏
  • 举报
回复

请教:(毛毛)
不是NULL是什么?我怎样去写?
有关于sdk的对话框的例子吗?
sunwhite 2003-01-22
  • 打赏
  • 举报
回复
up

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧