Wyłączanie przycisków systemowych

Odpowiedz Nowy wątek
2014-12-29 15:04
0

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

edytowany 1x, ostatnio: ernest123, 2014-12-29 15:14
"niestety po formatowaniu dysku nic nie zostało z projektów" — a ktoś myślał gdy formatował? - Azarien 2014-12-29 17:17

Pozostało 580 znaków

2014-12-29 16:18
jsss1
0

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]

Pozostało 580 znaków

2014-12-29 16:46
2

@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.


Pozostało 580 znaków

2014-12-29 17:50
0

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

edytowany 1x, ostatnio: furious programming, 2014-12-29 20:39

Pozostało 580 znaków

2014-12-29 18:12
0

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

Możesz zmodyfikować style okna funkcją SetWindowLong(hwnd, GWL_STYLE, nowestyle), usuń bity WS_MINIMIZEBOX i WS_MAXIMIZEBOX. Oba przyciski prawdopodobnie znikną. Aktualne style zwraca GetWindowLong z tym samym indeksem. Sposób z EnableMenuItem powinien zadziałać, gdy będzie aktywowany we właściwym miejscu - w obsłudze komunikatu WM_INITMENU{POPUP} Ewentualnie pozostaw te przyciski aktywne, a jedynie zablokuj ich działanie w komunikacie WM_SYSCOMMAND, zwracając zero gdy lParam&0xFFF0 jest równe np. SC_MINIMIZE. - sapero 2014-12-29 18:36
@sapero - odpowiadaj w postach; - furious programming 2014-12-29 20:37

Pozostało 580 znaków

2014-12-29 20:37
0

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.


edytowany 1x, ostatnio: furious programming, 2014-12-29 20:38

Pozostało 580 znaków

2014-12-30 14:54
0

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

edytowany 1x, ostatnio: ernest123, 2014-12-30 14:57

Pozostało 580 znaków

2014-12-30 21:43
0

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ć :/


edytowany 2x, ostatnio: olesio, 2014-12-30 21:50

Pozostało 580 znaków

2014-12-30 22:54
jsss1
0

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ć.

Pozostało 580 znaków

2014-12-31 00:08
0

@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;

edytowany 2x, ostatnio: olesio, 2014-12-31 00:10

Pozostało 580 znaków

2014-12-31 00:49
0

@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.


Może jsss1 Tobie poda. Ja też się chętnie dowiem, bo widzę że On pierwszy do pomocy. - olesio 2014-12-31 01:50
No ja myślę, bo także chętnie poznałbym rozwiązanie; - furious programming 2014-12-31 01:54

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0