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

一、

#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开发5-让窗口中显示文字_第1张图片



你可能感兴趣的:(windows开发,编程,windows,win32,winapi)