编译环境:VS2017+Easy_X

最近笔者一直在翻阅Easy_X的帮助手册,学习到了一些关于获取鼠标状态消息函数的知识,感觉收获颇大,于是想试验一番,将所学知识运用出来。先补充一下在Easy_X中的一些鼠标函数和结构体吧。在下面的程序中,只用到了GetMouseMsg函数和MOUSEMSG结构体。

FlushMouseMsgBuffer

这个函数用于清空鼠标消息缓冲区。

void FlushMouseMsgBuffer();

参数:

(无)

返回值:

(无)

GetMouseMsg

这个函数用于获取一个鼠标消息。如果当前鼠标消息队列中没有,就一直等待。

MOUSEMSG GetMouseMsg();

参数:

(无)

返回值:

返回保存有鼠标消息的结构体。

MouseHit

这个函数用于检测当前是否有鼠标消息。

bool MouseHit();

参数:

(无)

返回值:

如果存在鼠标消息,返回 true;否则返回 false。

MOUSEMSG

这个结构体用于保存鼠标消息,定义如下:

struct MOUSEMSG
{
UINT uMsg; // 当前鼠标消息
bool mkCtrl; // Ctrl 键是否按下
bool mkShift; // Shift 键是否按下
bool mkLButton; // 鼠标左键是否按下
bool mkMButton; // 鼠标中键是否按下
bool mkRButton; // 鼠标右键是否按下
int x; // 当前鼠标 x 坐标(物理坐标)
int y; // 当前鼠标 y 坐标(物理坐标)
int wheel; // 鼠标滚轮滚动值
};

成员:

uMsg:

指定鼠标消息类型,可为以下值:

含义
WM_MOUSEMOVE 鼠标移动消息。
WM_MOUSEWHEEL 鼠标滚轮拨动消息。
WM_LBUTTONDOWN 左键按下消息。
WM_LBUTTONUP 左键弹起消息。
WM_LBUTTONDBLCLK 左键双击消息。
WM_MBUTTONDOWN 中键按下消息。
WM_MBUTTONUP 中键弹起消息。
WM_MBUTTONDBLCLK 中键双击消息。
WM_RBUTTONDOWN 右键按下消息。
WM_RBUTTONUP 右键弹起消息。
WM_RBUTTONDBLCLK 右键双击消息。

mkCtrl

Ctrl 键是否按下

mkShift

Shift 键是否按下

mkLButton

鼠标左键是否按下

mkMButton

鼠标中键是否按下

mkRButton

鼠标右键是否按下

x

当前鼠标 x 坐标(物理坐标)

y

当前鼠标 y 坐标(物理坐标)

wheel

鼠标滚轮滚动值,为 120 的倍数。

我写的代码如下:

 #include "stdafx.h"
