窗口过程-windows程序设计 为什么窗口一开始空白,需要最小化或者改变大小才显示

问题描述

windows程序设计 为什么窗口一开始空白,需要最小化或者改变大小才显示
/*-----------------------------------------
SINEWAVE.C -- Sine Wave Using Polyline
(c) Charles Petzold 1998
-----------------------------------------*/

#include
#include

#define NUM 1000
#define TWOPI (2 * 3.14159)

LRESULT CALLBACK WndProc(HWND UINT WPARAM LPARAM);

int WINAPI WinMain(HINSTANCE hInstance HINSTANCE hPrevInstance
PSTR szCmdLine int iCmdShow)
{
static TCHAR szAppName[] = TEXT(""SineWave"");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;

wndclass.style = CS_HREDRAW | CS_VREDRAW;wndclass.lpfnWndProc = WndProc;wndclass.cbClsExtra = 0;wndclass.cbWndExtra = 0;wndclass.hInstance = hInstance;wndclass.hIcon = LoadIcon(NULL IDI_APPLICATION);wndclass.hCursor = LoadCursor(NULL IDC_ARROW);wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.lpszMenuName = NULL;wndclass.lpszClassName = szAppName;if (!RegisterClass(&wndclass)){    MessageBox(NULL TEXT(""Program requires Windows NT!"")        szAppName MB_ICONERROR);    return 0;}hwnd = CreateWindow(szAppName TEXT(""Sine Wave Using Polyline"")    WS_OVERLAPPEDWINDOW    CW_USEDEFAULT CW_USEDEFAULT    CW_USEDEFAULT CW_USEDEFAULT    NULL NULL hInstance NULL);ShowWindow(hwnd iCmdShow);UpdateWindow(hwnd);while (GetMessage(&msg NULL 0 0)){    TranslateMessage(&msg);    DispatchMessage(&msg);}return msg.wParam;

}

LRESULT CALLBACK WndProc(HWND hwnd UINT message WPARAM wParam LPARAM lParam)
{
static int cxClient cyClient;
HDC hdc;
int i;
PAINTSTRUCT ps;
POINT apt[NUM];

switch (message){case WM_SIZE:    cxClient = LOWORD(lParam);    cyClient = HIWORD(lParam);    return 0;case WM_PAINT:    hdc = BeginPaint(hwnd &ps);    MoveToEx(hdc 0 cyClient / 2 NULL);    LineTo(hdc cxClient cyClient / 2);    for (i = 0; i < NUM; i++)    {        apt[i].x = i * cxClient / NUM;        apt[i].y = (int)(cyClient / 2 * (1 - sin(TWOPI * i / NUM)));    }    Polyline(hdc apt NUM);    return 0;case WM_DESTROY:    PostQuitMessage(0);    return 0;}return DefWindowProc(hwnd message wParam lParam);

}

而一般的程序都是直接显示,这个程序哪儿不同了?
下面是前面写过的一个。
#include
#include""SYSMETS.h""
LRESULT CALLBACK WndProc(HWND UINT WPARAM LPARAM);

int WINAPI WinMain(HINSTANCE hInstance HINSTANCE hPrevInstance PSTR szCmdLine int iCmdShow)
{
static WCHAR szAppName[] = L""SYSMET1"";
HWND hwnd;
MSG msg;
WNDCLASS wndclass;

wndclass.style = CS_HREDRAW | CS_VREDRAW;wndclass.lpfnWndProc = WndProc;wndclass.cbClsExtra = 0;wndclass.cbWndExtra = 0;wndclass.hInstance = hInstance;wndclass.hIcon = LoadIcon(nullptr IDI_APPLICATION);wndclass.hCursor = LoadCursor(nullptr IDC_ARROW);wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.lpszMenuName = nullptr;wndclass.lpszClassName = szAppName;if (!RegisterClass(&wndclass)){    MessageBox(NULL L""需要win32操作系统。"" L""error"" MB_OKCANCEL);    return  0;}hwnd = CreateWindow(szAppName L""SYSMETS"" WS_OVERLAPPEDWINDOW|WS_VSCROLL CW_USEDEFAULT CW_USEDEFAULT CW_USEDEFAULT CW_USEDEFAULT nullptr nullptr hInstance nullptr);ShowWindow(hwnd iCmdShow);UpdateWindow(hwnd);while (GetMessage(&msg NULL 0 0)){    TranslateMessage(&msg);    DispatchMessage(&msg);}return msg.wParam;

}

