全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1827
推到 Plurk!
推到 Facebook!

如何知道目前電腦的解析度,顏色位色數和掃描頻率

尚未結案
saam
初階會員


發表:61
回覆:75
積分:27
註冊:2003-03-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-09 16:17:48 IP:211.75.xxx.xxx 未訂閱
請問各位大大: 我想知道目前電腦的解析度,顏色位色數和掃描頻率 的值的話要使用什麼函數呢?
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-09 16:32:36 IP:218.16.xxx.xxx 未訂閱
解析度 :   API : X := GetSystemMetrics(SM_CXSCREEN); Y := GetSystemMetrics(SM_CYSCREEN);   TScreen : X := Screen.Width Y := Screen.Height    顏色位bit數 : var HDC1 : HDC    HDC1 := CreateIC('DISPLAY',NIL,NIL,NIL); if GetDeviceCaps(Hdc1, PLANES) = 4 then   Bit := 16 else   Bit := GetDeviceCaps(Hdc1, BITSPIXEL); DeleteDC(HDC1);    掃描頻率 : 不知道
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-09 16:33:17 IP:202.39.xxx.xxx 未訂閱
1.Screen.Width/Screen.Height 就是解析度 2.
var
  h: HDC;
  Bits: integer ;
begin
  h := GetDC(0);
  Bits := GetDeviceCaps(h, BITSPIXEL);
  case Bits of
    1: ShowMessage('Monochrome');
    4: ShowMessage('16 color');
    8: ShowMessage('256 color');
   16: ShowMessage('16-bit color');
   24: ShowMessage('24-bit color');
  end ;
  ReleaseDC(0, h);
end;
--- 每個人都是一本書
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-09 16:51:50 IP:218.16.xxx.xxx 未訂閱
補充一下 : 我忘了在那裡看見較舊的顯示卡顯示 16 bit 時 Bits := GetDeviceCaps(h, BITSPIXEL); 會出錯,所以要先 if GetDeviceCaps(Hdc1, PLANES) = 4 then Bit := 16 不過現在舊顯示卡應越來越少了罷
saam
初階會員


發表:61
回覆:75
積分:27
註冊:2003-03-03

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-05-10 13:55:34 IP:203.79.xxx.xxx 未訂閱
感謝二位前輩的熱心指導: 在下是想在改變電腦的解析度,顏色深度和掃描頻率前先 顯示目前的狀態,如果我只要改變解析度和顏色深度,不 改變掃描頻率是否可以做到呢?我有看過幾位前輩的文章 ,好像必須三者一起改才行,這樣的話可能會改掉原有的設定.
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-05-10 14:16:18 IP:218.16.xxx.xxx 未訂閱
你是打算用 EnumDisplaySettings 取得合用的 DEVMODE 然後用 ChangeDisplaySettings 來改變解拆度嗎 ? 若是的話,其實跟本就不是你的程式主動設定甚麼,而是被動的檢查 EnumDisplaySettings 傳過來的然後決定要不要。雖然較被動,但卻安全因為傳過來的都是系統支援的。 由於低解像度支援的 Refresh Rate 高解像度未必支援,所以一般來說都是接受附合其他條件的第一個回傳值的,而那一般會是該解像度的預設值。 一點貼示 : 你可用 ChangeDisplaySettings(PDeviceMode(Nil)^,0) 快速地回來原來的設定。 發表人 - Justmade 於 2003/05/10 14:43:51
gg3166@163.com
一般會員


