测试结果:

实现方法:主要是程序注册一个消息函数:func,拦截鼠标滚轮触发的消息,需要注意的是,以写的方式处理实体时需要锁定文档。注册func的主要方法是:
BOOL acedRegisterFilterWinMsg(
const AcedFilterWinMsgFn pfn
);
AcedFilterWinMsgFn 这个类型 是一个函数指针,其实他是这样的:
typedef BOOL (* AcedFilterWinMsgFn)(MSG*);接受一个MSG *的参数,返回BOOL类型的函数。

这个MSG是个struct,参数内部是这样的:

typedef struct tagMSG {
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
#ifdef _MAC
DWORD lPrivate;
#endif
} MSG

我们主要使用到的是message成员,和wParam成员。使用message成员过滤出鼠标滚轮滑动的消息,wParam的值来区分滚轮上和下的运动,然后我们就把实体的旋转写在这个里面。详细见代码:、

BOOL func(MSG *msg) {

    int zdFx = ;

    if (msg->message == WM_MOUSEWHEEL) {

        zdFx = (short)HIWORD(msg->wParam);
acutPrintf(L"\n%d", zdFx);
if (zdFx == ) { AcDbEntity * pEnt = NULL; ErrorStatus es = acdbOpenObject(pEnt, oId, AcDb::kForWrite);
if (es == Acad::eOk) { pEnt->transformBy(matx1);
pEnt->close();
} }
else if (zdFx == -) { AcDbEntity * pEnt = NULL; ErrorStatus es = acdbOpenObject(pEnt, oId, AcDb::kForWrite); if (es == Acad::eOk) { pEnt->transformBy(matx2);
pEnt->close();
}
}
return TRUE;
} return FALSE;
}

这个func是个全局函数,这样方便我在注册func的类里面调用。因为注册了这个消息,cad默认的滚轮放大缩小的功能就会被屏蔽掉,需要使用解除注册的方法来取消对这个消息的监视。这个方法是:
BOOL acedRemoveFilterWinMsg(
const AcedFilterWinMsgFn pfn
);
我把注册和取消的方法封装到一个类里面,并且定义了一个BOOL类型的全局变量来避免重复注册和重复取消,见代码:

#include "stdafx.h"
#include "RegMsg.h" static bool isReged = FALSE;
extern BOOL func(MSG *msg);
RegMsg::RegMsg()
{
} RegMsg::~RegMsg()
{
} void RegMsg::reg()
{
if (!isReged) {
acutPrintf(L"\n reging...\n");
if (!acedRegisterFilterWinMsg(func)) {
acutPrintf(L"\n reg failed\n");
}
else{
acutPrintf(L"\n reg success\n");
isReged = TRUE;
}
}
} void RegMsg::unReg()
{
if (isReged) { if (!acedRemoveFilterWinMsg(func)) {
acutPrintf(L"\n unreg failed\n");
}
else {
acutPrintf(L"\n unreg success\n");
isReged = FALSE;
}
}
}

最后我需要做的就是,选择要选择的实体,把实体的ObjectId传入到func函数里,在func函数里进行旋转操作,我发现,必须在func函数里每滑动依次鼠标,就需要对实体进行依次开闭操作,如果,只是在处理函数里只旋转,而不关闭实体,cad里的实体是不会旋转的,到最后你什么时候关闭这个打开的实体,这个实体才会旋转到最后一次的操作上来。
下面是我在命令类的全局参数和定义的操作命令:

#define PI 3.14159265358979323846

BOOL func(MSG *msg);

AcDbObjectId oId;
AcGeMatrix3d matx1;
AcGeMatrix3d matx2;
RegMsg * reg = NULL;
static void ECDMyGroupMyRegMsg() {

        acDocManager->lockDocument(acDocManager->curDocument());

        if (reg == NULL) {
reg = new RegMsg(); AcRxClass *cls = AcDbEntity::desc(); AcDbEntity * pEnt = NULL; AcGePoint3d pickPoint; if (CSelectUtil::PromptSelectEntity(L"选择实体:", cls, pEnt, pickPoint, true)) { oId = pEnt->objectId();
pEnt->close();
matx1 = AcGeMatrix3d::rotation(1.0 / * PI, AcGeVector3d::kZAxis, pickPoint);
matx2 = AcGeMatrix3d::rotation(-1.0 / * PI, AcGeVector3d::kZAxis, pickPoint); reg->reg();
}
} }
static void ECDMyGroupMyUnRegMsg() {

        acDocManager->unlockDocument(acDocManager->curDocument());

        if (reg != NULL) {

            reg->unReg();

            reg = NULL;

            delete reg;
}
}

