《Windows程序设计》之BLOKOUT1

2023-05-16

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	static BOOL fBlocking,fValidBox;
	static POINT ptBeg,ptEnd,ptBoxBeg,ptBoxEnd;
	HDC hdc;
	PAINTSTRUCT ps;

	switch(message)
	{
	case WM_LBUTTONDOWN:
		ptBeg.x=ptEnd.x=LOWORD(lParam);
		ptBeg.y=ptEnd.y=HIWORD(lParam);

		DrawBoxOutline(hwnd,ptBeg,ptEnd);
		//设置光标为IDC_CROSS,表示正在画矩形
		SetCursor(LoadCursor(NULL,IDC_CROSS));
		//标志,TRUE表示正在画
		fBlocking=TRUE;
		return 0;
	case WM_MOUSEMOVE:
		if(fBlocking)
		{
			//当鼠标移动时,设置光标为IDC_CROSS
			SetCursor(LoadCursor(NULL,IDC_CROSS));
			//当下面这一行注释点时,移动鼠标会出现下面图片的效果
			DrawBoxOutline(hwnd,ptBeg,ptEnd);
			ptEnd.x=LOWORD(lParam);
			ptEnd.y=HIWORD(lParam);
			//下面这一行也是会出现下面图片的效果
			DrawBoxOutline(hwnd,ptBeg,ptEnd);
		}
		return 0;
	case WM_LBUTTONUP:
		if(fBlocking)
		{
			DrawBoxOutline(hwnd,ptBeg,ptEnd);
			//用来保存最终的矩形
			ptBoxBeg=ptBeg;
			ptBoxEnd.x=LOWORD(lParam);
			ptBoxEnd.y=HIWORD(lParam);
			//光标还原
			SetCursor(LoadCursor(NULL,IDC_ARROW));
			fBlocking=FALSE;
			fValidBox=TRUE;
			//下面后调用WM_PAINT
			InvalidateRect(hwnd,NULL,TRUE);
		}
		return 0;
	case WM_CHAR:
		//x1b是esc,实现效果,当正在画时,点一个esc会取消
		if(fBlocking & (wParam=='\x1B'))
		{
			DrawBoxOutline(hwnd,ptBeg,ptEnd);
			SetCursor(LoadCursor(NULL,IDC_ARROW));
			fBlocking=FALSE;
		}
		return 0;
	case WM_PAINT:
		hdc=BeginPaint(hwnd,&ps);
		//这个是用来画鼠标松开时最终的矩形
		if(fValidBox)
		{
			SelectObject(hdc,GetStockObject(BLACK_BRUSH));
			Rectangle(hdc,ptBoxBeg.x,ptBoxBeg.y,ptBoxEnd.x,ptBoxEnd.y);
		}
		//这个是实现鼠标点下左键后,移动时候的效果,但是鼠标移动时没有调用这个,我认识无用
		/*if(fBlocking)
		{
			SetROP2(hdc,R2_NOT);
			SelectObject(hdc,GetStockObject(NULL_BRUSH));
			Rectangle(hdc,ptBeg.x,ptBeg.y,ptEnd.x,ptEnd.y);
		}*/
		EndPaint(hwnd,&ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hwnd,message,wParam,lParam);
}

上面代码有两个问题还没有搞清楚:

25---30行中有两个DrawBoxOutline,我试着去掉任何一个,但是效果都会变成下图这样。

我想应该跟WM_MOUSEMOVE有关,不能做到时时的来相应。

66-----72行的代码让我去掉了,我认识没有用,因为在WM_MOUSEMOVE中没有调用WM_PAINT,那段代码应该不会被执行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《Windows程序设计》之BLOKOUT1 的相关文章

随机推荐

  • C++1-C语言和C++的区别

    一 C语言与C 43 43 的区别 1 头文件 xff1a C 43 43 xff1a span class token macro property span class token directive hash span span cl
  • BW:LO数据源初始化步骤(精简版)

    首先在r3上删除 setup table xff0c 然后再填充 setup table xff08 锁定凭证 xff09 xff0c 同时 xff0c 在bw做无数据的初始化 xff0c 最后在bw做full load
  • C++3--构造函数、冒号语法

    一 构造函数 1 为什么要有这个概念 xff1a 例如下面的代码 xff0c 对于Table类 xff0c 可以通过t Set公有的方法给对象设置内容 xff0c 但是如果每次创建对象都调用该方法设置信息 xff0c 就会有点麻烦 xff0
  • c/c++语言面试题目整理

    1 static有什么用途 xff1f 在C语言中 xff0c static主要定义全局静态变量 xff0c 定义局部静态变量 xff0c 定义静态函数 限制变量的作用域 xff0c 设置变量的存储域 static 关键字主要有两种作用 x
  • c语言宏定义一个MAX函数

    1 span class token macro property span class token directive hash span span class token directive keyword define span sp
  • C++ -- 异常:try、throw、catch

    异常 申请内存的时候 xff0c 内存不够用 空间配置器申请失败 xff0c 不做处理 拷贝时内存错误 除数分母不能为0 等情况 会抛出异常 try throw catch 1 使用示例 1 xff09 除数为零 xff0c 情况 未处理情
  • C++ -- 笔试题

    1 下列对派生类的描述中错误的说法是 D A 派生类至少有一个基类 B 派生类可作为另一个派生类的基类 C 派生类除了包含它直接定义的成员外 xff0c 还包含其基类的成员 D 派生类所继承的基类成员的访问权限保持不变 2 当派生类中有和基
  • Linux 用户切换、修改用户名、修改密码

    一 用户切换 34 34 xff1a 普通用户提示符 34 34 xff1a root用户提示符 1 普通用户到root 方式一 xff1a 命令 xff1a su 然后输入root密码 此种方式只是切换了root身份 xff0c 但She
  • C++中的.和::和:和->的区别

    在学习C 43 43 的过程中我们经常会用到 和 和 xff1a 和 gt xff0c 在此整理一下这些常用符号的区别 1 A B则A为对象或者结构体 xff1b 2 A gt B则A为指针 xff0c gt 是成员提取 xff0c A g
  • AirSim学习日志 5-LQR实现无人机轨迹跟踪

    1 LQR控制器算法原理推导 1 1 状态反馈控制 连续线性系统的状态空间表示为 x
  • 英语常用短语

    1 xff0e 经济的快速发展 the rapid development of economy 2 xff0e 人民生活水平的显著提高 稳步增长 the remarkable improvement steady growth of pe
  • PX4进入系统控制台以及运行程序

    这里提供进入控制台两种办法 1 运行 Tools mavlink shell py dev ttyACM0 是我进入Px4系统控制台的命令 xff0c 进入之后应该是这样 Pixhawk src Firmware Tools mavlink
  • 哈哈,终于知道CSDN怎么改头像了

    话说之前一直郁闷 xff0c 说改头像的功能还没修好 xff0c 一直说服务器错误 今天偶尔发现 xff0c 右上角有个设置 xff0c 原来在这里可以改 我还发了几封邮件给CSDN的admin xff0c 居然只知道道歉 xff0c 不告
  • Hello Sky! pixhawk第一个例程学习解读

    学习px4的第一个程序 xff0c 这个例子作为官方给出解释的例程 xff0c 对于新手上手来说 xff0c 是很好的范例 接下来我对照程序源码 xff08 已经经过自己的修改和添加注释 xff09 进行讲解 1 PX4 INFO是标准的L
  • ShadowSSDT Hook

    ShadowSSDT表的获取 这里的ShadowSSDT表的获取是通过函数KeAddSystemServiceTable来获取的 使用这个函数的原因 xff1a 1 这个函数是已经导出的 xff0c 可以在代码中直接使用 2 这个函数里面使
  • 2013&2014

    2013总结 2013 毕业了 xff0c 算是正式工作半年 xff0c 2013年7月开始 xff0c 算是我的生活 xff0c 工作之外的时间都是自己的 一 收获 1 压力测试 差不多算是一个月的时间 xff0c 疯狂的一个月 xff0
  • BCTF总结

    缘由 上周 xff0c 我们小组Sigma参加了 百度杯 BCTF比赛 xff0c 经历了难忘的双休 xff0c 这次的BCTF跟以前参加的国内类似的安全比赛有些不同 xff0c 时间只有48小时 xff0c 题目不多 xff0c 但难度大
  • BCTF_海报探秘(300)

    这个题目来自上周的BCTF比赛 xff0c 题目是海报探秘 xff08 300 xff09 xff0c 一张png图片中隐藏了KEY xff0c 解出KEY xff0c 具体报告 xff0c 请下载 xff1a http download
  • 博客转移

    最近好久不来CSDN了 xff0c 自己搭建了一个博客 欢迎各位去新博客留言 http www l0g1n cn 以前学习汇编的博客 http www asmedu net blog user usermain jsp neighborId
  • 《Windows程序设计》之BLOKOUT1

    LRESULT CALLBACK WndProc HWND hwnd UINT message WPARAM wParam LPARAM lParam static BOOL fBlocking fValidBox static POINT