学习孙鑫老师的第一课的问题。

schutze 2009-01-31 07:03:45

是这样的,我认真的学习了 第一课之后
然后自己写了一次,在销毁窗口时 用的是
DestroyWindow函数,然后好像这个函数没有发送一个
WM_DESTROY消息到MSG中,因为我在我的程序中定义了一个WM_DESTROY的响应,本来是想用一个
Post什么什么Message(0)来销毁程序的,可是没有结束死循环,问题是,关闭了窗口之后,窗口是销毁了,程序还在进程中看得到
#include <windows.h>
LRESULT CALLBACK meng
(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
int WINAPI WinMain
(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
WNDCLASS wndclass;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hInstance=hInstance;
wndclass.lpfnWndProc=meng;
wndclass.lpszClassName="meng";
wndclass.lpszMenuName=NULL;
wndclass.style=CS_CLASSDC;
RegisterClass(&wndclass);
HWND hwnd;
hwnd=CreateWindow("meng","孟凡星从写windows程序",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);
MSG msg;
while (GetMessage(&msg,hwnd,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK meng
(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch(uMsg)
{
case WM_RBUTTONDOWN:
MessageBox(hwnd,"你按下的是鼠标右键","右键",MB_HELP);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd,"你按下的是鼠标左键","左键",MB_OK);
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_PAINT:
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hwnd,&ps);
TextOut(hDC,0,0,"窗口从画",strlen("窗口从画"));
EndPaint(hwnd,&ps);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}
...全文
172 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
volcanosun 2009-02-01
  • 打赏
  • 举报
回复
人民专家为人民!
weidong0210 2009-02-01
  • 打赏
  • 举报
回复
up
normallife 2009-02-01
  • 打赏
  • 举报
回复
up
wangyangtao 2009-02-01
  • 打赏
  • 举报
回复
学习
OenAuth.Net 2009-02-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 delphi_911 的回复:]
MSG msg;
while (GetMessage(&msg,hwnd,0,0)) //这里将hwnd改为NULL!
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

应该这样吧:
MSG msg;
while (GetMessage(&msg,NULL,0,0)) //这里将hwnd改为NULL!
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
[/Quote]

GetMessage不要指定hwnd,用NULL,接收所有的消息,而不是只有hwnd的消息。
lbjfeng 2009-02-01
  • 打赏
  • 举报
回复
楼上说的对
野男孩 2009-02-01
  • 打赏
  • 举报
回复
DestroyWindow函数是发送了WM_DESTROY的。只不过PostQuitMessage发送的是线程消息,GetMessage没有收到。

要注意,GetMessage返回值有3个:-1,0,1。如果收到非WM_QUIT消息,返回1,如果收到WM_QUIT,返回0。如果发生错误则返回-1。

但是正因为刚才调用了DestroyWindow函数,导致原来消息窗口中的hwnd句柄变为无效了,因为已经关闭了啊。所以GetMessage会因为在等待一个无效的句柄而不停的返回-1,导致循环无法退出。

清除了前因后果,就知道该怎么改了.有2种改法:

1:GetMessage不要指定hwnd,用NULL,接收所有的消息,而不是只有hwnd的消息。

2:GetMessage还是处理hwnd不变,但是检查返回值,如果返回值是-1,则退出循环。代码如下:

BOOL bRet;
MSG msg;
while((bRet=GetMessage(&msg,hwnd,0,0))!= 0)
{
if (bRet == -1)
{
break;
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

schutze 2009-02-01
  • 打赏
  • 举报
回复
1楼和7楼受教了

7楼更详细,从根本上解决了我的疑惑,所以给70分咯

1楼 给出了程序的解决办法,谢谢大家了!
xiaoyisnail 2009-01-31
  • 打赏
  • 举报
回复
up
mabo321 2009-01-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 delphi_911 的回复:]
MSG msg;
while (GetMessage(&msg,hwnd,0,0)) //这里将hwnd改为NULL!
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

应该这样吧:
MSG msg;
while (GetMessage(&msg,NULL,0,0)) //这里将hwnd改为NULL!
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
[/Quote]

giant7 2009-01-31
  • 打赏
  • 举报
回复
up!!!
waizqfor 2009-01-31
  • 打赏
  • 举报
回复
帮顶~
acrobatyuer 2009-01-31
  • 打赏
  • 举报
回复
顶起,SDK下编程基本上又忘完了。。。
delphi_911 2009-01-31
  • 打赏
  • 举报
回复
MSG msg;
while (GetMessage(&msg,hwnd,0,0)) //这里将hwnd改为NULL!
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

应该这样吧:
MSG msg;
while (GetMessage(&msg,NULL,0,0)) //这里将hwnd改为NULL!
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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