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

VC++ 視窗屬性動態修改:GetWindowLong/SetWindowLong 完整指南

     編輯:關於C++

使用 GetWindowLong / SetWindowLong 配合 SetWindowPos 實現運行時動態修改 MFC 視窗樣式,涵蓋標題欄、邊框、最小化/最大化/關閉按鈕、工具視窗等常見場景。

核心模式

// 修改樣式通用模板
LONG style = GetWindowLong(m_hWnd, GWL_STYLE);
style |= WS_XXX;          // 啟用某樣式
// 或 style &= ~WS_XXX;   // 禁用某樣式
SetWindowLong(m_hWnd, GWL_STYLE, style);
SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED);

常見操作速查表

功能啟用代碼禁用代碼
最小化按鈕style |= WS_MINIMIZEBOXstyle &= ~WS_MINIMIZEBOX
最大化按鈕style |= WS_MAXIMIZEBOXstyle &= ~WS_MAXIMIZEBOX
關閉按鈕EnableMenuItem(GetSystemMenu(FALSE), SC_CLOSE, MF_ENABLED)EnableMenuItem(GetSystemMenu(FALSE), SC_CLOSE, MF_GRAYED)
標題欄style |= WS_CAPTIONstyle &= ~WS_CAPTION
3D 邊框(可縮放)style |= WS_THICKFRAMEstyle &= ~WS_THICKFRAME
細邊框(不可縮放)style |= WS_BORDERstyle &= ~WS_BORDER
無邊框—style &= ~(WS_CAPTION | WS_THICKFRAME)

進階場景:工具視窗 (不顯示在任務列)

// OnInitDialog() 中設定
LONG exStyle = GetWindowLong(m_hWnd, GWL_EXSTYLE);
exStyle &= ~WS_EX_APPWINDOW;
exStyle |= WS_EX_TOOLWINDOW;
SetWindowLong(m_hWnd, GWL_EXSTYLE, exStyle);
SetWindowPos(NULL, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE);

MFC 視圖/框架邊框移除 (SDI 程式)

// 移除 View 邊框
BOOL CSDIView::PreCreateWindow(CREATESTRUCT& cs) {
    cs.style &= ~WS_BORDER;
    return CFormView::PreCreateWindow(cs);
}

// 移除 Frame 客戶區邊框
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) {
    if (!CFrameWnd::PreCreateWindow(cs)) return FALSE;
    cs.dwExStyle &= ~WS_EX_CLIENTEDGE;  // 必須在基類調用後執行
    return TRUE;
}

關鍵注意事項

  • 僅對 Pop-up 視窗有效,子視窗 (Child Window) 樣式修改可能不生效
  • 必須呼叫 SetWindowPos 並包含 SWP_FRAMECHANGED 旗標,變更才會立即重繪
  • GWL_STYLE vs GWL_EXSTYLE:標準樣式 vs 擴展樣式,勿混淆
  • 位元操作:| 開啟、& ~ 關閉、^ 切換
  • 修改 WS_EX_DLGMODALFRAME 時需同步處理擴展樣式

常見錯誤排查

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
現象可能原因解決方案
樣式修改不生效漏掉 SWP_FRAMECHANGED加入旗標並呼叫 SetWindowPos
子視窗樣式無效子視窗受父視窗約束改用 ModifyStyle 或在建立時指定
視窗閃爍/殘影重繪旗標不完整加入 SWP_NOREDRAW 配合 InvalidateRect