请各位解释一下下面程序,我有问题请教
头文件如下:
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




