问题描述: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_的状态。如果是你,你会选择哪一种,哪一种跟好呢?
请有经验的朋友说说。
谢谢。

解决方案 »

  1.   

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

  2.   

    不是所有的类都能有消息处理函数,从SDK的角度讲,只有窗口才能处理消息。
    也就是说,只有封装了窗口的类才能有消息处理函数。
    (MFC中的CDocument使用了特殊的机制,才能处理WM_COMMAND消息。)
      

  3.   

    我目前使用的是第一种。但我发现有些问题。
    因为要处理的消息很多,基本上每个我自己的类都有不同的消息要处理。所以形成了这样的局面:
    一个类处理自己的消息,如果不是自己的消息,就转发给下一级的类的对象处理。
    这样就是有一个问题,现在到处都是类的消息处理函数,在上一级的类的对象就不好管理了。因为子类的状态在很多的地方被改变了。to  bluestar(蓝色星星) ( ) 信誉:96  2003-08-20 14:13:00  得分:0 
     
    我当初写的时候也是和你有相同的想法。to  rtdb(东临碣石)
    我觉得你说得有道理,和我的困惑比较近。to  wangjinwang(王进) ( ) 信誉:100 当然要用第一种方法,就象Windows那样,逐级处理,思路清晰,易于扩展。
    否则当从某个类派生出新类时,因为不能在新类中处理消息(消息没有传过来),就要修改前面处理消息的类,(而且会改了又改),显然不好。我承认你说的有道理,但现在的问题是,局面有点混乱了,就是子对象的状态在很多的消息中被改变了。
    不好控制。to ruihuahan:
    我的是gerial calss , 但我要处理消息,所以也加了WindowProc();看了大家的发言,我相信,大家也存在相同的困惑(至少目前有两种看法,我也是有这两种看法),或者说在这个问题上不是很有原则。请大家说说实际的开发过程中的东西(是怎么处理的,特别是有相同的困惑的时候)吧,因为理论的东西应该是两种情况了。
      

  4.   

    实际上最重要的是“这些对象会有多少”。
    当对象的实例个数是固定的且比较少时, 用第一种方式无可厚非。但若是写那种矢量绘图或图文混排字处理系统,
    在一个窗口中可能有成百上千的对象时,
    第一种方法就不可行了。
    此时标准作法是在先进行HITTEST, 看当前是哪个对象获得输入。另外, 你的那些class CPoint_,CLine_等对象,
    应有一个共同的基类, 完成共性的操作。 并利用多态进行不同的处理。强烈建议去读《设计模式》, 它开头的例子对你有大用。
      

  5.   

    to  rtdb(东临碣石)
    看了你的说法,我感觉很有用处,在第一种情况下,当对象多了时,管理的时候确是个问题。共同的基类是有CGraphical_,主要是有是否被选择,还有消息的分发等。
    很谢谢你的建议,我去找找看看。好了,到这里,结了。
    谢谢各位的参与。
    谢谢各位的帮助。