窗口过程--重绘窗口显示不同内容(带注释)

/*编写一个窗口程序,中间显示“嗨,我是一个窗口,主人刚刚把我做出来了。”,然后当窗口被重绘的时候显示“噢,我被重绘了n次”(n为当前重绘的次数)*/
#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;
	static TCHAR szBuffer[30] = TEXT("嗨,我是一个窗口,主人刚刚把我做出来了。");
	static int count;
	switch (message)
	{
	case WM_PAINT:
		hdc = BeginPaint(hwnd, &ps);
		GetClientRect(hwnd, &rect);
		DrawText(hdc, szBuffer, -1, &rect,
			DT_SINGLELINE | DT_CENTER | DT_VCENTER);
		count++;
		wsprintf(szBuffer, TEXT("噢,我被重绘了 %d 次!"), count);
		EndPaint(hwnd, &ps);
		return 0;

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
oid TerminateAnimation(){ KillTimer(g_hWnd, 1234); SetWindowText(g_hWnd, L"玻璃棋子的移动 - 棋子尚未被选中"); g_iChessSelected = 0; g_iAnimate = 0; g_xChess = g_xDes; g_yChess = g_yDes;}//---------------------------------------------------------------------------------------------------------------------------------------------------------/* 【函数编写】 当用户选中棋子后在棋盘上单击鼠标左键时,程序就启动了定时器,此后每隔10毫秒本函数就被执行一次。本函数的功能是,实现玻璃棋子的移动动画。 棋子原来的坐标是(g_xChess, g_yChess); 用户单击左键的坐标(即棋子的移动目的地)是(g_xDes, g_yDes); 棋子在移动过程中的临时坐标(即本函数上一次执行时赋予棋子的坐标)是(g_xPrev, g_yPrev)。 以上6个数据都是int型全局变量。 程序启动定时器时(既用户按下鼠标左键时),已将g_xPrev = g_xChess和g_yPrev = g_yChess。 你要做的是,在函数中用汉字占位的地方编写代码,利用这6个变量计算棋子的新g_xPrev和g_yPrev并更新这两个变量,因为最后那条RedrawWindow()将使用新的g_xPrev和g_yPrev重绘窗口一次。 另外,你需要将TerminateAnimation();复制粘贴到你的代码中合适的地方,以便在棋子移动到位时结束动画。*///---------------------------------------------------------------------------------------------------------------------------------------------------------void HandleTimer(HWND hwnd){ RedrawWindow(hwnd,NULL, NULL, RDW_INVALIDATE);}C语言编写,并注释
06-10

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值