分类:
2008-10-13 16:47:08
C++ Q&A 专栏...
原著:
翻译:
原文出处:
原代码下载: (52KB)
PostMessage(GetActiveWindow(),WM_CLOSE,0,0);是不是看来很简单?但在Windows 2000下,这个方法不再有效。Windows 2000 中
// width int cx = GetSystemMetrics(SM_CXSCREEN); // height int cy = GetSystemMetrics(SM_CYSCREEN);GetSyStemMetrics 是一个很容易使用的函数,它可以用来获得各种类型的全局尺寸,象一个图标的大小或是窗口标题栏的高度。在Windows 2000中 ,有些像 SM_CXVIRTUALSCREEN 和 SM_CYVIRTUALSCREEN 这样的新参数,可以用了获得多监视器系统屏幕虚拟尺寸。无论作为一个 Windows 新丁还是一个老鸟,都应该仔细察看 GetSystemMetrics 的文档,学习所有你能获得不同的系统参数尺寸。详见最新的 Platform SDK 中的 GetSystemMetrics。 这个函数是你经常要用的一个函数,每一版的 Windows 中都有新的变化。
// in CStatusBar::CreateEx if (pParentWnd->GetStyle() & WS_THICKFRAME) dwStyle |= SBARS_SIZEGRIP; dwStyle |= dwCtrlStyle; return CWnd::Create(... dwStyle ...);这意味着如果你的主框架有 WS_THICKFRAME 风格(就是普通的框架窗口),MFC 会坚持为状态栏设置 SBARS_SIZEGRIP 风格。怎么办?
// 关闭 WS_THICKFRAME ModifyStyle(WS_THICKFRAME,0); m_wndStatusBar.Create(this); // 执行完这一行之后再打开 WS_THICKFRAME ModifyStyle(0,WS_THICKFRAME);
那如果你又需要这个大小拖拉把手呢?在这种情况下,我认为最简单的方法是实现一个有两个子状态栏的组合状态栏,任意一个都在你的按钮或是随便什么其它控件的左边或是右边。然后,在左边的那个子状态栏没有拖拉把手,而右边的那个子状态栏只剩下拖拉把手。老实说,如果你把状态栏作为其
它什么新窗口的子窗口,而不是主框架的子窗口,我怀疑它是否能正常工作;你可能必须自己重新跟踪消息循环并改写父窗口。如果,你真得在家这么做了,请让我知道。
还有一个细节是必须要做的,否则事情就不完美,如果用户隐藏了状态栏,会导致什么?没错!正如你预料,按钮还是会在。为了让按钮随状态栏一同隐藏,你必须在 ID_VIEW_STATUS_BAR
的处理函数中增加一些代码, 显示了
具体处理细节。
如果你真的想去跟踪一个组合状态栏,你必须先把状态栏,按钮和其它一些控件作为一个新的窗口类的子窗口,并在处理OnSize 消息时,将他们放在正确的位置上。而对于主框架来讲,重
新计算窗口位置是 MFC 的一项特权。如果你的按钮或是其它的什么控件比状态栏窗口小的话,你必须写一点代码在你的组合状态栏中,使得子窗口中间的空白被重画。你可以在处理WM_ERASEBKGND
做这项工作,或者在注册你的窗口类时,简单的把背景刷子设置成合适的系统颜色(例如:COLOR_3DFACE)。最后,你还得重载 OnCmdMsg 消息函数,使得消息能够发往父窗口。
使用 发送你的问题和评论给 Paul
--------------------next---------------------