Witam szanownych forumowiczów... Mam takie pytanie, w jaki sposób wyłączyć systemowe przyciski okna... Ustawić je na Enabled := False; Zamknij, maksymalizuj i minimalizuj. Kiedyś udało mi się to zrobić, niestety po formatowaniu dysku nic nie zostało z projektów. Może ktoś z Was wie jak to zrobić umieścił bym ten post w Newbe ale nie wiem w jaki sposób to zrobić pozdrawiam ernest123
jak enabled false to nie wiem z głowy, ale visible false to jest kilka sposobów, najprościej wyłączyć w opcjach odpowiednie [BorderIcons]
@ernest123 - najprościej to we właściwości BorderIcons
odepnij te ikony, których mieć nie chcesz; A jeśli chcesz się bawić WinAPI, to możesz skorzystać z funkcji EnableMenuItem
.
dałem tak w buttonie
EnableMenuItem(form1.Menu.Handle,1,0);
wywala Acces Violation ;)
nie chcę odpinać ikon od formy, chcę je wszystkie wyłączyć Enabled := False
, kiedyś mi się udało
`dodanie znaczników i ```
- @furious programming
zrobiłem tak:
procedure TForm1.Button1Click(Sender: TObject);
var
AppMenu: THandle;
i: Integer;
begin
AppMenu := GetSystemMenu(Self.Handle, FALSE);
EnableMenuItem(AppMenu, SC_CLOSE, MF_GRAYED);
end;
i pięknie wyłącza
pytanie brzmi jak wyłączyć pozostałe 2 ikony SC_MINIMIZE nie działa
Tak jak wspomniał @sapero - dla pozostałych przycisków funkcja EnableMenuItem
nie zadziała i trzeba użyć SetWindowLong
; Kiedyś szukałem tego jak zablokować (nie ukryć) pozostałe przyciski i znalazłem właśnie przykłady z EnableMenuItem
i SetWindowLong
; Poniżej przykłady wywołania:
// close disable
EnableMenuItem(GetSystemMenu(Self.Handle, LongBool(False)), SC_CLOSE, MF_BYCOMMAND or MF_GRAYED);
// maximize disable
SetWindowLong(Self.Handle, GWL_STYLE, GetWindowLong(Self.Handle, GWL_STYLE) and not WS_MAXIMIZEBOX);
// maximize enable
SetWindowLong(Self.Handle, GWL_STYLE, GetWindowLong(Self.Handle, GWL_STYLE) or WS_MAXIMIZEBOX);
Podobnie z SC_MINIMIZE
- potestuj sobie.
dzięki za odpowiedzi chłopaki
SetWindowLong(Self.Handle, GWL_STYLE, GetWindowLong(Self.Handle, GWL_STYLE) and not WS_MAXIMIZEBOX);
zadziałało pięknie
pozostała jeszcze ikona minimalizacji na nią to nie działa
SC_MINIMIZE
Ustaw sobie własność BorderStyle
Formatki na bsDialog
i wyszarz kodem przycisk zamykania. A jeżeli chcesz mieć formatkę z ikonką. To wygoogluj sobie disable minimize delphi
. I poczytaj stronę zwróconą jako trzeci wynik. Konkretnie tę: http://www.swissdelphicenter.ch/en/showcode.php?id=1207 - do tego wyszarz "X" jak wcześniej.
A i czy na prawdę nie mogłeś najpierw chwileczkę sam pogooglować, tylko od razu smarować na forum? Wiem, zaraz madmike z partyzanta napisze, że niby marudzę. Ale to niestety smutna prawda. Ludziom tutaj nie chcę się chwilę wcześniej nawet pogooglować. idzie się załamać :/
Olesio, kiedyś byłeś bardziej pomocny, teraz tylko marudzisz, ale najgorsze jest to że w tym przypadku kłania Ci się czytanie ze zrozumieniem.
Kolega nie chce ukryć przycisków tylko je zdezaktywować.
@jsss1: nie wiem czy to ponownie nie ktoś zarejestrowany, ale piszący "z partyzanta". Ale nie będę się teraz bawił w jakieś dochodzenie. I to Ty nie rozumiesz podstaw. System Windows, o ile mi wiadomo, uniemożliwia wyszarzenie minimalizacji oraz maksymalizacji. Takie okno "bez niczego" to jest dialog. A ten domyślnie nie posiada na ogół ikonki. Ale i na to jest sposób (poniżej). Ja tylko chcę aby ludzie przez chwile używali Google i pomyśleli zanim o cokolwiek spytają. Pomóc może im Google od ręki. A pomocny zawsze byłem, jestem i będę w miarę moich możliwości.
A i jeżeli jesteś taki wszystko wiedzący, to zamiast marudzić, że niby ja marudzę. Proszę bardzo, podaj gotowy sposób na to aby wszystko wyszarzyć, a nie ukrywać. Najlepiej w Delphi. Chętnie go poznam i za pewne nie tylko ja. Poniżej według mnie najprostszy sposób na osiągnięcie tego co chce pytający. Znikają przyciski do minimize i maximize, wyszarzamy "X" i ustawiamy ikonkę na tę aplikacji. Oczywiście można w razie konieczności podać Handle do innej ikonki załadowanej na przykład z zasobów lub fizycznego pliku. Więcej informacji na ten temat jest na MSDNie oraz w postaci mnóśtwa przykładów w Google. Na prawdę.
procedure TForm1.FormCreate(Sender : TObject);
begin
Self.BorderStyle := bsDialog;
EnableMenuItem(GetSystemMenu(Self.Handle, False), SC_CLOSE, MF_GRAYED);
SendMessage(Self.Handle, WM_SETICON, 1, Application.Icon.Handle);
end;
@ernest123 - nie wiem w jaki sposób dezaktywować jednocześnie przyciki minimalizacji i maksymalizacji, bez ich ukrywania; Jeżeli spróbujemy je dezaktywować, osobną bądź jednocześnie, np. takim kodem:
var
intWndLong: Integer;
begin
intWndLong := GetWindowLong(Self.Handle, GWL_STYLE);
SetWindowLong(Self.Handle, GWL_STYLE, intWndLong and not WS_MINIMIZEBOX and not WS_MAXIMIZEBOX);
RedrawWindow(Self.Handle, nil, 0, RDW_INVALIDATE or RDW_FRAME or RDW_NOCHILDREN);
end;
to obie ikonki znikną - tym zajmują się wewnętrzne mechanizmy obsługi okien i komunikatów, które nie pozwalają (przynajmniej tak łatwo) na istnienie tych obu przycików zablokowanych; Być może istnieje jakiś sposób na to, jednak ja go nie znam.
googlowałem ale niewiele znalazłem. dzięki za pomoc temat uważam za zamknięty
System nie przewiduje takiej sytuacji. Jeśli oba przyciski są nieaktywne, to automatycznie znikają.
Dlaczego ci to przeszkadza?
Jeśli osiągnąłeś kiedyś sytuację, w której miałeś oba przyciski nieaktywne ale widoczne, to jest duża szansa że to było “undefined behavior”, coś czego się robić nie powinno i co może nie działać w innych wersjach systemu.