编译环境: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. 51ak带你看MYSQL5.7源码2:编译现有的代码

    从事DBA工作多年 MYSQL源码也是头一次接触 尝试记录下自己看MYSQL5.7源码的历程 目录: 51ak带你看MYSQL5.7源码1:main入口函数 51ak带你看MYSQL5.7源码2:编译 ...

  2. 最大堆(Java数组实现)

    最大堆 data[1]开始存,data[0]空着不用.也可以把data[0]当成size来用. public class MaxHeap<T extends Comparable<? su ...

  3. sentinel监控redis高可用集群(二)

    一.端口转发. 如果在一个主机里面,安装了两个redis实例,可以在项目里面配置IP端口,用iptables转发. iptables -t nat -A PREROUTING -p tcp --dpo ...

  4. 【Android】带进度条的WebView

    http://www.cnblogs.com/over140/archive/2013/03/07/2947721.html

  5. div内文字显示两行,多出的文字用省略号显示

    用-webkit-私有属性,代码如下:text-overflow: -o-ellipsis-lastline;overflow: hidden;text-overflow: ellipsis;disp ...

  6. 集大1513 & 1514班 软件工程第一次作业评分与点评

    谢谢大多数同学按时完成了作业,同学态度都比较端正,没有为了完成作业或者讨好老师而说一些假话空话. 很多同学选择CS之前并没有从兴趣或者擅长出发.这是一个普遍的现象,十年前我们是这样,十年后的孩子们还是 ...

  7. 高校学生征信系统Postmortem结果

    Postmortem结果 设想和目标 1 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件需要解决的问题是当前高校学生征信系统建设薄弱的问题,我们试图建立 ...

  8. Tornado websocket应用

    应用场景 WebSocket 的特点如下 适合服务器主动推送的场景(好友上线,即时聊天信息,火灾警告,股票涨停等) 相对于Ajax和Long poll等轮询技术,它更高效,不耗费网络带宽和计算资源 它 ...

  9. SpaceVim - 让你的vim变得更加高效和强大

    SpaceVim 中文手册 项 目 主 页: https://spacevim.org Github 地址 : https://github.com/SpaceVim/SpaceVim SpaceVi ...

  10. 山西某公司NetApp存储不小心删除文件数据恢复成功案例

    故障情况简介: 需要进行数据恢复的设备是一台NetApp存储,共有24块磁盘组成.由于管理员删除文件夹,且时间比较久,删除有几个月时间. 可恢复性判断:由于NetApp中的文件系统的特性,WAFL是& ...