想给treeview控件发个消息,以便触发它的nodeclick事件。可是找了N久,也没找到到底该发啥消息。
一、试着发消息
(1)先是找treeview控件的说明,它的所有消息里楞是没有叫nodeclick的消息;
(2)然后试着用API的sendmessage函数给父窗体发WM_NOTIFY消息,LPARAM的code取为NM_CLICK。试了半天,也没反应。也不知是目标窗体句柄没整对,还是消息代码没整对。
(3)再当了SPY++,想看看点击节点的时候倒底发了哪些消息,我靠,看得我眼花缭乱。貌似treeview控件外面有个子窗体,这个子窗体套在我以为是treeview控件父窗体的里面。具体这消息该谁发给谁,就够我绕的。
最后,结论是,这个nodeclick事件恐怕不是单一的消息触发的,而是VB里对一些消息做了综合判断,然后触发的。我要通过发消息触发nodeclick事件的话,恐怕得模拟若干条消息才成,想想都头大,于是决定放弃了。
二、自己定义事件
现在的权宜之计,就是自己定义一个事件,在希望nodeclick事件被触发的时候,触发我自己定义的这个事件,权且当作俺自己版本的nodeclick事件了。对了,VB还真得很绝,像这种build-in的事件还不许用RaiseEvent来触发。
唉。真得不大好用。最近看了篇比较C#和VB.net的文章,看得心里瓦凉瓦凉的。反正按那篇文章的意思,如果想编高质量的程序,就得用C#;真正好的VB程序员,也会更喜欢用C#……
三、问题的缘起
另外,补充说明一下我的问题的缘起。因为这个问题其实有些朋友已问过,看到的解决方案一般都是直接调用Nodeclick事件过程。但是这招不适用于我的情况:是这样,我是在VBA里编程。VBA里扩展类不是那么直截了当的。
我现在想扩展treeview控件。我就做了个类,类里含有withevents的treeview对象变量。这样,我只要对这个类对象的treeview成员对象变量的事件过程编程,所有的和这个类关联的treeview控件的事件过程就都可以省了。比如,nodeclick事件,我只要在我自己的类里写一次事件过程就行了。不过,有时候还需要一些特别的处理,这就需要这个事件不仅在我自己的类里得到通用处理,而且在包含treeview控件的窗体里得到特别处理,就是需要为同一个事件在两处写两个事件过程,但也不都是这样的情况。
不管怎样吧,反正nodeclick事件通过这种事件机制我是能解决的。不过,麻烦的是,有时候,我在程序里需要模拟一下nodeclick事件,就不能简单地通过调用nodeclick事件过程来处理,你也看到了,因为有可能存在多个nodeclick事件过程,不一定需要调几个。所以需要直接触发nodeclick事件,这就是我的问题的缘起……
四、再次尝试发消息
这几天又在高人的指点下用用发消息,这回貌似成功了,用SPY++可以看到我发的消息,参数貌似都没错。可惜的是,还是无功而返,nodeclick事件还是不会激发。先把发消息的正确代码写在这儿,省得日后忘了: