| 成員 | 用途 |
dmSize | 結構大小 (sizeof(DEVMODE)) |
dmBitsPerPel | 色彩深度 (8/16/24/32) |
dmPelsWidth | 水平解析度 |
dmPelsHeight | 垂直解析度 |
dmDisplayFrequency | 重新整理率 (Hz) |
dmFields | 指定有效欄位組合 (如 DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL) |
取得目前顯示設定
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。
- 錯誤碼詳細處理:依回傳值給予使用者具體建議(如「此解析度需重新開機」、「顯示卡不支援此色彩深度」)。
注意事項
- 修改失敗時必須呼叫
ChangeDisplaySettings(NULL, 0) 還原,否則使用者可能面對黑畫面或異常模式。
- 部分顯示卡驅動要求重新開機才生效 (
DISP_CHANGE_RESTART),應提示使用者。
- 遊戲/多媒體應用常用此技術進入獨占全螢幕模式,離開時務必還原使用者原始設定。
總結
掌握 DEVMODE 結構填寫、EnumDisplaySettings 列舉模式、ChangeDisplaySettings 套用/測試/持久化三種模式,即可實現無縫動態顯示設定調整,大幅提升應用程式易用性。
- 上一篇文章: MIPS 五級整數流水線模擬系統設計與實作
- 下一篇文章: VC++ 專案多語言資源建置指南:中英文雙版本實作
Copyright ©
程式碼之家 All Rights Reserved