CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

请各位解释一下下面程序,我有问题请教

楼主zhzhzhh(早上睡不醒)2002-04-04 21:04:41 在 C/C++ / C语言 提问

头文件如下:  
  LRESULT   CALLBACK   MainWndProc(HWND,UINT,WPARAM,LPARAM);  
  BOOL   InitApplication(HINSTANCE);  
  BOOL   InitInstance(HINSTANCE,int);  
   
  char   *hello="窗口外的世界很精彩,窗口内的天地也很奇妙";  
   
  源程序如下:  
  #include   <windows.h>  
  #include   <string.h>  
  #include   "simpwin.h"  
   
  HINSTANCE   hInst;  
  HWND     hWndMain;  
   
  int   APIENTRY   WinMain(HINSTANCE   hInstance,HINSTANCE   hPrevInstance,  
    LPSTR   lpCmdLine,int   nCmdShow)  
  {  
  MSG   msg;  
   
  if(!InitApplication(hInstance))  
  return(FALSE);  
   
  if(!InitInstance(hInstance,nCmdShow))  
  return(FALSE);  
   
  while(GetMessage(&msg,NULL,0,0))  
  {  
  TranslateMessage(&msg);  
  DispatchMessage(&msg);  
  }  
   
  return(msg.wParam);  
  }  
   
  BOOL   InitApplication(HINSTANCE   hInstance)  
  {  
  WNDCLASS   wcSimpwin;  
   
  wcSimpwin.style=0;  
  wcSimpwin.lpfnWndProc=(WNDPROC)MainWndProc;  
  wcSimpwin.cbClsExtra=0;  
  wcSimpwin.cbWndExtra=0;  
  wcSimpwin.hInstance=hInstance;  
  wcSimpwin.hIcon=LoadIcon(NULL,IDI_APPLICATION);  
  wcSimpwin.hCursor=LoadCursor(NULL,IDC_ARROW);  
  wcSimpwin.hbrBackground=GetStockObject(WHITE_BRUSH);  
  wcSimpwin.lpszMenuName=NULL;  
  wcSimpwin.lpszClassName="Simpwin   WClass";  
   
  return(RegisterClass(&wcSimpwin));  
  }  
   
  BOOL   InitInstance(HINSTANCE   hInstance,int   nCmdShow)  
  {  
  hInst=hInstance;  
  hWndMain=CreateWindow("Simpwin   WClass","我的窗口",WS_OVERLAPPEDWINDOW,  
  CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,  
  hInstance,NULL);  
   
  if(!hWndMain)  
  return(FALSE);  
   
  ShowWindow(hWndMain,nCmdShow);  
  // UpdateWindow(hWndMain);  
   
   
  return(TRUE);  
  }  
   
  LRESULT   CALLBACK   MainWndProc(HWND   hWnd,UINT   message,WPARAM   wParam,  
    LPARAM   lParam)  
  {  
  HDC   hdc;  
  PAINTSTRUCT   ps;  
   
  switch(message)  
  {  
  case   WM_PAINT:  
  hdc=BeginPaint(hWnd,&ps);  
  TextOut(hdc,20,10,hello,lstrlen(hello));  
  EndPaint(hWnd,&ps);  
  break;  
  case   WM_DESTROY:  
  PostQuitMessage(0);  
  break;  
  default:  
  return(DefWindowProc(hWnd,message,wParam,lParam));  
  }  
   
  return(0);  
  }  
  我的问题是,各位可以看到我将UpdateWindow函数给注释掉了,原文当然不是,只是我很诧异,二者为什么运行结果没区别呢?  
   
  问题点数:20、回复次数:11Top

1 楼zx_sanjin(www.chmbook.com - CHM电子书网)回复于 2002-04-04 23:10:06 得分 0

是这样的(我刚试验过的):  
   
  之前的操作:  
  IDD_DIALOG_TEMP里添加一个控件  
  CDialog   m_dlg;  
  dlg.Create(IDD_DIALOG_TEMP);  
   
  在另一处:  
  dlg.ShowWindow(SW_SHOW);  
  dlg.UpdateWindow();             //向dlg中所有的控件发送WM_PAINT的消息  
  Sleep(5000);                           //可看到效果  
  dlg.DestroyWindow();  
   
  UpdateWindow()中MSDN解释:  
  The   UpdateWindow   function   updates   the   client   area   of   the   specified   window   by   sending   a   WM_PAINT   message   to   the   window   if   the   window's   update   region   is   not   empty.   The   function   sends   a   WM_PAINT   message   directly   to   the   window   procedure   of   the   specified   window,   bypassing   the   application   queue.   If   the   update   region   is   empty,   no   message   is   sent.    
   
  ShowWindow(hWndMain,nCmdShow);只重绘拥有本句柄的窗口,   而重绘其中控件的的工作则是当函数体结束时再进行的操作~~~~  
  Top

