查了一些资料,说showwindows是显示窗口,UpdateWindow函数是更新窗口,一般的窗口创建过程大家都知道,如下:
1.设计窗口类
2.注册窗口类
3.ShowWindow()
4.UpdateWindow()
5.消息循环窗口过程函数里的WM_paint消息就简单地输出一个"test"字符串如下:
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
TextOut(hdc,0,0,L"test",wcslen(L"test"));
EndPaint(hWnd, &ps);
break;我想问的是:
(1)在ShowWindow()后,为何还要多用一个UpdateWindow(),我在实质测试时把UpdateWindow()删除时运行结果还是一致的。
(2)据查资料,UpdateWindow()函数实质是产生一个WM_PAINT消息,所以在运行程序后,弹出的窗口中就输出了test字符,这个可以理解,但为何把UpdateWindow()函数注释掉,只保留ShowWindow(),程序运行时还是会出现test字符?如果认为是窗口从无到有时产生重绘消息产生的文本,那是否表示在不注释掉UpdateWindow()时已经响应了两次WM_PAINT消息呢?
(3)关于程序运行顺序的问题,按照正常的运行步骤应该是:ShowWindow和UpdateWindow后,进行消息循环里的
while (GetMessage(&msg, NULL, 0, 0))
从而将消息取出进行响应,但实质调试时,在UpdateWindow()、while (GetMessage(&msg, NULL, 0, 0))和case WM_PAINT三处分别设置断点,在调试时,发现实质的运行顺序是UpdateWindow()后直接到case WM_PAINT,进行了消息响应,再到消息循环的while (GetMessage(&msg, NULL, 0, 0)),也就是说UpdateWindow产生WM_PAINT消息后直接就响应了消息,而不是通过这GetMessage()取出再响应的,这点让我很不解,求指教问题比较繁琐且啰嗦,菜鸟一个,求指点
1.设计窗口类
2.注册窗口类
3.ShowWindow()
4.UpdateWindow()
5.消息循环窗口过程函数里的WM_paint消息就简单地输出一个"test"字符串如下:
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
TextOut(hdc,0,0,L"test",wcslen(L"test"));
EndPaint(hWnd, &ps);
break;我想问的是:
(1)在ShowWindow()后,为何还要多用一个UpdateWindow(),我在实质测试时把UpdateWindow()删除时运行结果还是一致的。
(2)据查资料,UpdateWindow()函数实质是产生一个WM_PAINT消息,所以在运行程序后,弹出的窗口中就输出了test字符,这个可以理解,但为何把UpdateWindow()函数注释掉,只保留ShowWindow(),程序运行时还是会出现test字符?如果认为是窗口从无到有时产生重绘消息产生的文本,那是否表示在不注释掉UpdateWindow()时已经响应了两次WM_PAINT消息呢?
(3)关于程序运行顺序的问题,按照正常的运行步骤应该是:ShowWindow和UpdateWindow后,进行消息循环里的
while (GetMessage(&msg, NULL, 0, 0))
从而将消息取出进行响应,但实质调试时,在UpdateWindow()、while (GetMessage(&msg, NULL, 0, 0))和case WM_PAINT三处分别设置断点,在调试时,发现实质的运行顺序是UpdateWindow()后直接到case WM_PAINT,进行了消息响应,再到消息循环的while (GetMessage(&msg, NULL, 0, 0)),也就是说UpdateWindow产生WM_PAINT消息后直接就响应了消息,而不是通过这GetMessage()取出再响应的,这点让我很不解,求指教问题比较繁琐且啰嗦,菜鸟一个,求指点
解决方案 »
- 跪求一个谱减法算法的VC++程序
- 单文档界面的view类中成员如何被访问
- 读取域控制器下的所有容器ou、帐户信息 ,请问该如何实现?
- 动态库中执行查询数据库会影响调用程序的线程执行吗?
- 恳请求各位提供 vc++技术内幕 中文版 电子书或教程
- 关于DrawText的一个问题
- 能不能帮我看看为什么我用以下代码测试不出中文字符来(续上贴:请问有谁知道中文字符的ASCII码范围?)
- 关于创建word编码的问题
- MFC界面上怎么制作类似于打字机效果的文字显示
- 有谁见过outlook express联系人中加图片的
- 为什么说动态联编在编译时无法确定调用哪个函数,只有在程序运行时才能确定
- 有没有人看过这篇文章?关于图像处理的
(2)据查资料,UpdateWindow()函数实质是产生一个WM_PAINT消息,所以在运行程序后,弹出的窗口中就输出了test字符,这个可以理解,但为何把UpdateWindow()函数注释掉,只保留ShowWindow(),程序运行时还是会出现test字符?如果认为是窗口从无到有时产生重绘消息产生的文本,那是否表示在不注释掉UpdateWindow()时已经响应了两次WM_PAINT消息呢?
====================
WM_PAINT消息是否产生关键是看是不是有无效区出现。关于ShowWindow与UpdateWindow的作用,ShowWindow的作用是显示/隐藏窗口,UpdateWindow刷新窗口,显示/隐藏窗口只能用ShowWindow,当然显示时也会刷新。所以刷新窗口 这两个都可以用。如果认为是窗口从无到有时产生重绘消息产生的文本,那是否表示在不注释掉UpdateWindow()时已经响应了两次WM_PAINT消息呢?
=============
任何情况下消息队列中都不可能出现两个WM_PAINT消息的,当有两个WM_PAINT消息,系统会将两个无效区合并成一个,形成一个WM_PAINT消息。(3)关于程序运行顺序的问题,按照正常的运行步骤应该是:ShowWindow和UpdateWindow后,进行消息循环里的
C/C++ codewhile (GetMessage(&msg, NULL, 0, 0))从而将消息取出进行响应,但实质调试时,在UpdateWindow()、while (GetMessage(&msg, NULL, 0, 0))和case WM_PAINT三处分别设置断点,在调试时,发现实质的运行顺序是UpdateWindow()后直接到case WM_PAINT,进行了消息响应,再到消息循环的while (GetMessage(&msg, NULL, 0, 0)),也就是说UpdateWindow产生WM_PAINT消息后直接就响应了消息,而不是通过这GetMessage()取出再响应的,这点让我很不解,求指教
=======================
这个问题就涉及到UpdateWindow了,本来WM_PAINT消息的优先级是很低的,窗口不一定会及时处理这个消息,而UpdateWindow会让窗口及时处理WM_PAINT消息。
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,
显示/隐藏窗口只能用ShowWindow
其中的隐藏窗口是指最小化,还是在别的窗口之下?
其中的隐藏窗口是指最小化,还是在别的窗口之下?
=============
隐藏就是隐藏,也就是看不见了,既不是最小化,也不是在别的窗口之下,比如你调用:
ShowWindow(hWnd,SW_HIDE);之后,这个窗口就看不见了。