如何给自己定义的类添加鼠标响应消息

fly2sky 2009-02-19 11:53:36
请问在MFC单文档程序中我自己添加了一个CTool类,我还想在这个类中响应我的鼠标消息,不知道如何响应啊!请高手指教!
...全文
412 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wonder1916 2011-11-05
  • 打赏
  • 举报
回复
我的邮箱:wangtaonew@qq.com
wonder1916 2011-11-05
  • 打赏
  • 举报
回复
楼上的同志,请问一下你的问题解决没,如果解决了可不可以与我分享一下,我也不会添加自定义类中的响应消息
tyronetown 2009-05-13
  • 打赏
  • 举报
回复
这位兄弟,我在做一个图形学的综合练习,要画线、圆,填充,变换等功能,
想把这些功能封装一下,遇到了同你一样的问题,不知道如何在自己定义的类中响应消息,如果每次都要在View类中做转换的话,太麻烦了,整个代码简直不能看,

上面的我看了,还是有些不懂,你可以把你的源程序发给我一下,我好自己仔细琢磨琢磨么?
十分感谢。

邮箱:614508661@qq.com
fly2sky 2009-02-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 huayehanshan 的回复:]
相应鼠标消息的只能是视图类,相应消息首先是要进入视图的OnLButtonDown等相应函数的。
你只是把你的处理代码再次进行封装,并创建了一个CTool类来进行统一的管理。就用上面的
框架。你仔细理解一下。
在编写绘制图形等类型的程序时,这是一个常用到的框架。结构很清晰,封装也好。适合别人
来阅读你的代码。在进行商业软件开发时,一定要让你的程序结构清晰。这样才好和别人配合
[/Quote]
[Quote=引用 6 楼 hqin6 的回复:]

汗~~~lz应该理解偏差了吧?

鼠标消息的响应,不可能在CTool里去响应啊,应该在CView里响应,然后响应函数或者响应的处理过程可以放在CTool里

应该不能在CTool里捕捉到鼠标消息吧?!

除非CTool能从某个CView里继承过来

不知道说的对不对,仅供参考!
[/Quote]

二位大侠说得很对,三楼的大哥说得也很对,是我开始理解错了,现在问题解决了,我在这里在一次的谢谢你们了 解决办法正如你们所说!现在我就把它拿来亮亮

首先是CBaseTool类,我定义了一个虚基类
class CBaseTool : public CObject
并且
CView *m_pView;
CBaseTool(CView * ownerObj):m_pView(ownerObj),m_toolType(toolTypeUndefined) {};

而且在这个类中,定义了如下函数,其中toolType是一个枚举类型
toolType GetToolType(void) const {return m_toolType;}
virtual void ProcMouse(UINT msg,int x,int y,UINT keyFlags) {}
virtual long ProcCommand(UINT id){ return 0;}
//鼠标消息
//返回: msg!=WM_RBUTTONUP时, 1/0 正常返回/删除此工具
// msg==WM_RBUTTONUP时, 1/0 允许右键菜单/不允许右键菜单
virtual short ProcMouse(UINT msg,CPoint * xy,UINT keyFlags) {return 1;}
//键盘消息:ProcKey在KeyDown中处理
virtual short ProcKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) {return 1;}
//在KeyUp中处理
virtual short ProcKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) {return 1;}
//处理重画消息
virtual void ProcPaint(CDC *pDC) {}
virtual short Running() {return 1;}
然后呢,就是写好每一个按钮对应的类,这些类都集成CBaseTool类
如:
class CToolDrawPolyline : public CBaseTool
{
vector<CPoint> m_vPoints;
CPoint* m_pPoints;
long m_lSize;
CPoint* GetVertex(void);
BOOL DrawPolyline(CDC* pDC);
public:
CToolDrawPolyline(CView * ownerObj);
virtual ~CToolDrawPolyline();
virtual short ProcMouse(UINT msg,CPoint * xy,UINT keyFlags);

};
然后在CView中
用到的鼠标消息都与上述函数相对应,因为基类的指针是可以调用派生类的对象的,所以呢,就可以这么办了,对函数传递不同的消息就可以实现不同的功能了!
void CVDijkView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (m_pCurTool!=NULL) {
m_pCurTool->ProcMouse(WM_LBUTTONDOWN,&point,nFlags);
}
CView::OnLButtonDown(nFlags, point);
}

void CVDijkView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(m_pCurTool!=NULL)
{
m_pCurTool->ProcMouse(WM_LBUTTONUP,&point,nFlags);
}
CView::OnLButtonUp(nFlags, point);
}

void CVDijkView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(m_pCurTool!=NULL)
{
m_pCurTool->ProcMouse(WM_MOUSEMOVE,&point,nFlags);
}
CView::OnMouseMove(nFlags, point);
}

void CVDijkView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(m_pCurTool!=NULL)
{
m_pCurTool->ProcMouse(WM_RBUTTONDBLCLK,&point,nFlags);
}
CView::OnLButtonDblClk(nFlags, point);
}

void CVDijkView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (m_pCurTool!=NULL) {
m_pCurTool->ProcMouse(WM_RBUTTONDOWN,&point,nFlags);
}
CView::OnRButtonDown(nFlags, point);
}

void CVDijkView::OnRButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (m_pCurTool!=NULL) {
m_pCurTool->ProcMouse(WM_RBUTTONUP,&point,nFlags);
}
CView::OnRButtonUp(nFlags, point);
}
然后,比如我对一个toolbar上的按钮就行消息响应了,然后在相应函数中new一个按钮对应类的对象就可以实现相应功能了!
if(m_pCurTool!=NULL)
delete m_pCurTool;
m_pCurTool = new CToolDrawPolyline(this);
这样就可以实现相应的功能了,再次感谢各位大侠!~~
叶落寒山 2009-02-22
  • 打赏
  • 举报
回复
相应鼠标消息的只能是视图类,相应消息首先是要进入视图的OnLButtonDown等相应函数的。
你只是把你的处理代码再次进行封装,并创建了一个CTool类来进行统一的管理。就用上面的
框架。你仔细理解一下。
在编写绘制图形等类型的程序时,这是一个常用到的框架。结构很清晰,封装也好。适合别人
来阅读你的代码。在进行商业软件开发时,一定要让你的程序结构清晰。这样才好和别人配合
太乙 2009-02-21
  • 打赏
  • 举报
回复
我如何在我的CTool中响应鼠标消息呢,前提是这个类的构造函数我已经传递进来了CView类的指针this


汗~~~lz应该理解偏差了吧?

鼠标消息的响应,不可能在CTool里去响应啊,应该在CView里响应,然后响应函数或者响应的处理过程可以放在CTool里

应该不能在CTool里捕捉到鼠标消息吧?!

除非CTool能从某个CView里继承过来

不知道说的对不对,仅供参考!

fly2sky 2009-02-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 waizqfor 的回复:]

http://topic.csdn.net/t/20031218/09/2575785.htmlLZ看看代码
[/Quote]
高手啊 这个我看了 但是小弟是菜鸟啊 有点看不懂 我具体问题写在上边了 能不能再帮帮小弟啊~
fly2sky 2009-02-21
  • 打赏
  • 举报
回复
十分的感谢啊 再说声太感谢你了 不过怪我 我问题可能没有太说清楚
具体问题是这样的 我单文档程序是要做一个GIS的基本绘图,需要绘制很多种图形 比如说:圆 椭圆 直线 矩形 .... 这样就需要对应定义比较多个button
而每一个button都要有一个响应函数,而且每一个按钮的功能都要用到鼠标消息,要是在CView里边一个OnLButtonDown和Up里边用switch来操作不但很复杂,而且很难让人理解,所以想到了这样一个办法:
先写一个CTool作为基类,这个类呢传递进来CView类的指针,然后在这个类里边响应鼠标消息
然后给每一个button定义一个类,并且这些类都继承CTool,这样在每一个button的消息响应函数中只要new一个每一个button类的对象然后把CView的指针传递进去,只要在CTool中响应鼠标消息virtual void ProcMouse()(这个函数是自定义的,那么就可以实现每一个按钮的类对象自行处理鼠标消息病将绘制的图形信息保存在自己的类中,按钮多了这是个很不错的选择,但是问题就出来了
我如何在我的CTool中响应鼠标消息呢,前提是这个类的构造函数我已经传递进来了CView类的指针this。再帮帮我吧 再次感谢!
捕鲸叉 2009-02-21
  • 打赏
  • 举报
回复
我们做过CAD软件,大致做法是象下面这样:

class CTool
{
//...
virtual OnLButtonDown(..);
}

CMyView::OnLButtonDown()
{
//...
CTool* _pCurrentTool = GetCurrentTool();
if (_pCurrentTool)
_pCurrentTool->OnLButtonDown();
}

waizqfor 2009-02-20
  • 打赏
  • 举报
回复
[Quote=引用楼主 chenghongyue 的帖子:]
请问在MFC单文档程序中我自己添加了一个CTool类,我还想在这个类中响应我的鼠标消息,不知道如何响应啊!请高手指教!
[/Quote]
http://topic.csdn.net/t/20031218/09/2575785.htmlLZ看看代码
叶落寒山 2009-02-20
  • 打赏
  • 举报
回复
你要相应鼠标消息,总归是要在程序视图中点击吧。在视图类中生成CTool类的对象,或者你是在其他地方创建的CTool对象,那就将Ctool对象的
指针传递到视图类中。在视图类的鼠标响应函数中截取鼠标响应,传入CTool类中。

框架代码

视图类.h
class CMyView: public CView
{
protected:
CMyView();
virtual ~CMyView();
DECLARE_DYNCREATE(CMyView)
protected:
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
DECLARE_MESSAGE_MAP()
private:
CTool* m_Tool;
};
视图类.cpp
BEGIN_MESSAGE_MAP(CMyView, CView)
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()

void CMyView::OnLButtonDown(UINT nFlags, CPoint point)
{
CClientDC dc(this);
OnPrepareDC(&dc,NULL);
dc.DPtoLP(&point);

ASSERT(m_Tool);
m_Tool->OnLButtonDown(this,nFlags,point);
CView::OnLButtonDown(nFlags, point);
}

void CMyView::OnLButtonUp(UINT nFlags, CPoint point)
{
CClientDC dc(this);
OnPrepareDC(&dc,NULL);
dc.DPtoLP(&point);

ASSERT(m_Tool);
m_Tool->OnLButtonUp(this,nFlags,point);
CView::OnLButtonUp(nFlags, point);
}

void CMyView::OnMouseMove(UINT nFlags, CPoint point)
{
CClientDC dc(this);
OnPrepareDC(&dc,NULL);
dc.DPtoLP(&point);

ASSERT(m_Tool);
m_Tool->OnMouseMove(this,nFlags,point);
CView::OnMouseMove(nFlags, point);
}

CTool类的.h
public:
void OnLButtonUp(CView* pView, UINT nFlags, const CPoint& point);
void OnLButtonDown(CView* pView, UINT nFlags, const CPoint& point);
void OnMouseMove(CView* pView, UINT nFlags, const CPoint& point);

CTool类的.cpp
void CTool::OnLButtonDown(CView* pView, UINT nFlags, const CPoint& point)
{
// 处理代码
}

void CTool::OnLButtonUp(CView* pView, UINT nFlags, const CPoint& point)
{
// 处理代码
}

void CTool::OnMouseMove(CView* pView, UINT nFlags, const CPoint& point)
{
// 处理代码
}
a_rockboy 2009-02-19
  • 打赏
  • 举报
回复
CTool是不是一个窗体啊?本身是一个窗体,截获鼠标消息就可以。如果不是,由单文档窗体截获鼠标消息,在消息处理中调用CTool类的函数。

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