2 楼hahbs(度寒)回复于 2002-04-05 00:22:42 得分 0

这个典型的c写法,和mfc一点关系都没有.  
  这里注掉的是初始化里的updatewindow,在这个程序里确实可有可无,因为ShowWindow会发出WM_PAINT消息,而你在WM_PAINT的处理不是调用了EndPaint,这个函数会调用ShowWindow,所以这个UpdateWindow是可有可无的.这只是一个保险而且讲义气的写法,因为MainWndProc是回调函数,由系统决定何时调用,而不是你的程序.再说了,刷新主窗口是winmain的义务,不能指望窗口处理程序.Top

3 楼hahbs(度寒)回复于 2002-04-05 00:23:56 得分 0

对不起,写错了,endpaint会调用updatewindowTop

4 楼zx_sanjin(www.chmbook.com - CHM电子书网)回复于 2002-04-05 00:57:51 得分 0

To   hahbs(度寒):  
  不对!   试一下我上面的程序,   ShowWindow不会发送WM_PAINT的消息给它的所有子窗口!!!!Top

5 楼maoliao(毛料)回复于 2002-04-05 01:06:47 得分 0

gzTop

6 楼hahbs(度寒)回复于 2002-04-05 03:46:36 得分 0

对不起,我刚才昏了头,(很久不用c写window的程序了,也可以原谅吧?),ShowWindow其实是通知window如何显示这个窗口:最大化,最小化,常规.  
  而updatewindow是通过发一个WM_PAINT消息来导致客户区重绘,beginpaint先刷背景而后给出一个显示器的句柄hdc,textout用hdc写字,而endpaint也只是释放句柄并不调用updatewindow(那样岂不是死循环).所以问题的答案看来只能是,系统在主窗口创立之初自主连续发了两个消息:WM_CREATE,WM_PAINT,所以这个updatewindow才可有可无.  
  感谢zx_sanjin(1.5kg,   不赊账~~~)指出我的错误,但是zx_sanjin(1.5kg,   不赊账~~~)说的其实是另一个事情,dlg.UpdateWindow,dlg.ShowWindow都是mfc中的类函数我记得应该是继承自cwnd,和这里说的updatewindow,showwindow是两回事,这是window的系统调用,这个程序是最原始的用c写window的程序,不但和mfc无关,和c++也没有牵连.  
  请楼主把上两个帖子删掉,以免怡笑大方,嗯,就是不知道会不会扣分.Top

7 楼zhzhzhh(早上睡不醒)回复于 2002-04-05 10:59:25 得分 0

看了hahbs(度寒)的文章,使我茅塞顿开,可惜我上CSDN时间不长,要怎么给分啊?Top

8 楼zx_sanjin(www.chmbook.com - CHM电子书网)回复于 2002-04-05 19:24:57 得分 10

再To   hahbs(度寒):  
  也谢你能指出我的错误,   如果仔细追究的话两个函数当然是不同的`~~:(  
  我只是拿出这个简单的例子来证明一下,   因为MFC保持了同SDK的兼容,   它的函数命名及风格参数都是与SDK基本保持一致的,   就如FALSE   =   false   =   0   一样~~    
   
  不过道理都明白了好像就没有讨论的必要了~~   :(   真是失败~~:(    
  Top

9 楼hahbs(度寒)回复于 2002-04-05 20:10:26 得分 10

to   zx_sanjin(1.5kg,   不赊账~~~):  
  一笑了于心  
  to   zhzhzhh(早上睡不醒)   :  
  不会给就不给吧,不结帖也好,因为我也说不准那个WM_PAINT到底是谁发出来的,以待高手也好.  
  Top

10 楼zhzhzhh(早上睡不醒)回复于 2002-04-05 21:23:15 得分 0

我真的很羡慕你这种处与高处又很谦虚的人啊,以后还望多指教啊!Top

相关问题

  • 请各位高手帮小弟解释一下下面的COM+程序
  • 请各位解释一下下面程序,我有问题请教
  • 请各位帮忙解释下面一段程序(主要是“流”类ofstream的用法)。解决给分!!!
  • 请各位高手解释一小段程序.
  • 请各位老大帮忙解释一下这段程序
  • 请帮我解释一下下面的段程序
  • 谁能解释一下下面程序的输出结果
  • 解释下面程序是何意思,谢谢!
  • 那位仁兄帮忙解释一下下面程序的语法含义?
  • 大家能不能解释下面这段程序的功能呀,谢谢!

关键词

  • 函数
  • 控件
  • null
  • wcsimpwin
  • hinstance
  • simpwin
  • dlg
  • updatewindow
  • hwndmain
  • ncmdshow

得分解答快速导航

  • 帖主:zhzhzhh
  • zx_sanjin
  • hahbs

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo