2010-11-03 105 views
10

我正在寫一個小程序,讓我來回切換分辨率,因爲我的投影機無法處理與我的屏幕相同的分辨率。我已經知道如何使用Windows API設置屏幕分辨率。以及使用Windows API或QT4工具包讀取當前的分辨率。我的問題是我想要一個由屏幕和圖形卡支持的所有不同分辨率的菜單。這個程序將被分發,所以我需要程序實際與圖形卡通信以找出它支持的內容。我想使用的唯一API是Windows API或QT4工具包,但我不認爲QT4會這樣做,除非您以奇怪的方式使用圖形小部件。C++發現顯卡支持哪些分辨率

我很確定這是可能的WINDOWS API。我只是不知道該怎麼做。

哦,請減少一些鬆懈,我熟悉QT4和C++,但我通常是一個Linux程序員,我正在寫這個給其他人。我所做過的唯一一件事情就是創建一個消息框,設置背景和使用系統變量。所以請簡單說明一下過程。請不要只發佈一個鏈接到msdn,我討厭他們的文檔,我討厭微軟。我每年使用兩次窗戶。

+0

你自己限制在Win32 API中的任何原因? DirectX API封裝了這個功能,所以你不必處理不同的圖形卡供應商。 – 2010-11-03 16:17:37

+6

「請不要只發布msdn的鏈接,我討厭他們的文檔,而且我討厭微軟。」 真的!? MSDN文檔通常很棒。 – James 2010-11-03 17:06:12

回答

17

下面應該爲你在一般情況下大概工作

DEVMODE dm = { 0 }; 
dm.dmSize = sizeof(dm); 
for(int iModeNum = 0; EnumDisplaySettings(NULL, iModeNum, &dm) != 0; iModeNum++) { 
    cout << "Mode #" << iModeNum << " = " << dm.dmPelsWidth << "x" << dm.dmPelsHeight << endl; 
    } 

這應該打印出.exe文件運行於當前顯示的所有支持的分辨率。假設你不處理多顯示器圖形卡,這應該工作。否則,你必須在每個顯示器上使用EnumDisplayDevices循環。

一旦你找出你想要的分辨率,你可以使用'ChangeDisplaySettingsEx'來將顯示改變到你想要的模式。

使用DirectX是可能的,但我不會推薦它,因爲代碼更復雜(不得不初始化DirectX和使用COM指針),除非您計劃實際使用DirectX不僅僅是確定顯示分辨率。

+0

這正是我想要的,我不明白,每個模式編號是每個支持資源,並且0是最新的,謝謝 – 2010-11-03 16:42:03

+0

是不是有趣的是,我可以看一些示例代碼,並理解它比閱讀msdn的信息 – 2010-11-03 17:13:29

+0

@TheDude每個人都有不同的學習風格。你和我的似乎是'通過實例學習'。 – deed02392 2014-04-01 14:26:06

2

EnumDisplaySettings :)

從MSDN:

「爲了獲得當前顯示設置,通過ENUM_CURRENT_SETTINGS在iModeNum參數到EnumDisplaySettings API常數,由下面的C++代碼,如圖所示。」

DEVMODE dm; 
// initialize the DEVMODE structure 
ZeroMemory(&dm, sizeof(dm)); 
dm.dmSize = sizeof(dm); 
if (0 != EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dm)) 
{ 
// inspect the DEVMODE structure to obtain details 
// about the display settings such as 
// - Orientation 
// - Width and Height 
// - Frequency 
// - etc. 
} 
+2

有趣的是,您的答案中唯一的詞是MSDN的鏈接,提問者明確表示他不感興趣... – 2010-11-03 16:17:58

+0

@FrédéricHamidi。我添加了一個例子。 – YWE 2010-11-03 16:26:17

+0

我看不出「The Dude」在哪裏說。他說,「Windows API」和鏈接指向GDI中的一個函數,這是Windows API的一部分。在我看來,這正是所要求的。 – 2010-11-03 16:26:54