Tab控件如何知道选项卡已改变?(PostMessage()的用法说详细参考?)
八月 3, 2007
发表在: java
我在使用ctabctrlssl(www.codeproject.com上有源码下载,继承自ctab)时遇到一个问题:无法得到tab控件的tcn_selchange消息。我的做法是(照www.codeproject.com上的说明做的):窗口上的tab资源用class wizard生成一个ctabctrlssl类的变量,然后用vc6的class wizard产生tcn_selchange的消息映射函数onselchange(...),经用messagebox()测试,该函数内的代码并未执行,查看ctabctrlssl的源码,发现该类已经产生了同样的消息映射tcn_selchange,经测试在我转换选项卡的时候此onselchange(...)函数内的代码执行了,即消息在ctabctrlssl中处理后就消失了,父窗口因此没有得到该消息。如果去掉此类中的消息映射,则对话框窗口中的onselchange(...)函数就执行到了,由于ctabctrlssl内的tcn_selchange消息无法去掉(ctabctrlssl要在改变选项卡时要显示其对应的选项卡内子窗口,同时隐藏以前的窗口,还有其它工作),所以此处必须保留。如何才能在父窗口(对话框窗口)中获得此消息并执行相应的程序?因为在改变选项卡的时候我还有一些额外的工作要做。我想在ctabctrlssl::onselchange(...)的最末尾用postmessage发送tcn_selchange消息给父窗口,但不知此主句怎么写。postmessage的参数实在是不明白,主要是wparam和lparam的值不知道如何确定,花了大量时间查msdn、www.csdn.net、及用google搜索,都没有找到相关资料,在此请教各位大侠,小弟初学vc,不懂的东西太多了。。。谢谢!
电脑软件技术推荐:
用pretranslatemsg函数是否能截获该消息呢?
up
nmhdr nmhdr;
nmhdr.hwndfrom=this->getsafehwnd();
nmhdr.idfrom=id_tab; //得改成你的tab的id
nmhdr.code=tcn_selchange;
cwnd* pparent=this->getparent();
::sendmessage(pparent->getsafehwnd(),wm_notify,(wparam)(id_tab),(lparam)(&nmhdr));
在你ctabctrlssl::onselchange(...)的最末尾试试看,我吃饭去
很简单,如下:
void ctabctrlssl::onselchange(wparam wparam,lparam lparam)
{
.
.
.
::postmessage(getparent()->getsafehwnd(),tcn_selchange,wparam,lparam);
}
因为在 ctabctrlssl 内反射了 tcn_selchange 。
你可以做个 tabctrl 扩展类,然后在改变事件过程中向父窗体发送自定义消息吗
为什么要拦截呢
截获消息后,可以再转发
.
No comments in this entry