- 注册时间
- 2007-1-24
- 最后登录
- 2007-10-4
③业余
- 积分
- 288
|
现在发现Windows消息有点奇怪喔,以前总觉得用VC怪怪的,你看:
使用Button的时候,同样是发给子控件的消息.
WM_MOUSEMOVE消息传过来的时候,用的是接收该消息的窗口句柄找到该控件来处理事件.
而把按钮铵下去却用的是主窗口的句柄,外加WPARAM参数表示的控件ID号。
在程序中控件ID号包括了所有的窗口句柄。为什么不全都用ID号呢?或者全都用窗口句柄呢?
不过没多久就发现,尽管在主窗口中能从COMMAND消息中得到子窗口的BUTTON DOWN的事件.
但是,并不影响子窗口本身获得自已的Button Down事件。原来啊,WINDOWS发了两条消息过来喔。
现在,困扰我多年的问题终于解决.一开始我认为Windows所有的窗口都具有独立性.直到
在使用VC中碰到控件ID号,我开始困惑窗口之间的关系。然而现在,把它们分开来考虑,原来
的窗口之前的关系又清晰了(每个控件就是一个窗口,窗口有的都应该有)。
其实Button Down的这个事件完全可以由子窗口来获取,而之所以使用COMMAND又插了一脚,应该是为了方便吧。
但是,你要知道,对于一个窗口来说按下的鼠标的事件之类的消息是一类东西,处理起来应该是一样的。
而VC硬是把它们分开处理了,初学者会晕的!
最后,要说说VC与Delphi在做WINDOWS程序中.在这里就可以看出他们的分别了,
VC更接近Windows SDK,要是Windows SDK有些什么缺陷/特性,那么很容易在MFC中出现。
因此,学MFC必学SDK吧。Delphi封装得更好,更接近人类的直觉习惯,同类型的问题应该使用同类型的手段来处理。
经过比较,
最后,我们就在改动尽量少的情况下,试试让VC中的MouseMove接近于Delphi吧。
其实实现方式有很多种啦,使用裸体函数指针,又或使用事件/信号槽,最终还是决定
用老方法,使用接口的方式比较合理:
struct IButtonEvent
{
virtual void OnButtonDown () = 0;
virtual void OnButtonMove () = 0;
};
class CMyButton : public CButton
{
public:
void SetEvent ( IButtonEvent *pEvent );
};
class CMyDialog : public CDialog, pulbic IButtonEvent
{
public:
virtual void OnButtonDown ();
virtual void OnButtonMove ();
};
结论:
学MFC要学SDK。
看WINDOWS消息中,COMMAND消息有些特别,要分开来考虑。 |
|