LRESULT CALLBACK WndProc(HWND hwnd UINT message WPARAM wParam LPARAM lParam)
{
static int cxChar cyChar cxCapscyClientiVscrollPos;
HDC hdc;
PAINTSTRUCT ps;
TEXTMETRIC tm;
static wchar_t szBuffer[10];
switch (message)
{
case WM_CREATE:
hdc = GetDC(hwnd);
GetTextMetrics(hdc &tm);
cxChar = tm.tmAveCharWidth;
cyChar = tm.tmHeight + tm.tmExternalLeading;
cxCaps = int(1.5*double(cxChar));
ReleaseDC(hwnd hdc);

    SetScrollRange(hwnd SB_VERT 0 NUMLINES - 1 FALSE);    SetScrollPos(hwndSB_VERTiVscrollPosTRUE);    return 0;case WM_SIZE:    cyClient = HIWORD(lParam);    return 0;case WM_VSCROLL:    switch (LOWORD(wParam))    {    case SB_LINEUP:        iVscrollPos -= 1;break;        break;    case SB_LINEDOWN:        iVscrollPos += 1;break;    case SB_PAGEUP:        iVscrollPos -= cyClient / cyChar;break;    case SB_PAGEDOWN:        iVscrollPos += cyClient / cyChar;break;    case SB_THUMBPOSITION:        iVscrollPos = HIWORD(wParam);break;    default:break;    }    if (iVscrollPos < 0)iVscrollPos = 0;    else if (iVscrollPos>NUMLINES - 1)iVscrollPos = NUMLINES - 1;    if (iVscrollPos != GetScrollPos(hwnd SB_VERT))    {        SetScrollPos(hwnd SB_VERT iVscrollPos TRUE);        InvalidateRect(hwnd NULL TRUE);     }case WM_PAINT:    hdc = BeginPaint(hwnd &ps);    for (int i = 0;i != NUMLINES;++i)    {        int y = cyChar*(i - iVscrollPos);        TextOut(hdc 0 y sysmetrics[i].szLabel lstrlen(sysmetrics[i].szLabel));        TextOut(hdc 22 * cxCaps y sysmetrics[i].szDesc lstrlen(sysmetrics[i].szDesc));        SetTextAlign(hdc TA_RIGHT | TA_TOP);        TextOut(hdc 22 * cxCaps + 40 * cxChar y szBuffer wsprintf(szBuffer L""%5d"" GetSystemMetrics(sysmetrics[i].iIndex)));        SetTextAlign(hdc TA_LEFT | TA_TOP);    }    EndPaint(hwnd &ps);    return 0;case WM_DESTROY:    PostQuitMessage(0);    return 0;}return DefWindowProc(hwnd message wParam lParam);

}
具体什么原因 求大神解答,自己从WM_SIZE WM_CREATE UpdateWindow各个方面去思考都想不通。

解决方案

本人感觉应该是没有刷新窗口的原因,在最小化然后最大化之后窗口重新刷新了,所以这个时候才显示了。

时间: 2024-11-02 06:04:44

窗口过程-windows程序设计 为什么窗口一开始空白,需要最小化或者改变大小才显示的相关文章

窗口风格-windows编程中怎样让建立的窗口不能拉伸,应该设置什么样式?

问题描述 windows编程中怎样让建立的窗口不能拉伸,应该设置什么样式? 最近在学习Windows编程,看windows程序设计,但那个hellowin程序出来的窗口是可以拉伸的,怎样固定下来,让窗口不可以拉伸,应该是一个窗口样式或者风格,但老是查不出来,求助! 解决方案 WS_SIZEBOX WS_THICKFRAM 解决方案二: http://blog.csdn.net/diaolingle/article/details/17284711 解决方案三: WS_BORDER 0X00800

模态窗口其实就是在当前窗口调用系统的消息循环,响应用户的操作,将相关的消息发送到对应的窗口(转)

  上周准备在公司内部转岗,面了3个部门windows客户端相关的工作,最终拿到3个Offer,主要涉及C++和Windows两大块内容,C++的题目基本都答上了,Windows一直都是我的弱项,在这里记录一下Windows相关的题目.有些答不上的问题就没列出来,还有些问题忘了,下面的答案有些大部分是我自己的理解,有些是直接从网上copy的,有问题大家可以讨论. 1:GetMessage和PeekMessage的区别? GetMessage:获取消息队列中的一个消息,存入MSG中,并从消息队列中

对最小化的窗口截图/取色的问题

