首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

狀態列加入按鈕與控制項:CStatusBar 擴充技巧與螢幕保護程式終止技術

     編輯:關於VC++

標準 CStatusBar 不支援直接加入子控制項。本文介紹將按鈕/編輯控制項作為狀態列「姊妹視窗」加入主框架的技巧,並附贈 Windows 2000 環境下終止螢幕保護程式的解決方案。

狀態列加入按鈕:姊妹視窗法

核心概念

控制項不是狀態列的子視窗,而是與狀態列、工具列、視圖同層的主框架子視窗。透過 OnSize 手動定位即可。

實作範例:StatBarButn 專案

// CMainFrame 成員
CButton m_wndBtnAbout;  // ID_APP_ABOUT,自動連結 Help→About 命令

// OnCreate 中建立
m_wndBtnAbout.Create("About", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 
                     CRect(0,0,0,0), this, ID_APP_ABOUT);

// OnSize 中定位(填入狀態列被壓縮的空間)
void CMainFrame::OnSize(UINT nType, int cx, int cy) {
    CFrameWnd::OnSize(nType, cx, cy);
    RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
    
    CRect rc; m_wndStatusBar.GetItemRect(0, &rc);  // 取得第一個窗格矩形
    m_wndBtnAbout.MoveWindow(&rc);  // 按鈕填滿該窗格
}

隱藏狀態列調整把手

問題

// MFC 硬編碼邏輯
if (pParentWnd->GetStyle() & WS_THICKFRAME)
    dwStyle |= SBARS_SIZEGRIP;

有 WS_THICKFRAME 時強制加入調整把手,導致按鈕左側出現多餘把手。

簡易解法:暫時移除 WS_THICKFRAME

ModifyStyle(WS_THICKFRAME, 0);           // 關閉厚邊框
m_wndStatusBar.Create(this);              // 建立狀態列(不加把手)
ModifyStyle(0, WS_THICKFRAME);            // 還原厚邊框

雖屬「業餘手法」但有效。正式做法可衍生 CMyStatusBar 重寫 Create。

狀態列隱藏時同步隱藏按鈕

// ID_VIEW_STATUS_BAR 命令處理
void CMainFrame::OnViewStatusBar() {
    CFrameWnd::OnViewStatusBar();
    m_wndBtnAbout.ShowWindow(m_wndStatusBar.IsWindowVisible() ? SW_SHOW : SW_HIDE);
}

進階:組合狀態列控制項

  • 左側狀態列(無把手)+ 右側狀態列(僅把手)
  • 需自行處理 WM_ERASEBKGND 填補中間空白
  • 註冊視窗類時設定背景刷子:COLOR_3DFACE
  • 重載 OnCmdMsg 轉發命令至父視窗

附贈:Windows 2000 終止螢幕保護程式

問題

Win2000 引入桌面隔離,螢幕保護程式運行於 "Screen-Saver" 桌面,GetActiveWindow/GetForegroundWindow 找不到視窗。

解法:開啟桌面 → 列舉視窗 → 送 WM_CLOSE

HDESK hDesk = OpenDesktop("Screen-saver", 0, FALSE, GENERIC_ALL);
if (hDesk) {
    EnumDesktopWindows(hDesk, EnumProc, 0);
    CloseDesktop(hDesk);
}

BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lParam) {
    PostMessage(hwnd, WM_CLOSE, 0, 0);
    return TRUE;
}

螢幕解析度偵測

int cx = GetSystemMetrics(SM_CXSCREEN);
int cy = GetSystemMetrics(SM_CYSCREEN);
// 多螢幕支援
int vcx = GetSystemMetrics(SM_CXVIRTUALSCREEN);
int vcy = GetSystemMetrics(SM_CYVIRTUALSCREEN);

總結

狀態列擴充採用「姊妹視窗 + OnSize 定位」模式,解決 MFC 硬編碼限制。螢幕保護程式終止需理解桌面隔離架構。GetSystemMetrics 是取得系統尺寸的萬用鑰匙,建議徹底掌握其參數變化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved