Ĺadny brzuch
Witam wszystkich!
Dawno tutaj nie zaglądałem, a w tej chwili potrzebuje porady.
A więc do rzeczy:
Jak mogę sprawdzić jaką user w tej chwili używa rozdzielczość, gdy używa innej niż 800x600 to wyświetli komunikat - propozycję zmiany rozdzielczości, po zatwierdzeniu na TAK, program automatycznie zmienia rozdzielczość na 800x600 a gdy NIE, to poprostu zamyka komunikat bez żadnych zmian.
Zależy mi na tym żeby działało na wszystkich systemach z rodziny Windows ;)
W sieci jest pełno kodów do zmiany rozdzielczości, więc napewno któryś wykorzystam, tylko jak sprawdzić i zaproponować zmianę rozdzielczości?
Pardzo proszę o pomoc... z góry dziękuje...
pobieranie : screen.width , screen.height
ustawianie: http://forum.ks-eksp...showtopic=75092
Było
http://forum.ks-eksp. ..displaysettings
Kod dla Twojego programu:var d:devmode; begin EnumDisplaySettings(nil,$FFFFFFFF,d); if (d.dmPelsWidth<>800)and(d.dmPelsHeight<>600) then if MessageBox(Handle,'Czy chcesz zmienić rozdzielczość do 800x600?','?',MB_YESNO+MB_ICONQUESTION)=id_yes then begin d.dmPelsWidth:=800; d.dmPelsHeight:=600; ChangeDisplaySettings(d,CDS_UPDATEREGISTRY); end; end;powinno działać :P
Dziękuje bardzo... Wszystko działa poprawnie, dodałem jescze małą opcję przy zamykaniu pyta czy powrócić do poprzedniej rozdzielczości mam taki kodzik:
w CloseQuery Formy:
begin if opcja='tak' then begin CanClose:=false; EnumDisplaySettings(nil,$FFFFFFFF,d); if MessageBox(Handle,'Rozdzielczość została zmieniona. Czy chcesz powrócić do poprzedniej rozdzielczości?','?',MB_YESNO+MB_ICONQUESTION)=id_yes then begin end; d.dmPelsWidth:=width; d.dmPelsHeight:=height; ChangeDisplaySettings(d,CDS_UPDATEREGISTRY); end else CanClose:=true; end;
niestety ale nie zmienia mi spowrotem rozdzielczości. width i height są pobierane przy włączeniu programu by potem zmienił na poprzednie ustawienia.
Co jest nie tak jak trzeba?
Użytkownik AdSoft edytował ten post 26 marzec 2006, 16:21
if MessageBox(Handle,'Rozdzielczość została zmieniona. Czy chcesz powrócić do poprzedniej rozdzielczości?','?',MB_YESNO+MB_ICONQUESTION)=id_yes then begin
end;
I co tam pomiędzy begin i end się wykonuje ?? Ten kod się kompiluje ??
A niepowinno być tak ;)
if opcja='tak' then begin CanClose:=false; EnumDisplaySettings(nil,$FFFFFFFF,d); if MessageBox(Handle,'Rozdzielczość została zmieniona. Czy chcesz powrócić do poprzedniej rozdzielczości?','?',MB_YESNO+MB_ICONQUESTION)=id_yes then begin d.dmPelsWidth:=width; d.dmPelsHeight:=height; ChangeDisplaySettings(d,CDS_UPDATEREGISTRY); end; end else CanClose:=true;
A wiecie jak zrobić, żeby zmienić rozdzielczość w Windows XP i żeby się odświeżanie nie zmieniło oraz nie rozwaliło się ułożenie ikon? Bo jak patrzyłem ten kod:
var d:devmode;
begin
EnumDisplaySettings(nil,$FFFFFFFF,d);
if (d.dmPelsWidth<>640)and(d.dmPelsHeight<>480) then
if MessageBox(Handle,'Czy chcesz zmienić rozdzielczość do 640x480?','?',MB_YESNO+MB_ICONQUESTION)=id_yes then begin
d.dmPelsWidth:=640;
d.dmPelsHeight:=480;
ChangeDisplaySettings(d,CDS_UPDATEREGISTRY);
end;
end;
to mi ikony poprzestawiało! A to jest bardzo denerwujące :>.
Ja zwykle używam takiego sposobu:
var Mode: TDeviceMode;
procedure Resol(rx,ry: integer); begin
with Mode do begin
dmSize:=SizeOf(Mode);
// dmBitsPerPel:=16; // głębia - bity
dmPelsWidth:=rx; dmPelsHeight:=ry;
dmFields:=DM_PELSWIDTH+DM_PELSHEIGHT;
end;
ChangeDisplaySettings(Mode,0);
end;
Wszystko jest ok, nie przestawia ikon, ale jest problem z odświeżaniem, ustawia je na 60Hz :(
Jakby ktoś z was miał pomysł jak zrobić żeby nie zmieniał odświeżania to bardzo proszę o pomoc.
Użytkownik Demon64 edytował ten post 14 kwiecień 2007, 13:13
Używaj poprawnego formatowania BBCode :P
TDeviceMode.dmDisplayFrequency := GetDeviceCaps(Form1.Canvas.Handle, VREFRESH);
Odczytasz się z tego, prawda? :)
Przed chwilką sam rozwiązałem ten problem :D
Najpierw pobieram aktualne odświeżanie do zmiennej Refresh i rozdzielczość do Ekran:
var Refresha: integer; // odświeżanie
Ekran: TPoint; // rozdzielczość
EnumDisplaySettings(nil,$FFFFFFFF,Mode2);
Refresha:=Mode2.dmDisplayFrequency;
Ekran.X:=Screen.Width;
Ekran.Y:=Screen.Height;
Potem wywołuje tą funkcję: Resol2(640,480);
procedure Resol2(rx,ry: integer); begin
EnumDisplaySettings(nil,$FFFFFFFF,Mode2);
with Mode2 do begin
dmSize:=SizeOf(Mode2); dmBitsPerPel:=32;
dmPelsWidth:=rx; dmPelsHeight:=ry;
dmDisplayFrequency:=Refresha;
dmFields:=DM_PELSWIDTH+DM_PELSHEIGHT+DM_DISPLAYFREQUENCY;
end;
ChangeDisplaySettings(Mode2,0);
end;
No i wszystko jest w pożądalu :P hehe
A jak chcę przywrócić poprzednią rozdzielkę to: Resol2(Ekran.X,Ekran.Y);
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Dawno tutaj nie zaglądałem, a w tej chwili potrzebuje porady.
A więc do rzeczy:
Jak mogę sprawdzić jaką user w tej chwili używa rozdzielczość, gdy używa innej niż 800x600 to wyświetli komunikat - propozycję zmiany rozdzielczości, po zatwierdzeniu na TAK, program automatycznie zmienia rozdzielczość na 800x600 a gdy NIE, to poprostu zamyka komunikat bez żadnych zmian.
Zależy mi na tym żeby działało na wszystkich systemach z rodziny Windows ;)
W sieci jest pełno kodów do zmiany rozdzielczości, więc napewno któryś wykorzystam, tylko jak sprawdzić i zaproponować zmianę rozdzielczości?
Pardzo proszę o pomoc... z góry dziękuje...
pobieranie : screen.width , screen.height
ustawianie: http://forum.ks-eksp...showtopic=75092
Było
http://forum.ks-eksp. ..displaysettings
Kod dla Twojego programu:var d:devmode; begin EnumDisplaySettings(nil,$FFFFFFFF,d); if (d.dmPelsWidth<>800)and(d.dmPelsHeight<>600) then if MessageBox(Handle,'Czy chcesz zmienić rozdzielczość do 800x600?','?',MB_YESNO+MB_ICONQUESTION)=id_yes then begin d.dmPelsWidth:=800; d.dmPelsHeight:=600; ChangeDisplaySettings(d,CDS_UPDATEREGISTRY); end; end;powinno działać :P
Dziękuje bardzo... Wszystko działa poprawnie, dodałem jescze małą opcję przy zamykaniu pyta czy powrócić do poprzedniej rozdzielczości mam taki kodzik:
w CloseQuery Formy:
begin if opcja='tak' then begin CanClose:=false; EnumDisplaySettings(nil,$FFFFFFFF,d); if MessageBox(Handle,'Rozdzielczość została zmieniona. Czy chcesz powrócić do poprzedniej rozdzielczości?','?',MB_YESNO+MB_ICONQUESTION)=id_yes then begin end; d.dmPelsWidth:=width; d.dmPelsHeight:=height; ChangeDisplaySettings(d,CDS_UPDATEREGISTRY); end else CanClose:=true; end;
niestety ale nie zmienia mi spowrotem rozdzielczości. width i height są pobierane przy włączeniu programu by potem zmienił na poprzednie ustawienia.
Co jest nie tak jak trzeba?
Użytkownik AdSoft edytował ten post 26 marzec 2006, 16:21
if MessageBox(Handle,'Rozdzielczość została zmieniona. Czy chcesz powrócić do poprzedniej rozdzielczości?','?',MB_YESNO+MB_ICONQUESTION)=id_yes then begin
end;
I co tam pomiędzy begin i end się wykonuje ?? Ten kod się kompiluje ??
A niepowinno być tak ;)
if opcja='tak' then begin CanClose:=false; EnumDisplaySettings(nil,$FFFFFFFF,d); if MessageBox(Handle,'Rozdzielczość została zmieniona. Czy chcesz powrócić do poprzedniej rozdzielczości?','?',MB_YESNO+MB_ICONQUESTION)=id_yes then begin d.dmPelsWidth:=width; d.dmPelsHeight:=height; ChangeDisplaySettings(d,CDS_UPDATEREGISTRY); end; end else CanClose:=true;
A wiecie jak zrobić, żeby zmienić rozdzielczość w Windows XP i żeby się odświeżanie nie zmieniło oraz nie rozwaliło się ułożenie ikon? Bo jak patrzyłem ten kod:
var d:devmode;
begin
EnumDisplaySettings(nil,$FFFFFFFF,d);
if (d.dmPelsWidth<>640)and(d.dmPelsHeight<>480) then
if MessageBox(Handle,'Czy chcesz zmienić rozdzielczość do 640x480?','?',MB_YESNO+MB_ICONQUESTION)=id_yes then begin
d.dmPelsWidth:=640;
d.dmPelsHeight:=480;
ChangeDisplaySettings(d,CDS_UPDATEREGISTRY);
end;
end;
to mi ikony poprzestawiało! A to jest bardzo denerwujące :>.
Ja zwykle używam takiego sposobu:
var Mode: TDeviceMode;
procedure Resol(rx,ry: integer); begin
with Mode do begin
dmSize:=SizeOf(Mode);
// dmBitsPerPel:=16; // głębia - bity
dmPelsWidth:=rx; dmPelsHeight:=ry;
dmFields:=DM_PELSWIDTH+DM_PELSHEIGHT;
end;
ChangeDisplaySettings(Mode,0);
end;
Wszystko jest ok, nie przestawia ikon, ale jest problem z odświeżaniem, ustawia je na 60Hz :(
Jakby ktoś z was miał pomysł jak zrobić żeby nie zmieniał odświeżania to bardzo proszę o pomoc.
Użytkownik Demon64 edytował ten post 14 kwiecień 2007, 13:13
Używaj poprawnego formatowania BBCode :P
TDeviceMode.dmDisplayFrequency := GetDeviceCaps(Form1.Canvas.Handle, VREFRESH);
Odczytasz się z tego, prawda? :)
Przed chwilką sam rozwiązałem ten problem :D
Najpierw pobieram aktualne odświeżanie do zmiennej Refresh i rozdzielczość do Ekran:
var Refresha: integer; // odświeżanie
Ekran: TPoint; // rozdzielczość
EnumDisplaySettings(nil,$FFFFFFFF,Mode2);
Refresha:=Mode2.dmDisplayFrequency;
Ekran.X:=Screen.Width;
Ekran.Y:=Screen.Height;
Potem wywołuje tą funkcję: Resol2(640,480);
procedure Resol2(rx,ry: integer); begin
EnumDisplaySettings(nil,$FFFFFFFF,Mode2);
with Mode2 do begin
dmSize:=SizeOf(Mode2); dmBitsPerPel:=32;
dmPelsWidth:=rx; dmPelsHeight:=ry;
dmDisplayFrequency:=Refresha;
dmFields:=DM_PELSWIDTH+DM_PELSHEIGHT+DM_DISPLAYFREQUENCY;
end;
ChangeDisplaySettings(Mode2,0);
end;
No i wszystko jest w pożądalu :P hehe
A jak chcę przywrócić poprzednią rozdzielkę to: Resol2(Ekran.X,Ekran.Y);