学习win32 API开发5-让窗口中显示文字
2014-03-24 16:44
344 查看
一、
运行程序,可以看到正常的窗口,然后把他最小化后,再恢复回来,就变样了背景色编程黑色的了,也就是说它没有被重新绘制。
当窗口被另一个窗口挡住,然后另一个窗口被移开,我们的程序窗口重新显示时,会发生重绘;但我们改变窗口的大小后,窗口也会发生重绘;当我们把窗口隐藏(如最小化)后再显示,它也会发生重绘。窗口就像一堵墙,在运行期间会不断地被重新粉刷。让窗口自动重绘,有一种简单的方法,就是在注册窗口类的时候,设置一个背景色,前面的程序就是这么干的。
二、当窗口需要重新绘制时,我们的程序都会收到一条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个地方出现文字了。
#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个地方出现文字了。
相关文章推荐
- 学习win32 API开发3-一个窗口创建的经典步骤
- 学习win32 API开发7-在窗口中使用控件
- 学习win32 API开发2-走进Windows窗口程序开发
- 学习win32 API开发6-给窗口添加菜单
- 学习win32 API开发4-GetLastError和FormatMessage获取错误信息
- 学习win32 API开发8-对话框
- 如何优雅的研究 RGSS3 番外(二) 显示文字信息的窗口中的纤程
- Canvas对画布及文字控制基础API学习
- MFC学习之 在按钮上加图标与文字共同显示
- ArcGIS API For Javascript开发利器(智能提示)和学习地址
- Kinect开发学习笔记之(四)提取颜色数据并用OpenCV显示
- WAP(wml)开发教程4--WML学习之显示文本和图片
- 【Win32 API学习】RegisterWindowMessage函数
- win32 sdk api 子窗口不闪烁,避免频繁闪烁,子窗口不重绘
- Win32 Api(显示程序系统菜单)
- OpenCV学习笔记(五十六)——InputArray和OutputArray的那些事core OpenCV学习笔记(五十七)——在同一窗口显示多幅图片 OpenCV学习笔记(五十八)——读《Mast
- java开发系统内核:实现窗口图形绘制API
- vs开发的程序在xp下显示 xxx.exe不是有效的win32程序问题解决
- ArcGIS API for Silverlight开发中鼠标左键点击地图上的点弹出窗口及右键点击弹出快捷菜单的实现代码
- OpenCV学习笔记(5)在单个窗口中显示多个视频子窗口