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

VC++ 動態修改螢幕解析度、色彩深度與重新整理率

     編輯:關於VC++

核心 API:ChangeDisplaySettings


LONG ChangeDisplaySettings(LPDEVMODE lpDevMode, DWORD dwFlags);
  • lpDevMode:指向 DEVMODE 結構,指定目標顯示模式。
  • dwFlags:0 立即生效;CDS_UPDATEREGISTRY 寫入登錄持久化;CDS_TEST 僅測試不套用。
  • 回傳值:DISP_CHANGE_SUCCESSFUL、DISP_CHANGE_RESTART、DISP_CHANGE_FAILED、DISP_CHANGE_BADMODE。

DEVMODE 關鍵成員

取得目前顯示設定


BOOL GetCurrentVideoSettings(DEVMODE* dm) {
    HWND hDesktop = GetDesktopWindow();
    HDC hDC = GetDC(hDesktop);
    dm->dmSize = sizeof(DEVMODE);
    dm->dmBitsPerPel = GetDeviceCaps(hDC, BITSPIXEL);
    dm->dmPelsWidth  = GetSystemMetrics(SM_CXSCREEN);
    dm->dmPelsHeight = GetSystemMetrics(SM_CYSCREEN);
    dm->dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
    ReleaseDC(hDesktop, hDC);
    return TRUE;
}

列舉所有支援模式


DEVMODE dm; int modeNum = 0;
while (EnumDisplaySettings(NULL, modeNum++, &dm)) {
    // dm 包含一組有效模式,加入下拉選單供使用者選擇
}

完整修改範例 (對話方塊應用)

資源配置

  • 三個編輯框:寬度 IDC_EDIT_WIDTH、高度 IDC_EDIT_HEIGHT、色彩位數 IDC_EDIT_BITS
  • 按鈕:IDC_CHANGE「套用變更」、IDOK「關閉」

類別成員變數


UINT m_nWidthPixels, m_nHeightPixels, m_nBitsPerPixel;

套用變更處理


void CChngDsplyMdDlg::OnChange() {
    UpdateData(TRUE); // 從介面取得使用者輸入

    DEVMODE dm = {0};
    dm.dmSize       = sizeof(dm);
    dm.dmPelsWidth  = m_nWidthPixels;
    dm.dmPelsHeight = m_nHeightPixels;
    dm.dmBitsPerPel = m_nBitsPerPixel;
    dm.dmFields     = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL;

    LONG result = ChangeDisplaySettings(&dm, 0); // 立即套用
    if (result == DISP_CHANGE_SUCCESSFUL) {
        AfxMessageBox("修改成功");
        ChangeDisplaySettings(&dm, CDS_UPDATEREGISTRY); // 寫入登錄持久化
    } else {
        AfxMessageBox("修改失敗,恢復原設定");
        ChangeDisplaySettings(NULL, 0); // 還原系統預設
    }
}

進階擴充

  • 重新整理率:在 DEVMODE 加入 dmDisplayFrequency 並設 dmFields |= DM_DISPLAYFREQUENCY。
  • 模式驗證:先呼叫 ChangeDisplaySettings(&dm, CDS_TEST),回傳 DISP_CHANGE_SUCCESSFUL 才正式套用。
  • 多螢幕支援:EnumDisplayDevices 列舉裝置,傳遞裝置名稱至 EnumDisplaySettingsEx / ChangeDisplaySettingsEx。
  • 錯誤碼詳細處理:依回傳值給予使用者具體建議(如「此解析度需重新開機」、「顯示卡不支援此色彩深度」)。

注意事項

  1. 修改失敗時必須呼叫 ChangeDisplaySettings(NULL, 0) 還原,否則使用者可能面對黑畫面或異常模式。
  2. 部分顯示卡驅動要求重新開機才生效 (DISP_CHANGE_RESTART),應提示使用者。
  3. 遊戲/多媒體應用常用此技術進入獨占全螢幕模式,離開時務必還原使用者原始設定。

總結

掌握 DEVMODE 結構填寫、EnumDisplaySettings 列舉模式、ChangeDisplaySettings 套用/測試/持久化三種模式,即可實現無縫動態顯示設定調整,大幅提升應用程式易用性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
成員用途
dmSize結構大小 (sizeof(DEVMODE))
dmBitsPerPel色彩深度 (8/16/24/32)
dmPelsWidth水平解析度
dmPelsHeight垂直解析度
dmDisplayFrequency重新整理率 (Hz)
dmFields指定有效欄位組合 (如 DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL)