免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4656 | 回复: 5
打印 上一主题 下一主题

[C++] WIN32API为何这些变量要宣告在这边? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-16 00:15 |只看该作者 |倒序浏览
用vs2012开了一个新的WIN32API项目
初始一段代码约是这样
  1. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  2. {
  3.         int wmId, wmEvent;
  4.         PAINTSTRUCT ps;
  5.         HDC hdc;

  6.         switch (message)
  7.         {
  8.         case WM_COMMAND:
  9.                 wmId    = LOWORD(wParam);
  10.                 wmEvent = HIWORD(wParam);
  11.                                 switch (wmId)
  12.                 {
  13.                 case IDM_ABOUT:
  14.                         DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
  15.                         break;
  16.                 case IDM_EXIT:
  17.                         DestroyWindow(hWnd);
  18.                         break;
  19.                 default:
  20.                         return DefWindowProc(hWnd, message, wParam, lParam);
  21.                 }
  22.                 break;
  23.         case WM_PAINT:
  24.                 hdc = BeginPaint(hWnd, &ps);
  25.                                 EndPaint(hWnd, &ps);
  26.                 break;
  27.         case WM_DESTROY:
  28.                 PostQuitMessage(0);
  29.                 break;
  30.         default:
  31.                 return DefWindowProc(hWnd, message, wParam, lParam);
  32.         }
  33.         return 0;
  34. }
复制代码
请问为何要把
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
这几个变量为何用在那里呢?
我在那放了MessageBox测试
发现会死循环
在那里宣告不表示会循环宣告吗?
为何不直接把他换成全域变量呢?

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2013-08-16 08:43 |只看该作者
如果我没理解错LZ的疑问,这问题跟 WIN32API有毛的关系?

论坛徽章:
36
CU大牛徽章
日期:2013-09-18 15:24:20NBA常规赛纪念章
日期:2015-05-04 22:32:03牛市纪念徽章
日期:2015-07-24 12:48:5515-16赛季CBA联赛之辽宁
日期:2016-03-30 09:26:4715-16赛季CBA联赛之北控
日期:2016-03-30 11:26:2315-16赛季CBA联赛之广夏
日期:2016-05-20 15:46:5715-16赛季CBA联赛之吉林
日期:2016-05-24 11:38:0615-16赛季CBA联赛之青岛
日期:2016-05-30 13:41:3215-16赛季CBA联赛之同曦
日期:2016-06-23 16:41:052015年亚洲杯之巴林
日期:2015-02-03 15:05:04CU大牛徽章
日期:2013-09-18 15:24:52CU十二周年纪念徽章
日期:2013-10-24 15:46:53
3 [报告]
发表于 2013-08-16 08:51 |只看该作者
你怎么判断是死循环的?
首先你似乎不了解windows的消息机制,窗口过程要处理的窗口消息很多,所以会不停的调用这回调函数,以你点MessageBox的速度,肯定赶不上。
然后你说的把这些变量换成全局的,如果同时调用这个回调函数,结果这些变量不就乱了,还有那几个变量也不一定要定义在那里,只是习惯(如果要定义在后面的各个case里的话要加花括号,看这是C程序,以前标准是变量要定义在函数开头)。

论坛徽章:
0
4 [报告]
发表于 2013-08-16 11:30 |只看该作者
回复 1# 801901987


《windows程序设计》 第三章 慢走不送。


   

论坛徽章:
0
5 [报告]
发表于 2013-08-16 11:31 |只看该作者
回复 3# idi0t


    不在其它线程里创建窗口的话,wndproc不会重入吧?

论坛徽章:
36
CU大牛徽章
日期:2013-09-18 15:24:20NBA常规赛纪念章
日期:2015-05-04 22:32:03牛市纪念徽章
日期:2015-07-24 12:48:5515-16赛季CBA联赛之辽宁
日期:2016-03-30 09:26:4715-16赛季CBA联赛之北控
日期:2016-03-30 11:26:2315-16赛季CBA联赛之广夏
日期:2016-05-20 15:46:5715-16赛季CBA联赛之吉林
日期:2016-05-24 11:38:0615-16赛季CBA联赛之青岛
日期:2016-05-30 13:41:3215-16赛季CBA联赛之同曦
日期:2016-06-23 16:41:052015年亚洲杯之巴林
日期:2015-02-03 15:05:04CU大牛徽章
日期:2013-09-18 15:24:52CU十二周年纪念徽章
日期:2013-10-24 15:46:53
6 [报告]
发表于 2013-08-16 11:36 |只看该作者
回复 5# efolzl


    不在其它线程SendMessage应该都不会重入,保证不重入,定义全局也没什么,风格,习惯问题了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP