C语言实现图形的缩放和移动

教育   2024-11-21 23:11   宁夏  

功能介绍

在平时的操作中,我们需要对绘制的图形使用鼠标滚轮缩放图形,鼠标左键按下拖动图形,右键按下退出程序,今天就来实现这个功能。

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//
#include<graphics.h>#include<conio.h>
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);}

动态效果

C语言研究
写给自己的笔记,时常写写,时常看看,仅此而已。