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

C++ Builder 動態切換螢幕解析度完整範例

     編輯:關於C++

功能說明

透過 Windows API EnumDisplaySettings 取得目前顯示設定,修改寬高後呼叫 ChangeDisplaySettings 套用,實現執行期動態切換解析度。

完整程式碼

取得目前解析度

void __fastcall TForm1::btnGetClick(TObject *Sender) {
    int x = GetSystemMetrics(SM_CXSCREEN);
    int y = GetSystemMetrics(SM_CYSCREEN);
    ShowMessage("螢幕水平解析度: " + IntToStr(x) +
                "\n\n螢幕垂直解析度: " + IntToStr(y));
}

切換解析度核心函式

void __fastcall TForm1::DynamicResolution(int x, int y) {
    DEVMODE dm;          // TDeviceMode 在 BCB 中對應 DEVMODE
    ZeroMemory(&dm, sizeof(dm));
    dm.dmSize = sizeof(dm);

    // 取得目前顯示設定 (ENUM_CURRENT_SETTINGS = -1)
    if (EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dm)) {
        dm.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT;
        dm.dmPelsWidth = x;
        dm.dmPelsHeight = y;

        // 套用變更,0 表示立即生效
        LONG result = ChangeDisplaySettings(&dm, 0);

        if (result == DISP_CHANGE_SUCCESSFUL) {
            ShowMessage("解析度切換成功");
        } else {
            ShowMessage("切換失敗,錯誤碼: " + IntToStr(result));
        }
    } else {
        ShowMessage("無法取得顯示設定");
    }
}

按鈕事件範例

void __fastcall TForm1::BitBtn1Click(TObject *Sender) {
    DynamicResolution(800, 600);   // 切換至 800x600
}

void __fastcall TForm1::BitBtn2Click(TObject *Sender) {
    DynamicResolution(1024, 768);  // 切換至 1024x768
}

關鍵結構與旗標

項目說明
DEVMODE (TDeviceMode)裝置模式結構,包含解析度、色深、重新整理率等
dmFields指定哪些欄位有效 (DM_PELSWIDTH, DM_PELSHEIGHT, DM_BITSPERPEL, DM_DISPLAYFREQUENCY 等)
EnumDisplaySettingsNULL 裝置名 = 目前顯示裝置;ENUM_CURRENT_SETTINGS (-1) = 目前模式
ChangeDisplaySettings 回傳值DISP_CHANGE_SUCCESSFUL (0) 成功;其他如 DISP_CHANGE_RESTART (1) 需重啟、DISP_CHANGE_FAILED (-1) 失敗等

注意事項

  • 解析度必須為顯示卡/螢幕支援的模式,否則切換失敗
  • 全螢幕遊戲/應用程式常使用此技術切換解析度
  • 多螢幕環境需指定裝置名稱而非 NULL
  • 變更後系統會短暫閃爍,屬正常現象
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved