关于设计上的一个问题,请大家看看。

HongHuer 2003-08-20 02:08:34
问题描述:

1 我的程序结构:
class CPoint_
{
}

class CLine_
{
}

class CRect_
{
}

class CCell_ //单元
{
}

class CCellsManage//管理 CCell s
{
}

2 目前我写的程序中有个问题。
有两种设计设计上的选择:

一种是每个类都有自己的 消息处理函数,自己处理消息,那么上一级对象(比如是CLine_)就要负责分发消息,同时要记录下处理后的结果。

比如:
class CPoint_
{

virtual void Draw(CDC * pDC);

void WindowProc(UINT uiMsg, WPARAM wParam, LPARAM lParam);

void OnLButtonDown(WPARAM wParam, LPARAM lParam); //被选中了
}

class CLine_
{
virtual void Draw(CDC * pDC);

void WindowProc(UINT uiMsg, WPARAM wParam, LPARAM lParam)
{
switch(uiMsg)
{
case UM_LBUTTONDOWN:
point.WindowProc(uiMsg,wParam,lParam);
//记录处理后的结果
}
}
}

一种是消息由上一级的对象处理,处理完后改变(下一级)CPoint_的状态。





如果是你,你会选择哪一种,哪一种跟好呢?
请有经验的朋友说说。
谢谢。
...全文
38 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
rtdb 2003-08-21
  • 打赏
  • 举报
回复
实际上最重要的是“这些对象会有多少”。
当对象的实例个数是固定的且比较少时, 用第一种方式无可厚非。

但若是写那种矢量绘图或图文混排字处理系统,
在一个窗口中可能有成百上千的对象时,
第一种方法就不可行了。
此时标准作法是在先进行HITTEST, 看当前是哪个对象获得输入。

另外, 你的那些class CPoint_,CLine_等对象,
应有一个共同的基类, 完成共性的操作。 并利用多态进行不同的处理。

强烈建议去读《设计模式》, 它开头的例子对你有大用。



HongHuer 2003-08-21
  • 打赏
  • 举报
回复
to rtdb(东临碣石)


看了你的说法,我感觉很有用处,在第一种情况下,当对象多了时,管理的时候确是个问题。

共同的基类是有CGraphical_,主要是有是否被选择,还有消息的分发等。


很谢谢你的建议,我去找找看看。

好了,到这里,结了。






谢谢各位的参与。
谢谢各位的帮助。

Hawk_lp 2003-08-20
  • 打赏
  • 举报
回复
up
HongHuer 2003-08-20
  • 打赏
  • 举报
回复
我目前使用的是第一种。

但我发现有些问题。
因为要处理的消息很多,基本上每个我自己的类都有不同的消息要处理。

所以形成了这样的局面:
一个类处理自己的消息,如果不是自己的消息,就转发给下一级的类的对象处理。
这样就是有一个问题,现在到处都是类的消息处理函数,在上一级的类的对象就不好管理了。

因为子类的状态在很多的地方被改变了。

to bluestar(蓝色星星) ( ) 信誉:96 2003-08-20 14:13:00 得分:0

我当初写的时候也是和你有相同的想法。

to rtdb(东临碣石)
我觉得你说得有道理,和我的困惑比较近。

to wangjinwang(王进) ( ) 信誉:100

当然要用第一种方法,就象Windows那样,逐级处理,思路清晰,易于扩展。
否则当从某个类派生出新类时,因为不能在新类中处理消息(消息没有传过来),就要修改前面处理消息的类,(而且会改了又改),显然不好。

我承认你说的有道理,但现在的问题是,局面有点混乱了,就是子对象的状态在很多的消息中被改变了。
不好控制。

to ruihuahan:
我的是gerial calss , 但我要处理消息,所以也加了WindowProc();



看了大家的发言,我相信,大家也存在相同的困惑(至少目前有两种看法,我也是有这两种看法),或者说在这个问题上不是很有原则。

请大家说说实际的开发过程中的东西(是怎么处理的,特别是有相同的困惑的时候)吧,因为理论的东西应该是两种情况了。

ruihuahan 2003-08-20
  • 打赏
  • 举报
回复
不是所有的类都能有消息处理函数,从SDK的角度讲,只有窗口才能处理消息。
也就是说,只有封装了窗口的类才能有消息处理函数。
(MFC中的CDocument使用了特殊的机制,才能处理WM_COMMAND消息。)
孤必有邻 2003-08-20
  • 打赏
  • 举报
回复
当然要用第一种方法,就象Windows那样,逐级处理,思路清晰,易于扩展。
否则当从某个类派生出新类时,因为不能在新类中处理消息(消息没有传过来),就要修改前面处理消息的类,(而且会改了又改),显然不好。
nomenn 2003-08-20
  • 打赏
  • 举报
回复
同意!
这样保险!
rtdb 2003-08-20
  • 打赏
  • 举报
回复
主要看你要干什么了, 再就是这些对象会有多少。

习惯上只在一个地方处理消息。比较好控制。
否则大家都要处理, 一个消息进来, 每个对象跑一次?

bluestar 2003-08-20
  • 打赏
  • 举报
回复
从对象封装角度出发,用第一种,给自己的消息自己处理。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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