学习视频链接: https://www.bilibili.com/video/BV12f4y1z776?spm_id_from=333.880.my_history.page.click&vd_source=b91967c499b23106586d7aa35af46413

加入头文件 #include <graphics.h> 时遇到问题。

解决方法:

链接: https://blog.csdn.net/suoyue_py/article/details/103799336?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2-103799336-blog-109754222.pc_relevant_aa&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2-103799336-blog-109754222.pc_relevant_aa&utm_relevant_index=5


EasyX软件的下载链接如下:https://easyx.cn/,打开后会自动根据电脑上的 VS 版本进行识别,默认点击安装即可。

代码功能

1、左键按下画圆,右键按下画方

#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>#include <conio.h> //使用该库中的 _getch() 函数,目的是为了防止闪屏/*1. 创建图像化窗口2. 鼠标能反馈给计算机(窗口)的是什么?鼠标移动、左键、右键 --》坐标值重点:怎么去获取这个坐标值3. C语言是如何定义变量的呢?类型 变量名(int a)对于鼠标操作来说,变量类型为 MOUSEMSG因此,要进行鼠标操作首先需要定义一个 MOUSEMSG 类型的变量4. 如何去获取鼠标反馈给计算机的值呢?利用 Windows API :GetMouseMsg();5. 对获取到的值进行区分(哪些是左键、右键)m.uMsg: 讨论鼠标操作类型WM_LBUTTONDOWN: 鼠标左键按下WM_MOUSEMOVE: 鼠标移动(Windows Message)6. 画圆和画方函数画圆:circle(int x, int y, int r) -- 圆心坐标加半径画方:rectangle(int x, int y, int endx, int endy) -- 左上角坐标和右下角坐标7. 鼠标的坐标值: m.x、m.y*/int main()
{// 创建图形化窗口,窗口大小这里设置为 800 x 600initgraph(800, 600);MOUSEMSG m;  //存放鼠标的值while (1){m = GetMouseMsg();//左键画圆,右键画方switch (m.uMsg){case WM_MOUSEMOVE:break;case WM_LBUTTONDOWN:circle(m.x, m.y, 5);break;case WM_RBUTTONDOWN:rectangle(m.x-5, m.y-5, m.x + 5, m.y + 5);break;}}_getch();//等待用户按键(点击关闭窗口),让程序停在这closegraph();//关闭窗口return 0;
}

运行效果如下,


使用 pyqt 实现类似功能的代码:

import sys
from PyQt6.QtWidgets import QApplication, QWidget
from PyQt6.QtGui import QPainter, QPixmap
from PyQt6.QtCore import Qt, QRectclass DrawWidget(QWidget):def __init__(self):super(DrawWidget, self).__init__()self._rects = [QRect()]self.setWindowTitle("绘图")self._begin = self.pos()self._lpress = Falseself._drag = Falseself.pix = QPixmap()self.initUi()def initUi(self):self.resize(512, 512)# 画布大小为 400 * 400 ,背景为白色self.pix = QPixmap(512, 512)self.pix.fill(Qt.GlobalColor.white)def paintEvent(self, event):painter = QPainter(self)painter.begin(self)painter.drawPixmap(0, 0, self.pix)try:for i in self._rects:painter.drawRect(i)except Exception as e:print(e)# 绘制多边形painter.end()def mousePressEvent(self, event):if event.button() == Qt.MouseButton.LeftButton:self._lpress = True  # 左键按下的标志if not self._drag:self._rects.append(QRect())lastRect = self._rects[-1]  # 拿到新矩形lastRect.setTopLeft(event.pos())  # 记录鼠标的坐标(新矩形的左上角坐标)def mouseMoveEvent(self, event):if self._lpress:if not self._drag:lastRect = self._rects[-1]  # 拿到新矩形lastRect.setBottomRight(event.pos())  # 更新矩形的右下角坐标self.update()# 别的程序调用当前文件是不会执行一下程序的
if __name__ == '__main__':# 创建 QApplication 类的实例# sys.argv 获取命令行参数# 本质上是执行命令行程序, 只不过在命令行界面中访问了与 GUI 相关的 API, 所以会产生窗口app = QApplication(sys.argv)widget = DrawWidget()  # 创建主窗口对象widget.show()# 进入程序的主循环、并通过exit函数确保主循环安全结束sys.exit(app.exec())