#include <graphics.h> void twopiont();
void pen();
void chalk(); void main()
{
initgraph(, ); //初始化图形界面,窗口分辨率设置为640*480
MOUSEMSG p; //定义一个鼠标的结构体
RECT r1 = { , , , };// 在屏幕右侧输出字符串
drawtext(_T("----------"), &r1, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
RECT r2 = { , , , };
drawtext(_T("1.钢笔"), &r2, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
RECT r3 = { , , , };
drawtext(_T("2.粉笔"), &r3, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
RECT r4 = { , , , };
drawtext(_T("3.两点画线"), &r4, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
RECT r5 = { , , , };
drawtext(_T("---------"), &r5, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
RECT r6 = { , , , };
drawtext(_T("单击鼠标右键"), &r6, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
RECT r7 = { , , , };
drawtext(_T("切换选项"), &r7, DT_CENTER | DT_VCENTER | DT_SINGLELINE); while (true)
{
p = GetMouseMsg();
if (p.uMsg == WM_LBUTTONDOWN) pen();
if (p.uMsg == WM_LBUTTONDOWN) chalk();
if (p.uMsg == WM_LBUTTONDOWN) twopiont();
} } /**************实现在两点之间画一条直线**************/
void twopiont()
{
int x0, y0, x1, y1;
MOUSEMSG m; // 定义鼠标消息
while (true)
{
flag: //重置开始
m = GetMouseMsg();// 获取一次鼠标消息
switch (m.uMsg)
{
case WM_LBUTTONDOWN:x0 = m.x; y0 = m.y; //鼠标第一次按下时,得到坐标(x0,y0)
while (true)
{
m = GetMouseMsg();// 获取一条鼠标消息
switch (m.uMsg)
{
case WM_LBUTTONDOWN:x1 = m.x; y1 = m.y;//鼠标第二次按下时,得到坐标(x1,y1)
line(x0, y0, x1, y1);
goto flag; //跳回到flag处进行重置
break;
case WM_RBUTTONUP:
return; // 按鼠标右键退出函数
}
}
break;
case WM_RBUTTONUP:
return; // 按鼠标右键退出函数
}
} } /****************实现钢笔功能****************/
void pen()
{
int x0, y0;
MOUSEMSG m; // 定义鼠标消息
while (true)
{
flag: //重置开始
m = GetMouseMsg();// 获取一次鼠标消息
switch (m.uMsg)
{
case WM_LBUTTONDOWN:x0 = m.x; y0 = m.y; //鼠标第一次按下时,得到坐标(x0,y0)
while (true)
{
m = GetMouseMsg();// 获取一条鼠标消息
line(x0, y0, m.x, m.y);
x0 = m.x; y0 = m.y;
switch (m.uMsg)
{
case WM_LBUTTONUP:
goto flag; //跳回到flag处进行重置
break;
case WM_RBUTTONUP:
return;// 按鼠标右键退出函数
}
}
break;
case WM_RBUTTONUP:
return;
// 按鼠标右键退出函数
}
}
} /****************实现粉笔功能****************/
void chalk()
{
int x0, y0; // 绘图环境初始化
MOUSEMSG m; // 定义鼠标消息
while (true)
{
flag: //重置开始
m = GetMouseMsg();// 获取一次鼠标消息
switch (m.uMsg)
{
case WM_LBUTTONDOWN:x0 = m.x; y0 = m.y; //鼠标第一次按下时,得到坐标(x0,y0)
while (true)
{
m = GetMouseMsg();// 获取一条鼠标消息
switch (m.uMsg)
{
case WM_MOUSEMOVE:
fillcircle(m.x, m.y, );// 画一个填充圆
break; case WM_LBUTTONUP:
goto flag; //跳回到flag处进行重置
break;
case WM_RBUTTONUP:
return; // 按鼠标右键退出函数
}
}
break;
case WM_RBUTTONUP:
return; // 按鼠标右键退出函数
}
}
}

其主要功能为:实现钢笔,粉笔,和两点画线的功能,鼠标右键单击可以实现功能的依此切换,初始为钢笔功能

效果如下:钢笔功能:

 

看到粗粗的粉笔了没

两点之间画直线:

存在缺陷:1.使用较多的goto语句,破坏了循环语句的结构性,(笔者个人觉得goto语句在这里挺好的)

     2.程序没有结束的语句(只有点一下右上角的小叉叉了)。

     3.笔者只急着画图了,忘了当图都画满了要擦除

初次写程序,可能存在很多不足,希望读者们多给我一些建议啊!!

DIY一个超简单的画图程序的更多相关文章

  1. 在VS中手工创建一个最简单的WPF程序

    如果不用VS的WPF项目模板,如何手工创建一个WPF程序呢?我们来模仿WPF模板,创建一个最简单的WPF程序. 第一步:文件——新建——项目——空项目,创建一个空项目. 第二步:添加引用,Presen ...

  2. JNI编程(一) —— 编写一个最简单的JNI程序

    来自:http://chnic.iteye.com/blog/198745 忙了好一段时间,总算得了几天的空闲.貌似很久没更新blog了,实在罪过.其实之前一直想把JNI的相关东西整理一下的,就从今天 ...

  3. MVVM之旅(1)创建一个最简单的MVVM程序

    这是MVVM之旅系列文章的第一篇,许多文章和书喜欢在开篇介绍某种技术的诞生背景和意义,但是我觉得对于程序员来说,一个能直接运行起来的程序或许能够更直观的让他们了解这种技术.在这篇文章里,我将带领大家一 ...

  4. 【并发编程】一个最简单的Java程序有多少线程?

    一个最简单的Java程序有多少线程? 通过下面程序可以计算出当前程序的线程总数. import java.lang.management.ManagementFactory; import java. ...

  5. JNI编程(一) —— 编写一个最简单的JNI程序(转载)

    转自:http://chnic.iteye.com/blog/198745 忙了好一段时间,总算得了几天的空闲.貌似很久没更新blog了,实在罪过.其实之前一直想把JNI的相关东西整理一下的,就从今天 ...

  6. 打造支持apk下载和html5缓存的 IIS(配合一个超简单的android APP使用)具体解释

    为什么要做这个看起来不靠谱的东西呢? 由于刚学android开发,还不能非常好的熟练控制android界面的编辑和操作,所以我的一个急着要的运用就改为html5版本号了,反正这个运用也是须要从serv ...

  7. DIY一个DNS查询器:程序实现

    上一篇文章<DIY一个DNS查询器:了解DNS协议>中讲了DNS查询协议的原理和数据结构.经过两个星期的开发,完成了该查询器的编写.期间也遇到了一些问题,如: 1资源记录(Resource ...

  8. Win32 程序开发入门:一个最简单的Win32程序

    一.什么是 Win32 Win32 是指 Microsoft Windows 操作系统的 32 位环境,与 Win64 都为 Windows 常见环境. 这里再介绍下 Win32 Applicatio ...

  9. Python绘制PDF文件~超简单的小程序

    Python绘制PDF文件 项目简介 这次项目很简单,本次项目课,代码不超过40行,主要是使用 urllib和reportlab模块,来生成一个pdf文件. reportlab官方文档 http:// ...

随机推荐

  1. 零散Linux命令

    1. # ps -ef|grep java 查询java进程 2. # kill -9 进程号 关闭指定进程

  2. Shell 判断文件或文件夹是否存在

    #shell判断文件夹是否存在 #如果文件夹不存在,创建文件夹 if [ ! -d "/myfolder" ]; then mkdir /myfolder fi #shell判断文 ...

  3. linux系统磁盘空间满了怎么办看完这篇文章之后就知道怎么解决了

    废话不多说直接上图 可以看得到 / 下面已使用100%,已经没有剩余空间可以使用了,上面跑的服务已经访问不了了. 接下来我就看看有没有垃圾文件可以清理的 du -sh * 由于这个机器比较特殊,上面有 ...

  4. logback读取src/test/resource下的配置文件

    import java.io.File; import java.net.URISyntaxException; import java.util.Map; import java.util.Prop ...

  5. 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址;

    package com.utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.htt ...

  6. python+pycahrm+windows环境准备

    python安装教程和Pycharm安装详细教程 首先我们来安装python 1.首先进入网站下载:点击打开链接(或自己输入网址https://www.python.org/downloads/),进 ...

  7. python 函数 装饰器的使用方法

    一.装饰器  首先,我们要了解到什么是开放封闭式原则? 软件一旦上线后,对修改源代码是封闭的,对功能的扩张是开放的,所以我们应该遵循开放封闭的原则. 也就是说:我们必须找到一种解决方案,能够在不修改一 ...

  8. mqtt异步publish方法

    Python基于mqtt异步编程主要用到asyncio及第三方库hbmqtt,这里主要介绍mqtt的异步发布及遇到的一些问题. hbmqtt安装很简单,pip hbmqtt install. mqtt ...

  9. Suricata 之IPS模式

    IPS 1.Suricata 本身是不具有拦截功能的,想要让它拦截包需要配合 iptables 使用. 首先要确定安装的suricata是否支持IPS模式,如果在安装编译的时候没有启用IPS模式,NF ...

  10. 如何用Word编辑参考文献------这是引用一位大师的

    如何用Word编辑参考文献修改文献是一件非常痛苦的事情,虽然现在也有很多软件可以编排参考文献,其实word本身就可以. 采用合适的编辑方法会方便地做到整齐,规范,自动排序和交叉引用.1.以尾注的方式插 ...