WEB开发网
开发学院软件开发VC 防止用户进行正常的GUI操作 阅读

防止用户进行正常的GUI操作

 2010-07-06 20:43:56 来源:WEB开发网   
核心提示:问题:我在VC6.0中建立了一个SDI工程,工程中将主框架窗口切分为两个视图窗口,防止用户进行正常的GUI操作,如何防止用户移动主窗口以及调整切分视图的大小?有时候总感觉对不起用户,原因是编程人员总是出于自己的目的,用户便不能移动窗口以及调整窗口大小了,但事情真是这样吗?你知不知道Windows应用程序中有多少种方法可

问题:

我在VC6.0中建立了一个SDI工程,工程中将主框架窗口切分为两个视图窗口。如何防止用户移动主窗口以及调整切分视图的大小?

有时候总感觉对不起用户,原因是编程人员总是出于自己的目的,限制用户进行这样或那样正常的图形界面操作。如果某个程序限制我移动窗口、调整窗口大小或限制使用剪切、粘贴等功能的话,我的第一感觉就是将这个程序丢进垃圾箱。

但我是谁,凭什么对此妄加评论呢?也许在某些情况下限制窗口移动和调整窗口大小的操作是明智的呢。也许你在为总统编写一个核武器控制程序呢。不管怎样总是有这样的需求。限制调整窗口大小的最简单的方法是创建窗口时不要用WS_THICKFRAME。如果一个窗口没有了框架,那调整大小的途径就堵住了,但关闭WS_THICKFRAME后,窗口还有一个标题框,用它鼠标点住它还可以移动窗口。为此你还必须屏蔽掉WS_CAPTION,这样一来,你的应用程序连标题框都没了。你当然要让总统知道他正在使用的是核武器控制程序,而不是太空战游戏。如何避免这种进退两难的局面呢?如何让应用程序有标题框而又不能移动窗口呢?并且你还不想使用瘦框架,而使用肥框架又不能调整串口大小该如何实现?

实际上,蛋糕会有的,而且你还能吃到蛋糕。你既可以让窗口成为粗框架并带有标题框,同时又可以限制窗口的移动和调整窗口的大小。诀窍就是处理WM_NCHITTEST消息。当鼠标位于非客户区时,Windows会发送这个暧昧的消息来检查鼠标特定的位置。所谓非客户区:就是......,这是菜鸟级的问题啦,我在这就不罗嗦了,非客户区所包括的范围有:菜单、标题况和窗口边界。通常你根本不必关心非客户区的存在以及它包含一些什么区域,但有时候,比如现在你最好还是卷起袖子认真研究一下它吧。

当用户在标题框中点击鼠标时,Windows发送WM_NCHITTEST消息。默认的窗口过程检查鼠标坐标并返回一个特定的鼠标点击测试代码(HIT-TEST CODE)。例如,如果鼠标是在标题框中,默认的窗口过程返回HTCAPTION。如果鼠标是在左边界或右边界,默认的窗口过程分别返回HTLEFT或HTRIGHT。根据这些返回的代码值。Windows进行窗口移动或调整窗口大小的操作。

通过重载WM_NCHITTEST消息处理函数限制窗口的移动和调整窗口大小,返回值是由其它的值代替HTCAPTION、HTLEFT或HTRIGHT,那到底返回值是什么呢?首先可能想到返回HTNOWHERE,但这样的话会有一个问题:如果另一个窗口覆盖在你的窗口上,这时单击你的应用窗口的标题框的话,什么事也不会发生。我的意思是Windows不会激活你的应用程序窗口。那返回HTTRANSPARENT如何呢?也不行。HTTRANSPARENT和HTNOWHERE都使得现存的窗口框架状态不明确。

正确的返回值应该是HTBORDER,当用户单击粗框架窗口(可调整窗口大小)的边界时,默认的窗口过程返回相同的值。如果返回HTBORDER,Windows激活应用程序窗口时就不会初始化任何移动窗口或调整窗口大小的操作。

本文附带了一个示例工程NoSize,这个程序示范了如何实现以上讨论的内容,所有的工作都在CMainFrame类中完成。其中关键的函数是CMainFrame ::OnNcHitTest。它将所有不接受的点击测试代码映射到HTBORDER。

UINT CMainFrame::OnNcHitTest(CPoint point)
{
// 获得鼠标位置代码。
UINT hit = CFrameWnd::OnNcHitTest(point);
// 不接受以下的代码值,将它们映射到HTBORDER
static char DisallowCodes[] = {
HTLEFT,HTRIGHT,HTTOP,...,
HTSIZE,HTCAPTION };
return strchr(DisallowCodes, hit)) ? HTBORDER: hit;
}

在实际的范例程序中还包含TRACE诊断代码,这些代码有助于你研究程序执行的过程细节。利用上面的代码行。用户便不能移动窗口以及调整窗口大小了。

但事情真是这样吗?你知不知道Windows应用程序中有多少种方法可以移动窗口和调整窗口大小?如标题框中的最大/最小按钮以及系统菜单中的“移动”、“大小”等命令(见图三),不要跟我说你搞忘了。

图三

1 2 3  下一页

Tags:防止 用户 进行

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接