问题描述 查了不少地方,找到的资料的意思是最小化之后窗口为了节省性能开支就没有继续刷新了,所以取不到.网上的解决方法是取屏幕的分辨率,然后把目标窗口移动到右下角去,这样在屏幕上看不见这个窗口,看起来和最小化差不多,取色也可以取到,但是这样做一般是用bottom点击之类的来做,和一般窗口操作习惯不同,用起来很别扭.我想问下,我现在有这个程序中的一个窗口的句柄,没有这个程序的源码1.可不可以令最小化的程序窗口强制继续刷新2.可不可以把窗口最小化.恢复按钮的点击/任务栏点击事件改成我自己定义的操作(就

三星S6 edge如何使用多窗口分屏?S6多窗口分屏使用教程

长按最近应用程序键即可打开多窗口分屏功能,具体使用方法,请按以下步骤操作:  1.长按[最近应用程序]键.    2.阅读屏幕文字说明后,选择一个需要以多窗口分屏视图打开的应用程序,这里以点击[S 日历]为例.    3.S 日历已在屏幕上半部分显示,选择另一个应用程序,这里以点击[信息]为例.    4.信息已在屏幕下半部分显示,点击两个程序中间的[圆点]图标.    5.显示的功能从左到右依次为切换窗口.拖放内容.最小化窗口.最大化窗口.关闭应用程序.点击[切换窗口]图标.    6.信息和

MyEclipse中各个类及包资源管理窗口最大化和最小化图标不管用

问题描述 在包资源管理窗口和结果窗口中以及每个打开的类都有最大化,最小化和关闭的快捷图标,可是今天打开机器后,单击这此图标却不管用.怎么回事,只有当双击时,该窗口会成为最大化. 解决方案 解决方案二:机器温度过高,一般是硬盘的问题.

《Windows 程序设计(第3版)》——6.7 【实例】窗口查看器

6.7 [实例]窗口查看器 本节将用具体实例让你切身体会对象化程序设计方式,从而感受框架程序提供的近乎完美的程序接口. 程序的主要功能是显示鼠标所指向窗口的一些信息,如标题.窗口类名和应用程序名称等.其运行效果如图6.7所示.在主窗口左上角矩形框中按下鼠标,光标将变成图中带十字的黑圆圈形状.按住鼠标左键移动这个黑圆圈,窗口查看器会显示出黑圆圈下窗口的属性信息.例子程序在配套光盘的06WinLooker工程下.最好先运行此程序熟悉一下它的功能. 例子的创建过程是:先创建一个空的Win32 Appl

《Windows 程序设计(第3版)》——6.3 创建窗口

6.3 创建窗口 6.3.1 窗口函数 Windows为每个窗口都提供了默认的消息处理函数,自定义类的窗口的默认消息处理函数是DefWindowProc,各子窗口控件(见7.1节)的类名是Windows预定义的,其窗口函数自然由Windows提供. 我们的框架也提供了一个通用的消息处理函数AfxWndProc.为了响应窗口消息,必须让Windows把窗口的消息处理函数的地址全设为AfxWndProc,在处理消息时由我们自己决定是否调用默认的消息处理函数.改变窗口消息处理函数地址最简单的办法是使用

windows 消息机制、窗口过程与线程间消息传递

按照自己的理解好好整理一遍 消息机制 windows是一个消息驱动的系统,会有一个总的系统消息的队列,鼠标.键盘等等都会流入到这个队列中,同时会为每个线程维护一个消息队列(注意默认是有GUI调用的线程才有,对于没有GUI或者窗口的线程,只有当在线程内调用get/peek message 才会自动创建一个消息队列),线程是容纳消息队列的基本单元,系统会把属于不同线程的消息投递到属于线程的消息队列中 当线程调用get/peek message时会从系统的消息队列中取出一个本线程内的消息.(get方法

《Windows 程序设计(第3版)》——第6章 框架中的窗口 6.1 CWnd类的引出

第6章 框架中的窗口 前面讲述了类库框架管理应用程序的基本方式,以及它的执行顺序.本章将继续介绍如何在框架程序执行的过程中创建窗口和响应线程内发送给窗口的消息. 消息处理是Win32应用程序的灵魂,也是本章重点讨论的话题.本章最终要设计一个能够实现消息映射的基本构架. 6.1 CWnd类的引出 在类的体系结构中,框架程序提供了CWnd类来封装窗口的HWND句柄,即使用CWnd类来管理窗口的对象,这包括窗口的创建和销毁.窗口的一般行为和窗口所接受的消息. 为了使其他的类也有处理消息的机会,我们可以