前些天帮一个朋友做一个信息综合管理系统,由于中间涉及到一些复杂的计算和工业方面的一些东西,所以采用VC6.0进行开发。毕竟VC才是玩了这么多年的熟练的技术,开发起来也得心应手。由于有大量的信息需要进行人机交互,在设计界面的时候如果采用编辑文本框的形式在处理界面的时候太麻烦了,决定寻找一种比较简单通用的方法。于是在网络上进行搜寻。终于找到了一个为CPropertyGrid的控件,这个控件能够以类似.net属性显示控件的方式进行信息的显示,而且很方便进行人机交互和信息的存储。这个控件最开始是codejock上的一个控件,后来经过了国人高手的加工。我下载到的版本是加工的版本,只有LIB和H文件,而这位国人高手在控件的功能完成上进行了一些个人信息的显示,由于程序在编写过程中没有注意到这点,在程序完成后朋友测试过程中发现了这个问题,这时如果替换掉这个控件将是很大的工作量,所以决定对这个控件进行加工(某种意义上的“破解”)
控件显示个人信息是下面图的样子
这里我不是说国人高手不应该这样,他能够在外国高手的基础上进行封装并发布应用的版本和调用接口和示例已经是非常的不错了。只是在我用的程序里如果用户在使用过程中间出现这样的信息就不是很好了。
由于这个国人高手的控件只提供了H文件和LIB文件,要想彻底的屏蔽这个消息框除非有他的源代码,否则是没有很好的办法解决的。经测试,这个消息框是在控件的区域进行右击鼠标的时候弹出来的。我们可以采用屏蔽鼠标右键的方法或者截获鼠标右键的方法来实现,而在子类化的方法中进行右键消息的屏蔽或者转发应该能够做到。
说动手就开始试验,首先用VC新建一个类继承控件的提供的原类CPropertyGrid,然后触发PreTranslateMessage消息,在这里进行消息的过滤,然后在传递到父类去。我在这里进行屏蔽截获鼠标右键的消息,示例代码如下:
BOOL CMyPropertyGrid::PreTranslateMessage(MSG* pMsg) { POINT pt; pt.x = LOWORD(pMsg->lParam); pt.y= HIWORD(pMsg->lParam); CRect rc; GetClientRect(&rc); ScreenToClient(&rc); if ((pMsg->message == WM_RBUTTONDOWN) || (pMsg->message == WM_RBUTTONUP) || (pMsg->message == WM_RBUTTONDBLCLK)) { return TRUE; } if ((rc.PtInRect(pt)) || (::GetFocus() == m_hWnd) || (pMsg->hwnd==m_hWnd)) { if (pMsg->message == WM_RBUTTONDOWN) { return TRUE; } if (WM_RBUTTONUP == pMsg->message) { return TRUE; } if (WM_RBUTTONDBLCLK == pMsg->message) { return TRUE; } if ((pMsg->message == WM_RBUTTONDOWN)|| (pMsg->message==WM_RBUTTONUP) || (pMsg->message==WM_RBUTTONDBLCLK)) { return TRUE; } } return CPropertyGrid::PreTranslateMessage(pMsg);
综上,这里用子类化的方法实现了消息的屏蔽和转发而达到我们软件的某种破解效果,子类化处理问题的方法还有很多,只要我们细心研究就不难发现很多好的示例,希望我的经验对各位有帮助。还有就是CPropertyGrid是一个很实用的工具,虽然在.NET中有这种控件,但是在VC6.0中实用能够更好的实现大容量信息的人机交互,值得推荐使用!
如果各位有好的使用和建议欢迎和我联系:
QQ:5516853
EMAIL:successq_g@163.com
欢迎访问最专业的网吧论坛,无盘论坛,网吧经营,网咖管理,网吧专业论坛
https://bbs.txwb.com
关注天下网吧微信/下载天下网吧APP/天下网吧小程序,一起来超精彩
|
本文来源:vczx 作者:佚名