#include "windows.h"
void ShowErrMsg()
{
TCHAR szBuf[80];
LPVOID lpMsgBuf;
DWORD dw = GetLastError();
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dw,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0, NULL );
MessageBox(NULL, (LPTSTR)lpMsgBuf, "系统错误", MB_OK|MB_ICONSTOP);
//OutputDebugString();
LocalFree(lpMsgBuf);
}
LRESULT CALLBACK WinProc(HWND hwnd,UINT umsg,WPARAM wparam,LPARAM lparam);
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrecInstance,
LPSTR lpCmdLine,
int nShowCmd
)
{
TCHAR* clsName="myclass";
WNDCLASS mwc;
//设计窗口类
mwc.lpfnWndProc = WinProc; //窗口处理函数
//mwc.hbrBackground = (HBRUSH)COLOR_WINDOW; //窗口背景色
mwc.lpszClassName = clsName; // 窗口类名
mwc.style = NULL; //窗口类型
mwc.cbClsExtra = 0; //窗口扩展
mwc.cbWndExtra = 0; //窗口实例扩展
mwc.hCursor = NULL; //窗口鼠标光标
mwc.hIcon = NULL; //窗口的最小化图标
mwc.lpszMenuName = NULL; //窗口菜单
mwc.hInstance = hInstance; //实例句柄
//注册窗口类
RegisterClass(&mwc);
//创建窗口
HWND hwnd = CreateWindow(
clsName, //类名,就是刚才注册的
//"HEHE",
TEXT("Windows的标题"), //窗口标题
WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX, //外观样式
400, //相对于父窗口的X坐标
150, //相对于父窗口的Y坐标
400, //窗口的宽
400, //窗口的高
NULL, //父窗口,没有就写NULL
NULL, //窗口菜单,也没有,写NULL
hInstance, //当前应用程序的实例句柄
NULL); //附加数据,没有,为NULL
if( hwnd == NULL) //检查窗口是否创建成功
{
ShowErrMsg();
//DWORD err = GetLastError();
//TCHAR er[123] ;
//wsprintf(er,"%i",err);
//MessageBox(NULL,er,TEXT("提示"),MB_ICONWARNING);
MessageBox(NULL,TEXT("创建窗口失败"),TEXT("提示"),MB_ICONWARNING);
return 0;
}
//显示窗口和更新窗口
ShowWindow(hwnd,SW_SHOW);
UpdateWindow(hwnd);
//消息循环
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
//MessageBox(NULL,TEXT("你好 Windows 世界^_^"),TEXT("标题"),MB_OK);
return 0;
}
LRESULT CALLBACK WinProc(HWND hwnd,UINT umsg,WPARAM wparam,LPARAM lparam)
{
switch(umsg)
{
case WM_DESTROY:
{
PostQuitMessage(0); //终止程序
return 0;
}
}
return DefWindowProc(hwnd,umsg,wparam,lparam);
}
运行程序,可以看到正常的窗口,然后把他最小化后,再恢复回来,就变样了背景色编程黑色的了,也就是说它没有被重新绘制。
当窗口被另一个窗口挡住,然后另一个窗口被移开,我们的程序窗口重新显示时,会发生重绘;但我们改变窗口的大小后,窗口也会发生重绘;当我们把窗口隐藏(如最小化)后再显示,它也会发生重绘。窗口就像一堵墙,在运行期间会不断地被重新粉刷。让窗口自动重绘,有一种简单的方法,就是在注册窗口类的时候,设置一个背景色,前面的程序就是这么干的。
二、当窗口需要重新绘制时,我们的程序都会收到一条WM_PAINT消息,我们可以响应它来完成绘制。
代码写在消息处理函数中:
LRESULT CALLBACK WinProc(HWND hwnd,UINT umsg,WPARAM wparam,LPARAM lparam)
{
switch(umsg)
{
case WM_PAINT:
{
PAINTSTRUCT ps;
BeginPaint(hwnd,&ps);
DrawText(ps.hdc,TEXT("你好啊"),6,&(ps.rcPaint),DT_CENTER);
EndPaint(hwnd,&ps);
}
return 0;
case WM_DESTROY:
{
PostQuitMessage(0);//终止程序
return 0;
}
}
return DefWindowProc(hwnd,umsg,wparam,lparam);
}
现在运行程序后,看到窗口中有“你好啊”的文字,但是,最大化窗口后可以发现,窗口中有2个地方有“你好啊”这个文字。
接着修改,把设计窗口类中的窗口类型修改下:mwc.style = CS_HREDRAW | CS_VREDRAW;
好了,现在运行可以了,最大化就不会有2个地方出现文字了。