功能介绍
在平时的操作中,我们需要对绘制的图形使用鼠标滚轮缩放图形,鼠标左键按下拖动图形,右键按下退出程序,今天就来实现这个功能。
LOGO介绍
为了实现这个功能,这里使用我自己为我自己设计的公众号LOGO。怎么说呢,每一个LOGO的设计不一定需要多么色彩鲜艳,或者图形复杂,我觉得要有自己的意义即可。
我的LOGO是由两种颜色组成,黑色和白色,由两个数字组成,0和1。然后按照一定比例放置。总体来说,它是我自己设计的简洁而又有意义的一个LOGO。
绘制LOGO
void DrawLoge(int x, int y, int size, COLORREF color1, COLORREF color2)
{
setfillcolor(color2);
solidrectangle(x, y, x + size, y + size);
double JG = size / 16.0;
setlinestyle(PS_SOLID | PS_ENDCAP_SQUARE | PS_JOIN_MITER, JG);
circle(x + JG * 4, y + JG * 4, 2.5 * JG);
circle(x + JG * 12, y + JG * 12, 2.5 * JG);
setfillcolor(color1);
solidrectangle(x + JG * 8, y, x + size, y + JG * 8);
solidrectangle(x, y + JG * 8, x + JG * 8, y + size);
setfillcolor(BLACK);
solidrectangle(x + JG * 3, y + JG * 9, x + JG * 5, y + JG * 15);
solidrectangle(x + JG * 2, y + JG * 10, x + JG * 3, y + JG * 11);
solidrectangle(x + JG * 2, y + JG * 14, x + JG * 6, y + JG * 15);
solidrectangle(x + JG * 11, y + JG, x + JG * 13, y + JG * 7);
solidrectangle(x + JG * 10, y + JG * 2, x + JG * 11, y + JG * 3);
solidrectangle(x + JG * 10, y + JG * 6, x + JG * 14, y + JG * 7);
}
功能实现
要实现缩放,相当于定义一个缩放的变量,每次鼠标滚轮滑动,就将这个缩放变量更新,更新后将缩放的数值叠加到我们需要放大的图形上即可。
实现移动也是一样,移动是在按键按下的时候一定,所以先记录一个鼠标按下的位置,需要判断鼠标移动时候是否按下左键,如果按下了,就计算偏移值,将这个偏移值累加到需要移动图形上即可。
按鼠标右键退出程序。
源码
///////////////////////////////////////////////////
// 程序名称:缩放和移动
// 编译环境:Mictosoft Visual Studio 2022, EasyX_20200315(beta)
// 作 者:luoyh <2864292458@qq.com>
// 公 众 号:C语言研究
// 最后修改:2024-11-21
//
int rW = GetSystemMetrics(SM_CXSCREEN); // 屏幕宽度 像素
int rH = GetSystemMetrics(SM_CYSCREEN); // 屏幕高度 像素
void Full_Screen(); // 全屏
void DrawLoge(int x, int y, int size, COLORREF color1, COLORREF color2);
int main()
{
Full_Screen();
int size = 400;
int TX1 = (rW - size) / 2;
int TY1 = (rH - size) / 2;
int MX = 0;
int MY = 0;
int dx = 0;
int dy = 0; // 鼠标移动量
int DX = 0;
int DY = 0; // 移动量暂存
int R = 0;
// 定义变量,保存鼠标消息
ExMessage msg;
BeginBatchDraw();
while (true)
{
while (peekmessage(&msg, EX_MOUSE, EX_KEY)) // 如果获取到了消息就执行
{
switch (msg.message) // 根据不同的鼠标消息,执行不同的代码
{
case WM_LBUTTONDOWN: // 如果点左键按下
{
MX = msg.x;
MY = msg.y;
}
break;
case WM_MOUSEMOVE: // 鼠标移动
if (msg.lbutton)
{
dx = msg.x - MX;
dy = msg.y - MY; // 计算偏移值
DX = dx;
DY = dy;
break;
case WM_LBUTTONUP: // 如果点左键按下
{
TX1 = TX1 + dx;
TY1 = TY1 + dy;
DX = 0;
DY = 0;
}
break;
case WM_RBUTTONUP:
{
return 0;
}break;
case WM_MOUSEWHEEL: // 滑动滚轮放大缩小处理
{
int wh = msg.wheel;
if (wh == -120)
{
R += 5;
msg.wheel = 120;
}
if (wh == 120)
{
R -= 5;
msg.wheel = -120;
}
}
break;
}
}
}
FlushBatchDraw();
cleardevice();
DrawLoge(TX1 - R + DX, TY1 - R + DY, size + 2 * R, WHITE, BLACK);
}
EndBatchDraw();
return 0;
}
void Full_Screen() // 全屏
{
HWND hwnd = initgraph(rW, rH); // 初始化绘图窗口并获取窗口句柄(以 EasyX 为例)
LONG l_WinStyle = GetWindowLong(hwnd, GWL_STYLE); // 获取窗口信息
// 设置窗口信息 最大化 取消标题栏及边框
SetWindowLong(hwnd, GWL_STYLE, (l_WinStyle | WS_POPUP | WS_MAXIMIZE) & ~WS_CAPTION & ~WS_THICKFRAME & ~WS_BORDER);// 直接修改窗口样式
SetWindowPos(hwnd, HWND_TOP, 0, 0, rW, rH, 0);
setbkcolor(RGB(213, 223, 237));
cleardevice(); // 设置背景颜色为黑色
}
void DrawLoge(int x, int y, int size, COLORREF color1, COLORREF color2)
{
setfillcolor(color2);
solidrectangle(x, y, x + size, y + size);
double JG = size / 16.0;
setlinestyle(PS_SOLID | PS_ENDCAP_SQUARE | PS_JOIN_MITER, JG);
circle(x + JG * 4, y + JG * 4, 2.5 * JG);
circle(x + JG * 12, y + JG * 12, 2.5 * JG);
setfillcolor(color1);
solidrectangle(x + JG * 8, y, x + size, y + JG * 8);
solidrectangle(x, y + JG * 8, x + JG * 8, y + size);
setfillcolor(BLACK);
solidrectangle(x + JG * 3, y + JG * 9, x + JG * 5, y + JG * 15);
solidrectangle(x + JG * 2, y + JG * 10, x + JG * 3, y + JG * 11);
solidrectangle(x + JG * 2, y + JG * 14, x + JG * 6, y + JG * 15);
solidrectangle(x + JG * 11, y + JG, x + JG * 13, y + JG * 7);
solidrectangle(x + JG * 10, y + JG * 2, x + JG * 11, y + JG * 3);
solidrectangle(x + JG * 10, y + JG * 6, x + JG * 14, y + JG * 7);
}
动态效果