發表:0
回覆:1
積分:0
註冊:2003-05-05

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-05-12 09:12:37 IP:61.55.xxx.xxx 未訂閱
我在写一个程序的时候,用的是这样的方法:被动适应,首先取出原来的分辨率,刷新率,色深,保存在一个矩形变量里面,还原时候用: 其他我不说了。有人回答了。 下面是刷新率: var DeviceMode:tdevicemode; begin EnumDisplaySettings(nil, Cardinal(-1), DeviceMode); seting.Left:=getsystemmetrics(sm_cxscreen); seting.Right:=getsystemmetrics(sm_cyscreen); seting.Top := DeviceMode.dmDisplayFrequency; if not resolution(1024,768,75) then exit; end; -------------------------------------- Resolution(X, Y,z: word): boolean; var DevMode:TDeviceMode; begin Result:=EnumDisplaySettings(nil,0,DevMode); if Result then begin DevMode.dmFields:=DM_PELSWIDTH Or DM_PELSHEIGHT or dm_displayfrequency; DevMode.dmPelsWidth:=X; DevMode.dmPelsHeight:=Y; devmode.dmDisplayFrequency :=z; Result:=ChangeDisplaySettings(DevMode,0)=DISP_CHANGE_SUCCESSFUL; end;
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-05-12 10:22:01 IP:218.16.xxx.xxx 未訂閱
引言: EnumDisplaySettings(nil, Cardinal(-1), DeviceMode);
Help 中說第二個參數是由 0 開始的,全沒提出可用 -1 iModeNum Index value that specifies the graphics mode for which information is to be obtained. Graphics mode indexes start at zero. To obtain information for all of a display device's graphics modes, make a series of calls to EnumDisplaySettings, as follows: Set iModeNum to zero for the first call, and increment iModeNum by one for each subsequent call. Continue calling the function until the return value is FALSE. When you call EnumDisplaySettings with iModeNum set to zero, the operating system initializes and caches information about the display device. When you call EnumDisplaySettings with iModeNum set to a non-zero value, the function returns the information that was cached the last time the function was called with iModeNum set to zero. 但實質測試真的可以用 - 1 來取得現在的參數 又學到一招秘招了 但你沒有遂個檢對 EnumDisplaySetting 的回傳值而直接修改內容去 ChangeDisplaySetting, 是不大安全的,因為你設定的有可能是顯示卡不支援的。大多數顯示卡是會拒絕轉換,但有些較舊的顯示卡會在轉換後使畫面死掉,使用者必須在安全模式將之轉回後才能用。
saam
初階會員


發表:61
回覆:75
積分:27
註冊:2003-03-03

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-05-14 12:43:34 IP:211.75.xxx.xxx 未訂閱
感謝三位先進指導~解決我的困難~
x803198
一般會員


發表:8
回覆:28
積分:17
註冊:2002-12-06

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-05-23 02:25:00 IP:218.166.xxx.xxx 未訂閱
雖然你已經找到答案了 這是我以前寫的,希望能大家方便 Type TDevmode = record DW : DWORD; DH : DWORD; DV : DWORD; DBit : DWORD; end; // 檢查我要的w,h,bit function CheckDeviceMode(w,h,bit:Integer):Boolean; Var i : Integer; DevMode : TDeviceMode; begin i:=0; Result := False; while EnumDisplaySettings(nil,i,DevMode) do if (DevMode.dmPelsWidth = w) and (DevMode.dmPelsHeight = h) and (DevMode.dmBitsperPel = bit) then begin Result := True; Exit; end else inc(i); end; // 取得目前的 w ,h ,bit ,更新頻率 function GetDeviceMode(Hd:Hwnd):TDevmode; Var dc : Cardinal; begin dc := GetWindowDC(Hd); with Result do begin DW := GetDeviceCaps(dc, HORZRES); DH := GetDeviceCaps(dc, VERTRES); DV := GetDeviceCaps(dc, VREFRESH); DBit := GetDeviceCaps(dc, BITSPIXEL); end; ReleaseDC(Hd, dc); end; // 設定我要的 w ,h ,bit ,更新頻率 function SetDeviceMode(Dev:TDevmode):Boolean; Var i : Integer; DevMode : TDeviceMode; begin i := 0; Result := False; while EnumDisplaySettings(nil,i,DevMode) do if (DevMode.dmPelsWidth = Dev.DW) and (DevMode.dmPelsHeight = Dev.DH) and (DevMode.dmDisplayFrequency = Dev.DV) and (DevMode.dmBitsperPel = Dev.DBit) then begin ChangeDisplaySettings(DevMode,0); Result := True; Exit; end else inc(i); end; 程式是一條不歸路
saam
初階會員


發表:61
回覆:75
積分:27
註冊:2003-03-03

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-05-23 14:40:43 IP:211.75.xxx.xxx 未訂閱
非常謝謝x803198大大~
系統時間:2024-05-17 1:27:16
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!