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

VC++ 程式控制螢幕解析度與色彩深度:ChangeDisplaySettings 完整實戰

     編輯:VC 教學

顯示器核心參數原理

  • 色彩深度:每像素佔用位元數。8-bit = 256 色,16-bit = 65,536 色,24-bit = 1,670 萬色,32-bit = 真彩色+Alpha
  • 解析度:水平 × 垂直像素數,如 800×600、1920×1080
  • 重新整理率:螢幕每秒重繪次數,單位 Hz

核心 API:ChangeDisplaySettings

LONG ChangeDisplaySettings(
    LPDEVMODE lpDevMode,  // 目標顯示模式結構
    DWORD dwFlags         // 套用方式旗標
);

DEVMODE 關鍵欄位

欄位說明範例值
dmSize結構大小 (bytes)sizeof(DEVMODE)
dmBitsPerPel色彩位元數24 (真彩色)
dmPelsWidth水平解析度800
dmPelsHeight垂直解析度600
dmDisplayFrequency重新整理率75
dmFields有效欄位標記DM_BITSPERPEL \| DM_PELSWIDTH \| DM_PELSHEIGHT

dwFlags 選項

  • 0:暫時變更(重開機還原)
  • CDS_UPDATEREGISTRY:永久生效(寫入登錄)
  • CDS_TEST:僅測試模式是否支援,不實際套用

常見傳回值

值含義
DISP_CHANGE_SUCCESSFUL成功
DISP_CHANGE_RESTART需重開機
DISP_CHANGE_FAILED失敗
DISP_CHANGE_BADMODE模式不支援(如單色螢幕設 256 色)

MFC 對話式專案完整實作

步驟 1:建立專案

VC6.0 → MFC AppWizard (exe) → Dialog based → 專案名 ChangeRes → 全部預設完成。

步驟 2:介面佈局

在對話方塊放置一個按鈕,ID 為 IDC_BTN_TEST,標題「套用 800×600×24bit」。

步驟 3:按鈕處理函數

void CChangeResDlg::OnBtnTest() {
    DEVMODE dm = {0};
    dm.dmSize = sizeof(DEVMODE);
    dm.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL;
    dm.dmPelsWidth = 800;
    dm.dmPelsHeight = 600;
    dm.dmBitsPerPel = 24;

    // 先測試
    LONG ret = ChangeDisplaySettings(&dm, CDS_TEST);
    if (ret != DISP_CHANGE_SUCCESSFUL) {
        AfxMessageBox(_T("顯示卡不支援此模式!"));
        return;
    }

    // 正式套用(暫時)
    ret = ChangeDisplaySettings(&dm, 0);
    if (ret == DISP_CHANGE_SUCCESSFUL) {
        AfxMessageBox(_T("暫時變更成功!重開機還原。"));
        // 若需永久生效,再呼叫一次 CDS_UPDATEREGISTRY
        ChangeDisplaySettings(&dm, CDS_UPDATEREGISTRY);
    } else {
        CString msg;
        msg.Format(_T("變更失敗,錯誤碼: %d"), ret);
        AfxMessageBox(msg);
        ChangeDisplaySettings(NULL, 0); // 還原
    }
}

進階技巧與避坑指南

  1. 列舉支援模式:使用 EnumDisplaySettings(NULL, i, &dm) 迴圈列舉所有合法模式,避免設定不支援值。
  2. 多顯示器支援:Win2000+ 可傳遞裝置名稱 EnumDisplayDevices 取得各螢幕裝置名,再針對性設定。
  3. 使用者體驗:變更前彈出確認對話框,提供 15 秒倒數自動還原機制(參考 Windows 顯示屬性行為)。
  4. 錯誤碼完整判斷:實務上應針對所有 DISP_CHANGE_* 碼給予友善提示。
  5. 權限問題:Vista+ 需管理員權限或 UAC 同意,建議在 Manifest 標註 requireAdministrator。

應用場景

  • 全螢幕遊戲/播放器自動切換最佳解析度
  • 多媒體教學軟體統一投影設定
  • 遠端桌面/自動化測試環境預設解析度
  • 多螢幕佈局一鍵切換腳本

掌握 ChangeDisplaySettings,讓您的程式擁有「掌控硬體顯示」的超能力!

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