您的位置:首页 > 编程语言

学习win32 API开发5-让窗口中显示文字

2014-03-24 16:44 344 查看
一、

#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个地方出现文字了。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编程 windows win32 winapi