运行效果如下,

1、手写绘图板

#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h> //使用该库中的 _getch() 函数,目的是为了防止闪屏// 描述 点
struct Point
{int x;int y;Point()  //构造函数{x = -1;y = -1;}Point(int xx, int yy)  //构造函数{x = xx;y = yy;}
};// 描述 线
struct LineTool
{int size;          // 粗细COLORREF color;        // 颜色Point begPos;       // 起始位置bool isLeftDown;        // 鼠标左键是否按下标志LineTool(int lineSize, COLORREF linecolor){size   = lineSize;color  = linecolor;isLeftDown = false;  // 没有按下}// 鼠标处理void callMouse(MOUSEMSG m){// 按下左键的处理if(m.uMsg == WM_LBUTTONDOWN){ isLeftDown = true;begPos = Point(m.x, m.y);}// 左键弹起的处理if (m.uMsg == WM_LBUTTONUP){isLeftDown = false;}// 双键(鼠标左键按下且移动)动作的描述if (m.uMsg == WM_MOUSEMOVE && isLeftDown){// 设置线的样式setlinestyle(PS_ENDCAP_ROUND, size);  // 圆头和线的粗细setlinecolor(color);  // 线的颜色line(begPos.x, begPos.y, m.x, m.y);}//每次画线结束后 — 改变起始画线的位置begPos = Point(m.x, m.y);// 清除效果 — 右键清除if (m.uMsg == WM_RBUTTONDOWN){setbkcolor(WHITE); // 设置界面背景为白色cleardevice();    // 刷新一下界面}}
};int main()
{// 创建图形化窗口,窗口大小这里设置为 800 x 600initgraph(800, 600);setbkcolor(WHITE); // 设置界面背景为白色cleardevice();       // 刷新一下界面LineTool* pLine = new LineTool(5, RED);while (1){// 如果有鼠标操作while (MouseHit())  {MOUSEMSG m = GetMouseMsg();pLine->callMouse(m);}// 如果有按键操作if (_kbhit()){char userKey = _getch();  //获取按键//按键的值if (userKey == '+'){pLine->size++;}if (userKey == '-'){pLine->size--;}if (userKey == '\r'){saveimage("new.png");break;}}}delete pLine;pLine = NULL;_getch();//等待用户按键(点击关闭窗口),让程序停在这closegraph();//关闭窗口return 0;
}

运行效果如下,


按回车之后,


注意事项:

1、callMouse(MOUSEMSG m) 函数中的代码很重要。

//每次画线结束后 — 改变起始画线的位置begPos = Point(m.x, m.y);

2、注意中英文状态的切换,程序中的 ‘+’ 和 ‘-’ 都是在英文输入法状态下才起作用的。

3、关于 saveimage(“new.png”); 函数。

如果报错

const char 类型的实参与LPCWSTR类型的形参不兼容,这样设置。

