鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: E=MC2

在第6讲视频中的WM_NCLBUTTONDOWN用法问题

[复制链接]
发表于 2014-7-10 10:30:30 | 显示全部楼层
E=MC2 发表于 2014-7-10 08:58
确实  按2次小X即可关闭,那么是什么原因呢?

根据调试初步判断为:当点第一次时,程序运行至case WM_NCLBUTTONDOWN:产生一个对话框,点了确认后对话框消失,由于改为break;程序便到了return DefWindowProc(hwnd, message, wParam, lParam);继续处理WM_NCLBUTTONDOWN  ,,相当于一个WM_NCLBUTTONDOWN消息被处理了两次
由于系统计算出在X上按下了左键,系统在等待左键在X上松开了按键,因为这时在窗口上移动鼠标时,那些X、最小化、最大化按钮没有颜色变化,当你第二次点击并在X上松开左键时就完成了正常的关闭X的整个操作,
这时便产生WM_DESTROY消息,执行程序关闭过程
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-15 21:15:40 | 显示全部楼层
常用的窗口关闭判断由三个消息构成:,WM_SYSCOMMAND,WM_CLOSE和WM_DESTROY以下代码模拟了它们出现的顺序.用非客户区点击判断也可以,但是不常用.
  1. #include <windows.h>
  2. #include <stdio.h>

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

  4. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
  5.                     PSTR szCmdLine, int iCmdShow)
  6. {
  7.         static TCHAR szAppName[] = TEXT ("HelloWin") ;
  8.         HWND         hwnd ;
  9.         MSG          msg ;
  10.         WNDCLASS     wndclass ;
  11.        
  12.         wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  13.         wndclass.lpfnWndProc   = WndProc ;
  14.         wndclass.cbClsExtra    = 0 ;
  15.         wndclass.cbWndExtra    = 0 ;
  16.         wndclass.hInstance     = hInstance ;
  17.         wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
  18.         wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  19.         wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
  20.         wndclass.lpszMenuName  = NULL ;
  21.         wndclass.lpszClassName = szAppName ;
  22.        
  23.         if (!RegisterClass (&wndclass))
  24.         {
  25.                 MessageBox (NULL, TEXT ("This program requires Windows NT!"),
  26.                         szAppName, MB_ICONERROR) ;
  27.                 return 0 ;
  28.         }
  29.        
  30.         hwnd = CreateWindow (szAppName,                  // window class name
  31.                 TEXT ("The Hello Program"), // window caption
  32.                 WS_OVERLAPPEDWINDOW,        // window style
  33.                 CW_USEDEFAULT,              // initial x position
  34.                 CW_USEDEFAULT,              // initial y position
  35.                 CW_USEDEFAULT,              // initial x size
  36.                 CW_USEDEFAULT,              // initial y size
  37.                 NULL,                       // parent window handle
  38.                 NULL,                       // window menu handle
  39.                 hInstance,                  // program instance handle
  40.                 NULL) ;                     // creation parameters
  41.        
  42.         ShowWindow (hwnd, iCmdShow) ;
  43.         UpdateWindow (hwnd) ;

  44.         while (GetMessage (&msg, NULL, 0, 0))
  45.         {
  46.                 TranslateMessage (&msg) ;
  47.                 DispatchMessage (&msg) ;
  48.         }
  49.         return msg.wParam ;
  50. }


  51. LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  52. {
  53.         switch (message)
  54.         {
  55.         case WM_CREATE:
  56.                 return 0 ;
  57.         case WM_SYSCOMMAND:
  58.                 if( wParam == SC_CLOSE )
  59.                 {
  60.                         MessageBox(hwnd, "WM_SYSCOMMAND,窗口还在,还可以撤销操作", "Msg", 0 );
  61.                         SendMessage( hwnd, WM_CLOSE, 0, 0 );
  62.                 }
  63.                 return 0;
  64.         case WM_CLOSE:
  65.                 {
  66.                         MessageBox(hwnd, "WM_CLOSE,窗口还在,还可以撤销操作", "Msg", 0 );
  67.                         DestroyWindow( hwnd );
  68.                         return 0;
  69.                 }
  70.         case WM_DESTROY:
  71.                 {
  72.                         MessageBox(hwnd, "WM_DESTROY,窗口不在,不可以撤销操作", "Msg", 0 );
  73.                         PostQuitMessage (0) ;
  74.                         return 0 ;
  75.                 }
  76.         }
  77.         return DefWindowProc (hwnd, message, wParam, lParam) ;
  78. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-7-16 11:35:07 | 显示全部楼层
仰望天上的光 发表于 2014-7-15 21:15
常用的窗口关闭判断由三个消息构成:,WM_SYSCOMMAND,WM_CLOSE和WM_DESTROY以下代码模拟了它们出现的顺序.用 ...

学习了。但是问题2貌似还是无解啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-7-16 17:59:21 | 显示全部楼层

谢谢了。HTCLOSE 看来还真有这个专门在非客户区关闭的消息。相关的MSDN 我已经找到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-12-2 06:33:52 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2014-12-12 13:05:11 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-4 09:36:58 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-12-3 11:52:25 | 显示全部楼层
学习,,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 15:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表