问题描述: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_的状态。如果是你,你会选择哪一种,哪一种跟好呢?
请有经验的朋友说说。
谢谢。
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_的状态。如果是你,你会选择哪一种,哪一种跟好呢?
请有经验的朋友说说。
谢谢。
解决方案 »
- 动态创建的按钮,如何指定 【自绘】 属性?
- 急急急,120分急求自定义某行颜色的CListCtrl派生类,另请教WM_CTLCOLOR,WM_CUSTOMDRAW,WM_MEASUREITEM,WM_DRAWITEM
- 怎样判断accept成功后 客户端是否断线?
- 奇怪的事情,VC开发环境的问题
- 如何改变Form视图的字体大小
- 哪里可以查到RFC文档????
- 看输出解决鸟问题,解决后立刻给分
- 解决debug编译路径不能自动修改问题的3种方法
- 又送分:怎样捕获点击窗口的最大化按钮时的消息?我在 WM_SIZE 中跟踪 nType ,发现没触发。怎么回师呢。
- 为什么学游戏开发要从C/C++开始呢
- 各位大哥进来帮下忙,小第在学写SNIFFER,碰到个问题
- 怎样获得当前运行的程序的路经,有个API吗,谁知道呀?
否则当从某个类派生出新类时,因为不能在新类中处理消息(消息没有传过来),就要修改前面处理消息的类,(而且会改了又改),显然不好。
也就是说,只有封装了窗口的类才能有消息处理函数。
(MFC中的CDocument使用了特殊的机制,才能处理WM_COMMAND消息。)
因为要处理的消息很多,基本上每个我自己的类都有不同的消息要处理。所以形成了这样的局面:
一个类处理自己的消息,如果不是自己的消息,就转发给下一级的类的对象处理。
这样就是有一个问题,现在到处都是类的消息处理函数,在上一级的类的对象就不好管理了。因为子类的状态在很多的地方被改变了。to bluestar(蓝色星星) ( ) 信誉:96 2003-08-20 14:13:00 得分:0
我当初写的时候也是和你有相同的想法。to rtdb(东临碣石)
我觉得你说得有道理,和我的困惑比较近。to wangjinwang(王进) ( ) 信誉:100 当然要用第一种方法,就象Windows那样,逐级处理,思路清晰,易于扩展。
否则当从某个类派生出新类时,因为不能在新类中处理消息(消息没有传过来),就要修改前面处理消息的类,(而且会改了又改),显然不好。我承认你说的有道理,但现在的问题是,局面有点混乱了,就是子对象的状态在很多的消息中被改变了。
不好控制。to ruihuahan:
我的是gerial calss , 但我要处理消息,所以也加了WindowProc();看了大家的发言,我相信,大家也存在相同的困惑(至少目前有两种看法,我也是有这两种看法),或者说在这个问题上不是很有原则。请大家说说实际的开发过程中的东西(是怎么处理的,特别是有相同的困惑的时候)吧,因为理论的东西应该是两种情况了。
当对象的实例个数是固定的且比较少时, 用第一种方式无可厚非。但若是写那种矢量绘图或图文混排字处理系统,
在一个窗口中可能有成百上千的对象时,
第一种方法就不可行了。
此时标准作法是在先进行HITTEST, 看当前是哪个对象获得输入。另外, 你的那些class CPoint_,CLine_等对象,
应有一个共同的基类, 完成共性的操作。 并利用多态进行不同的处理。强烈建议去读《设计模式》, 它开头的例子对你有大用。
看了你的说法,我感觉很有用处,在第一种情况下,当对象多了时,管理的时候确是个问题。共同的基类是有CGraphical_,主要是有是否被选择,还有消息的分发等。
很谢谢你的建议,我去找找看看。好了,到这里,结了。
谢谢各位的参与。
谢谢各位的帮助。