注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

李小一的梦想世界

 
 
 

日志

 
 

运行VC,关闭应用程序窗口了,为什么进程中还有该程序运行  

2008-04-30 23:19:03|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

原因一:

GetMessage(&msg,hwd,0,0))

// 主消息循环:
while (GetMessage(&msg, NULL, 0, 0))
{
............TranslateMessage(&msg);
............DispatchMessage(&msg);


搜索一下程序关闭的流程。
窗口先销毁,释放资源,同时在线程消息队列中加入WM_QUIT消息,而此消息是没和窗口相关的。
窗口destroywindow后就不存在了,这时候向线程发送的关闭消息就没法处理,也就在getmessage步限入了死循环

原因二:下面判断语句放错了地方,应该响应的是WM_CLOSE消息而非destroy窗口后的WM_DESTROY消息,因为这样的话窗口总是被咔嚓掉而如果选no的话线程继续在后台运行。

case WM_CLOSE:
//if(IDOK==MessageBox(NULL,"你真的要退出吗?","关闭",MB_OKCANCEL|MB_ICONQUESTION))
//{
DestroyWindow(hwnd);
//}
break;
case WM_DESTROY:

if(IDOK==MessageBox(NULL,"你真的要退出吗?","关闭",MB_OKCANCEL|MB_ICONQUESTION))
 {

PostQuitMessage(0);


 break;

 

附出现问题的程序:

#include <windows.h>
#include <stdio.h>

LRESULT CALLBACK WinSunProc(
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
);

int WINAPI WinMain(
  HINSTANCE hInstance,      // handle to current instance
  HINSTANCE hPrevInstance,  // handle to previous instance
  LPSTR lpCmdLine,          // command line
  int nCmdShow              // show state
)
{
 WNDCLASS wndcls;
 wndcls.cbClsExtra=0;
 wndcls.cbWndExtra=0;
 wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
 wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);
 wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);
 wndcls.hInstance=hInstance;
 wndcls.lpfnWndProc=WinSunProc;
 wndcls.lpszClassName="begin";
 wndcls.lpszMenuName=NULL;
 wndcls.style=CS_HREDRAW | CS_VREDRAW;
 RegisterClass(&wndcls);

 HWND hwnd;
 hwnd=CreateWindow("begin","my first window",WS_OVERLAPPEDWINDOW,0,0,600,400,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 WinSunProc(
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
)
{
 switch(uMsg)
 {
 case WM_CHAR:
  char szChar[20];
  sprintf(szChar,"char is %d",wParam);
  MessageBox(hwnd,szChar,"begin",0);
  break;
 case WM_LBUTTONDOWN:
  MessageBox(hwnd,"mouse clicked","begin",0);
  HDC hdc;
  hdc=GetDC(hwnd);
  TextOut(hdc,0,50,"comeputer",strlen("computer"));
  ReleaseDC(hwnd,hdc);
  break;
 case WM_PAINT:
  HDC hDC;
  PAINTSTRUCT ps;
  hDC=BeginPaint(hwnd,&ps);
  TextOut(hDC,0,0,"newnew",strlen("newnew"));
  EndPaint(hwnd,&ps);
  break;
 case WM_CLOSE:
  if(IDYES==MessageBox(hwnd,"Are you really want to quit?y/n","begin",MB_YESNO))
  {
   DestroyWindow(hwnd);
  }
  break;
 case WM_DESTROY:
  PostQuitMessage(0);
  break;
 default:
  return DefWindowProc(hwnd,uMsg,wParam,lParam);
 }
 return 0;
}

  评论这张
 
阅读(731)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017