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

VC 常見入門問題彙總 (三):視窗控制、圖示、風格、位置、大小限制與置頂

     編輯:VC 教學

1. 修改視窗圖示

HICON hIcon = AfxGetApp()->LoadIcon(IDI_MYICON);
ASSERT(hIcon);
AfxGetMainWnd()->SendMessage(WM_SETICON, TRUE, (LPARAM)hIcon);   // 大圖示
AfxGetMainWnd()->SendMessage(WM_SETICON, FALSE, (LPARAM)hIcon);  // 小圖示

2. 修改視窗預設風格 (移除最大化鈕、設定初始位置大小)

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) {
    cs.style &= ~WS_MAXIMIZEBOX;          // 移除最大化按鈕
    cs.cx = GetSystemMetrics(SM_CXSCREEN) / 2;
    cs.cy = GetSystemMetrics(SM_CYSCREEN) / 2;
    cs.x = cs.y = 0;                      // 左上角座標
    return CMDIFrameWnd::PreCreateWindow(cs);
}

3. 視窗置中顯示

// 相對父視窗置中
CenterWindow();

// 相對螢幕置中
CenterWindow(CWnd::GetDesktopWindow());

// 主視窗置中
AfxGetMainWnd()->CenterWindow();

4. 啟動時最大化/最小化

// SDI/對話框:InitInstance 中
m_nCmdShow = SW_SHOWMAXIMIZED;  // 或 SW_SHOWMINIMIZED, SW_SHOWNORMAL

// MDI 子視窗:AppWizard Advanced → MDI 子視窗風格勾選最大化
// 或衍生類中
BOOL CChildFrame::PreCreateWindow(CREATESTRUCT& cs) {
    cs.style |= WS_MAXIMIZE;  // 或 WS_MINIMIZE
    return CMDIChildWnd::PreCreateWindow(cs);
}
// 或 OnInitialUpdate
void CMyView::OnInitialUpdate() {
    CView::OnInitialUpdate();
    GetParentFrame()->ShowWindow(SW_SHOWMAXIMIZED);
}

5. 強制視窗保持最小化 (禁止還原)

BOOL CMainFrame::OnQueryOpen() {
    return FALSE;  // 攔截 WM_QUERYOPEN,拒絕還原
}

6. 限制視窗大小範圍 (固定大小/最小/最大)

void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) {
    lpMMI->ptMinTrackSize = CPoint(400, 300);  // 最小追蹤尺寸
    lpMMI->ptMaxTrackSize = CPoint(800, 600);  // 最大追蹤尺寸
    // 固定大小:兩者設為相同值
    CFrameWnd::OnGetMinMaxInfo(lpMMI);
}

7. 隱藏/顯示視窗

ShowWindow(SW_HIDE);   // 隱藏
ShowWindow(SW_SHOW);   // 顯示
// 結合 FindWindow 控制其他應用視窗
HWND h = FindWindow(_T("Notepad"), NULL);
if (h) ::ShowWindow(h, SW_HIDE);

8. 視窗永久置頂

// 方法一:SetWindowPos (推薦)
pWnd->SetWindowPos(&wndTopMost, 0,0,0,0, SWP_NOMOVE|SWP_NOSIZE);

// 方法二:切換置頂狀態
void ToggleTopMost(CWnd* pWnd) {
    ASSERT_VALID(pWnd);
    pWnd->SetWindowPos(
        (pWnd->GetExStyle() & WS_EX_TOPMOST) ? &wndNoTopMost : &wndTopMost,
        0,0,0,0, SWP_NOMOVE|SWP_NOSIZE);
}

9. 點擊客戶區任意處拖動視窗 (模擬標題列)

LRESULT CMyDlg::OnNcHitTest(CPoint point) {
    LRESULT hit = CDialog::OnNcHitTest(point);
    if (hit == HTCLIENT) return HTCAPTION;  // 告訴系統點在標題列
    return hit;
}
// 僅對話框/基於對話框應用有效;一般視窗需處理 WM_NCHITTEST

10. 修改視窗標題列文字

void CMainFrame::OnUpdateFrameTitle(BOOL bAddToTitle) {
    CFrameWnd::OnUpdateFrameTitle(bAddToTitle);
    SetWindowText(_T("自訂標題 - 我的應用程式"));
}

常用視窗風格旗標速查

旗標效果
WS_MAXIMIZEBOX最大化按鈕
WS_MINIMIZEBOX最小化按鈕
WS_SYSMENU系統選單 (含關閉鈕)
WS_CAPTION標題列 (WS_BORDER | WS_DLGFRAME)
WS_THICKFRAME可調整大小邊框
WS_EX_TOPMOST擴展風格:永久置頂
WS_EX_TOOLWINDOW工具視窗 (無任務列按鈕、細標題列)

結語

視窗行為控制核心在於:創建前用 `PreCreateWindow` 改 `CREATESTRUCT`、運行中用 `ModifyStyle`/`SetWindowPos`、`OnGetMinMaxInfo` 限制尺寸、`OnNcHitTest` 擴展拖動區域。掌握這幾個切入點,即可靈活應對各種視窗定制需求。

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