防止用户进行正常的GUI 操作
2006-07-23 11:30:33 来源:WEB开发网用MFC建立的应用程序一般都会有状态条,这个状态条最右边的下角有一个三角形的尺寸手柄,
图五
用这个小玩意儿可以调整窗口的大小。
如何搞掂它呢?用下列代码即可:
// 在 CMainFrame::OnCreate 中
ModifyStyle(WS_THICKFRAME,0);
// 去掉粗框架
m_wndStatusBar.Create(...);
ModifyStyle(0,WS_THICKFRAME);
// 恢复粗框架
在上面的代码中,先是在创建状态条前关闭或屏蔽掉WS_THICKFRAME,创建完状态条之后再将WS_THICKFRAME恢复回来。原理是当创建状态条的时候,MFC根据窗口风格确定状态条上是否应该有尺寸手柄。至于在状态条创建以后如何关闭尺寸手柄,目前我还没有找到实现的方法。为了达到目的只好欺骗一下MFC 。图六是去掉尺寸手柄后的状态条。
图六
最后一个要解决的问题是限制使用切分窗口的分割条来调整视图窗口的大小,解决方法很简单,要做两件事情:首先是防止用鼠标操作切分条;其次是用普通光标指针代替尺寸调整光标指针。
具体方法是重载两个函数:OnLButtonDown 和OnMouseMove
// 重载后不允许调整大小
void CMySplitterWnd::OnLButtonDown(UINT, CPoint)
{
return; //就这么简单
}
// 重载后不允许设置光标指针
void CMySplitterWnd::OnMouseMove(UINT, CPoint)
{
return; // 同上
}
我真是太喜欢这种代码了,直接return,其它什么也不做。通常当在切分条上点击鼠标时,MFC执行的是如下代码:
// (在 WinSplit.cpp 中)
void CSplitterWnd::OnLButtonDown(UINT, CPoint pt)
{
if (m_bTracking)
return;
StartTracking(HitTest(pt));
}
为了防止Windows检测鼠标的点击,重载这个函数,并且在这个函数中除了return以外什么也不做。同样,如法炮制 CSplitterWnd::OnMouseMove ,通常当鼠标移到切分条上时,光标指针会变为象电路图中电容器一样的东西。如图七,
图七
为了防止出现这个光标指针,重载CSplitterWnd::OnMouseMove并返回return,让电容器短路,搞掂(图八)。
图八
第三个调整切分条的函数是:CSplitterWnd::DoKeyboardSplit。这个函数是用来实现“窗口|切分”菜单命令的,用户通过它使用键盘来调整切分窗口。这里不用重载CSplitterWnd::DoKeyboardSplit,把“窗口|切分”菜单命令从菜单中去掉不就行啦。
哈哈!从OnNcHitTest、最大化/最小化按钮、系统菜单到欺骗MFC状态条……,最后是切分 条。现在窗口应该保险了,试试看吧,肯定既不能移动窗口,也不能调整窗口大小。如果客户打电话来抱怨或删除你的程序的话请不要感到意外。最后祝编程愉快!
更多精彩
赞助商链接