上一篇中,使用我们自己的画刷调用了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);
}
如果有什么不明白的或者建议都可以留言说明哈~
然后,效果如下:
好了,以上就是实现矩形移动的步骤和效果。希望读者有所收获~