windows基础编程----第六篇(绘画出一个会动的矩形)

上一篇中,使用我们自己的画刷调用了GDI绘画出一个小矩形。这一篇再来做个更有意思的事情。让这一个矩形动起来。

基础概念也说的差不多了,所以,这里就不再多说,直接贴代码出来了~

#include <windows.h>  

//函数声明  
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);//窗口处理函数  
void init();//初始化设备环境  
void Render();//渲染函数  
void CleanUp();//释放设备环境  

//变量定义  
HWND hwnd;
HDC hdc;
HPEN hOldPen, hPen;
HBRUSH hOldBrush, hBrush;
RECT rtClient = { 0 };//当前窗口大小  
RECT rt = { 0 };//矩形  
int dir1 = 1;//x轴方向判断  
int dir2 = 1;//y轴方向判断  
//主函数  
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow)
{
	//设计窗口类  
	WNDCLASS wndclass = {
		CS_HREDRAW | CS_VREDRAW,
		WndProc,
		0,
		0,
		hInstance,
		LoadIcon(NULL, IDI_APPLICATION),
		LoadCursor(NULL, IDC_ARROW),
		(HBRUSH)GetStockObject(WHITE_BRUSH),
		NULL,
		TEXT("MYDEMO")
	};
	//注册窗口类  
	RegisterClass(&wndclass);
	//创建窗口类  
	hwnd = CreateWindow(
		TEXT("MYDEMO"),
		TEXT("MyDemo"),
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		NULL,
		NULL,
		hInstance,
		NULL);
	//显示窗口  
	ShowWindow(hwnd, nCmdShow);
	//更新窗口  
	UpdateWindow(hwnd);

	//初始化  
	init();

	//消息循环  
	MSG Msg;
	BOOL bRet;
	PeekMessage(&Msg, NULL, 0, 0, PM_NOREMOVE);
	while (Msg.message != WM_QUIT)
	{
		bRet = PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE);
		if (bRet)
		{
			TranslateMessage(&Msg);
			DispatchMessage(&Msg);
		}
		Render();
	}
	CleanUp();

	return Msg.wParam;
}


//窗口过程处理函数  
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}

	return DefWindowProc(hwnd, message, wParam, lParam);
}
//初始化函数  
void init()
{
	if (!hwnd)
	{
		return;
	}
	//设备环境获取  
	hdc = GetDC(hwnd);
	//获取当前窗口大小  
	GetClientRect(hwnd, &rtClient);
	//创建画笔画刷  
	hOldPen = (HPEN)GetStockObject(DC_PEN);
	hOldBrush = (HBRUSH)GetStockObject(DC_BRUSH);
	hPen = CreatePen(PS_SOLID, 2, COLORREF(RGB(255, 0, 0)));
	hBrush = CreateHatchBrush(HS_HORIZONTAL, COLORREF(RGB(0, 255, 0)));
}
//渲染  
void Render()
{
	if (hdc)
	{
		//擦除  
		SelectObject(hdc, hOldPen);
		SelectObject(hdc, hOldBrush);
		RECT r = { rtClient.left, rtClient.top, rtClient.right, rtClient.bottom };
		FillRect(hdc, &r, (HBRUSH)GetStockObject(BLACK_BRUSH));

		//矩形    
		SelectObject(hdc, hPen);
		SelectObject(hdc, hBrush);
		Rectangle(hdc, rt.left, rt.top, rt.right + 100, rt.bottom + 100);
		//停顿100毫秒  
		Sleep(10);
		//增加矩形的值  
		rt.right = rt.left += 2 * dir1;
		rt.top = rt.bottom += 2 * dir2;
		if (rt.right + 100 > (rtClient.right - rtClient.left))
		{
			dir1 = -1;
		}
		else if (rt.left < 0)
		{
			dir1 = 1;
		}
		else if (rt.top < 0)
		{
			dir2 = 1;
		}
		else if (rt.bottom + 100 >(rtClient.bottom - rtClient.top))
		{
			dir2 = -1;
		}
	}
}
//清除设备环境  
void CleanUp()
{
	SelectObject(hdc, hOldBrush);
	SelectObject(hdc, hOldPen);
	DeleteObject(hPen);
	DeleteObject(hBrush);
	ReleaseDC(hwnd, hdc);
}

如果有什么不明白的或者建议都可以留言说明哈~

然后,效果如下:


好了,以上就是实现矩形移动的步骤和效果。希望读者有所收获~大笑

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值