ObjectArx 使用消息钩子实现鼠标滚轮旋转实体的更多相关文章

  1. jQuery 3D圆盘旋转焦点图 支持鼠标滚轮

    之前我们分享过很多炫酷实用的jQuery焦点图插件了,今天介绍的这款jQuery焦点图非常特别,所有图片围成一个圆圈,组成一个立体视觉的圆盘,并且可以旋转选择圆盘中的图片.另外,这款jQuery 3D ...

  2. windows消息钩子注册底层机制浅析

    标 题: [原创]消息钩子注册浅析 作 者: RootSuLe 时 间: 2011-06-18,23:10:34 链 接: http://bbs.pediy.com/showthread.php?t= ...

  3. jquery横向纵向鼠标滚轮全屏切换

    html <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF- ...

  4. Win64 驱动内核编程-28.枚举消息钩子

    枚举消息钩子 简单粘贴点百度的解释,科普下消息钩子: 钩子是WINDOWS中消息处理机制的一个要点,通过安装各种钩子,应用程序能够设置相应的子例程来监视系统里的消息传递以及在这些消息到达目标窗口程序之 ...

  5. VC 鼠标滚轮事件控制绘图的问题

    问题描述: 在MFC中绘制数据曲线,通过鼠标滚轮来进行放大缩小操作.在使用滚轮事件时,发现如果数据量较大,会出现卡顿. 解决方案: 鼠标滚轮事件会进行重复绘图,考虑在鼠标滚轮结束之后再重绘: 在鼠标滚 ...

  6. js鼠标滚轮滚动图片切换效果

    效果体验网址:http://keleyi.com/keleyi/phtml/image/12.htm HTML文件代码: <!DOCTYPE html PUBLIC "-//W3C// ...

  7. js鼠标滚轮事件

    不多说,直接上代码. //非ie document.body.onmousewheel = function(event) { event = event || window.event; conso ...

  8. js事件监听/鼠标滚轮/行为/冒泡/键盘的兼容性写法

    addEvent:function(el,type,fn,capture) { if (window.addEventListener) { if (type === "mousewheel ...

  9. WPF中关于自定义控件的滚动条鼠标停留在内容上鼠标滚轮滚动无效的问题

    问题起因:在一个用户控件里放置了1个TreeView垂直顺序放置. 当用户控件中的内容超过面板大小时,滚动条会自动出现 ,但是只有当鼠标指示在右边滚动条的那一条位置时,才支持鼠标滚轴滚动. 点在控件内 ...

随机推荐

  1. Android 高仿新浪微博底部导航栏,实现双击首页Tab,页面的ListView滚动、刷新

    现在很多APP,如微信.QQ.微博等等,它们的主页面都无一例外的选择使用底部Tab导航, 通过这种方式,可以很好的把页面层级分化,很好的提高用户体验.相信,很多Android开发者,都使用到过这种经典 ...

  2. angular安装应用

    首先你要有node 和npm 全局安装angular    npm install -g @angular/cli 安装一个angular项目     ng new 项目名称 cd进入新建的项目 跑页 ...

  3. 神经网络为什么需要多次epoch

    Δw(t)=−ε ∂w(t)∂E​ +αΔw(t−1)(9) 我们知道反向传播每次迭代的效果是这样的:w=w+Δw(t) w=w+\Delta w(t)w=w+Δw(t) 我们知道,每条训练数据都会导 ...

  4. oracle CBO下使用更具选择性的索引

    基于成本的优化器(CBO, Cost-Based Optimizer)对索引的选择性进行判断来决定索引的使用是否能提高效率. 如果索引有很高的选择性, 那就是说对于每个不重复的索引键值,只对应数量很少 ...

  5. 第三次脱发——Scurm学(ctrl)习(C)心得

    Scrum 学习心得: 首先,敏捷并不是一门具体的技术,而是一种理念或者说是一种思想.它可以指导我们更加高效的开发. 其次,敏捷开发都具有以下共同的特征: 迭代式开发 增量交付 开发团队和用户反馈推动 ...

  6. svcs (service status) 和 svcadm (service administration) 使用

    1. svcs  显示服务实例的状态信息 svcs - report service status  显示服务状态命令 DESCRIPTION The svcs command displays in ...

  7. windows下如何安装Composer?

    Composer 不是一个包管理器,它仅仅是一个依赖管理工具.它涉及 "packages" 和 "libraries",但它在每个项目的基础上进行管理,在你项目 ...

  8. CSS 伸缩布局

    转载于:https://blog.csdn.net/weixin_41342585/article/details/80140513 1. flex-direction:设置伸缩容器中成员的排列方式 ...

  9. H5 新增表单属性和事件

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. Jmeter压力测试教程(入门篇)

    2.4 添加HTTP镜像服务器 在运行测试之前,如何验证我们发送的信息是否有误?如何可以理直气壮的告诉别人自己发送的测试请求没有问题?这里推荐添加HTTP镜像服务器进行校验测试. HTTP镜像服务器并 ...