窗口过程--自定义绘制窗口(带注释)

/*参考【API档案】DrawText,使得程序能够按照如下要求显示字符串:
要求一:居中显示多行字符串
要求二:如果客户区的宽度不够,会自动进行换行
要求三:如果客户区的高度不够,会自动截除显示不到的字符串
字符串提供给大家:
Hiding from the rain and snow.\n
Trying to forget but I won't let go.\n
Looking at a crowded street.\n
Listening to my own heart beat.\n\n
So many people all around the world.\n
Tell me where do I find someone like you girl.*/
#include<windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
/*WNDCLASS 结构
Windows 的窗口总是基于窗口类来创建的,窗口类同时确定了处理窗口消息的窗口过程(回调函数)。
在创建应用程序窗口之前,必须调用 RegisterClass 函数来注册窗口类。该函数只需要一个参数,
即指向 WNDCLASS 窗口类的指针。因为 WNDCLASS 类包含了窗口所拥有的基本属性。*/
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
	static TCHAR szAppName[] = TEXT("MyWindows");
	HWND hwnd;
	MSG msg;
	WNDCLASS wndclass;
	wndclass.style = CS_HREDRAW | CS_VREDRAW;			//指定窗口类型,各种“类风格”,可以使用按位或操作符组合起来
	//CS_VREDRAW	移动或者调整窗口的高度(垂直方向)时,重绘整个窗口
	//CS_HREDRAW	移动或者调整窗口的宽度(水平方向)时,重绘整个窗口
	wndclass.lpfnWndProc = WndProc;						//指定窗口过程(必须是回调函数)
	wndclass.cbClsExtra = 0;							//预留的额外空间,一般为 0
	wndclass.cbWndExtra = 0;							//预留的额外空间,一般为 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))						//RegisterClass注册窗口类
	{
		MessageBox(NULL, TEXT("这个程序需要在Windows NT 才能执行!"), szAppName, MB_ICONERROR);
		return 0;
	}
	/*CreateWindow 函数创建一个重叠式窗口、弹出式窗口或子窗口。它指定窗口类,窗口标题,窗口风格,以及窗口的
	初始位置及大小(可选的)。函数也指该窗口的父窗口或所属窗口(如果存在的话),及窗口的菜单。
	若要使用除 CreateWindow 函数支持的风格外的扩展风格,则使用 CreateWindowEx 函数代替 CreateWindow 函数。*/
	/*HWND WINAPI CreateWindow(
	_In_opt_  LPCTSTR lpClassName,    // 窗口类名称
	_In_opt_  LPCTSTR lpWindowName,   // 窗口标题
	_In_      DWORD dwStyle,          // 窗口风格,或称窗口格式
	_In_      int x,                  // 初始 x 坐标
	_In_      int y,                  // 初始 y 坐标
	_In_      int nWidth,             // 初始 x 方向尺寸
	_In_      int nHeight,            // 初始 y 方向尺寸
	_In_opt_  HWND hWndParent,        // 父窗口句柄
	_In_opt_  HMENU hMenu,            // 窗口菜单句柄
	_In_opt_  HINSTANCE hInstance,    // 程序实例句柄
	_In_opt_  LPVOID lpParam          // 创建参数
	);*/
	hwnd = CreateWindow(szAppName,	// 窗口类名称
		TEXT("酷酷的糖"),			// 窗口标题
		WS_OVERLAPPEDWINDOW,		// 窗口风格,或称窗口格式
		//WS_OVERLAPPEDWINDOW相当于(WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX)
		CW_USEDEFAULT,				// 初始 x 坐标
		CW_USEDEFAULT,				// 初始 y 坐标
		CW_USEDEFAULT,				// 初始 x 方向尺寸
		CW_USEDEFAULT,				// 初始 y 方向尺寸
		NULL,						// 父窗口句柄
		NULL,						// 窗口菜单句柄
		hInstance,					// 程序实例句柄
		NULL);						// 创建参数

	ShowWindow(hwnd, iCmdShow);		//显示窗口
	UpdateWindow(hwnd);				//更新窗口

	/*BOOL WINAPI GetMessage(
	_Out_     LPMSG lpMsg,
	_In_opt_  HWND hWnd,
	_In_      UINT wMsgFilterMin,
	_In_      UINT wMsgFilterMax
	);*/
	while (GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	RECT rect;

	switch (message)
	{
	case WM_PAINT:
		hdc = BeginPaint(hwnd, &ps);
		GetClientRect(hwnd, &rect);
		DrawText(hdc, TEXT("Hiding from the rain and snow.\nTrying to forget but I won't let go.\nLooking at a crowded street.\nListening to my own heart beat.\n\nSo many people all around the world.\nTell me where do I find someone like you girl."), -1, &rect,
			DT_CENTER | DT_VCENTER | DT_WORDBREAK | DT_WORD_ELLIPSIS);
		EndPaint(hwnd, &ps);
		return 0;

	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}

	return DefWindowProc(hwnd, message, wParam, lParam);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值