C++实现鼠标手写+自绘按钮相关推荐

  1. 自绘按钮实现颜色选择器

    一.前言 很多时候,我们需要让用户在软件上选择颜色,那么一个"颜色选择器"就肯定需要了,本例程就是使用普通的按钮(Button)控件来实现颜色选择器. 首先来看一下最后的效果图: ...

  2. WindowsAPI自绘按钮

    自绘按钮有多种方法,比如创建一个BS_OWNERDRAW风格的按钮,然后就可以自绘了,但是这个好像不能用SetWindowRgn画各种形状.我介绍的这个方法很简单,但是代码量会稍多一点.就是把一个按钮 ...

  3. MFC 进度条自绘按钮类

    MFC 进度条自绘按钮类 废话不多说 先看效果 看看怎么调用 这当然先包含砸门的进度条绘图类 #include "MySlider.h"MySlider m_lider;//防在D ...

  4. Yii2 用Html助手类和普通方法写一个删除按钮

    1.用Html助手类写一个删除按钮 <?php if($model->user_id==Yii::$app->user->identity->id):?><? ...

  5. vc++6.0工具栏自绘按钮程序

    实现按钮自绘,界面. 主对话框文件: // TitleBarDlg.cpp : implementation file // #include "stdafx.h" #includ ...

  6. html 按钮按下变色松开还原,js中怎么写点击按钮时变色,松开后恢复原来的颜色...

    满意答案 xuehui988 2013.12.07 采纳率:44%    等级:7 已帮助:761人 首先给这个按钮添加鼠标的按下和松开的事件,mousedown,mouseup,使用这两个函数即可. ...

  7. 网络直播课可行性解决方案 - 手写屏 - 绘王科技

    互联网+时代的发展,教育模式也发生了巨大的变化.网络信息技术广泛应用于当代教育体系,各大高校相继开展网络直播课,新技术的融入无疑对传统的课堂教学注入了新的活力.通过网络直播课,实现一对多的实时交互式教 ...

  8. [原创] 菜鸟初写转手绘教程之菜鸟篇

    [转自]http://68ps.5d6d.com/thread-13982-1-8.html 1.打开素材,创建可选颜色对图象进行调整 ,参数如下: 2.再创建可选颜色调整,参数如下: 3.再创建可选 ...

  9. 低年级趣味写话——绘本故事《小猪变形计》

    一.课堂素材:<小猪变形计绘本> 绘本介绍: <小猪变形记>小猪总觉得自己不幸福,认为做小猪很无聊.于是,他一会儿装扮成长颈鹿,一会儿装扮成斑马,一会儿装扮成鹦鹉--由此,他也 ...

最新文章

  1. hive sql练习_SQL语句+语法 I 数据分析面试必备
  2. (树)判断二叉树是否为BST
  3. 用华为鸿蒙 OS 2.0 系统写出了HelloWorld!那些说鸿蒙是PPT的可以闭嘴了!
  4. SpringBoot中使用常量类来判断对象某属性的值是否包含在指定集合中
  5. 互斥事件的概念和公式_IGCSE数学5月大考冲刺A*?必备公式与技巧
  6. css如何实现背景透明,文字不透明?
  7. 面经——Linux相关
  8. mysql的int多少溢出_mysql 整型(int)数字溢出在程序和数据库设计中的考虑
  9. [转载]博客园MetaWeblog使用帮助
  10. 超级无敌数字加密算法
  11. Nginx 默认的日志类型
  12. 用windows开发ios app_开发一个APP至少需要多少人|安卓|ios|产品经理
  13. 南农计算机分数线,2021南京农业大学录取分数线_历年各专业分数线(2017-2020),各省投档线_一品高考网...
  14. MPU6050的数据获取、分析与处理
  15. 发送邮件被对方服务器退回是什么原因导致的?
  16. mysql 赋权_《MySQL数据库》MySQL用户赋权
  17. Unity Shader - Specular mode: Specular parameter 高光模式中的高光参数
  18. 2021年烷基化工艺考试题及烷基化工艺多少钱
  19. 搬上小板凳,听嵌入式大牛讲解硬核单片机编程思想!
  20. 求生之路服务器正在强制此文件的一致性,求生之路2和朋友联机错误代码的解决办法...

热门文章

  1. 一个竞赛蒟蒻,开个Blog玩玩
  2. 基于TensorRT的语义分割实验记录
  3. D19:Duplicate Number(重复数字,翻译+题解)
  4. 小草软路由普通路由模式下的配置及注意事项
  5. java基础编程之查询某一年的二月有多少天(通过Calendar类)
  6. 气动调节阀故障要怎么处理?
  7. XRP突破在即?瑞波公司投资5亿美元只为增加XRP用例
  8. Qt XXXr.obj : error LNK2001: 无法解析的外部符号 3 个无法解析的外部命令问题
  9. C++嵌套循环打印99乘法表
  10. Userspace RCU原理