Бутони в системното меню
Трябва да деактивирам всички бутони в системното меню. Следният код деактивира само бутона „Затвори“. Защо? А как да деактивирам останалите бутони?
procedure TMainForm.FormCreate(Sender: TObject); var hMenu: THandle; begin hMenu := GetSystemMenu(Handle, False); EnableMenuItem(hMenu, SC_MINIMIZE, MF_GRAYED); EnableMenuItem(hMenu, SC_MAXIMIZE, MF_GRAYED); EnableMenuItem(hMenu, SC_CLOSE, MF_GRAYED); край;
> И как да деактивирате други бутони? >формулярът има свойство BorderIcons
Не, BorderIcons не е подходящ. Например не можете да използвате BorderIcons, за да настроите менюто така, че само един бутон „Затвори“ да се вижда в затъмнено (MF_GRAYED) състояние.
> че само един бутон "Затвори" ще се вижда в затъмнения > състояние (MF_GRAYED).защо имате нужда от бутон, който така или иначе не работи?
> кодът деактивира само бутона "Затвори". Защо? И като > деактивиране на други бутони? http://groups.google.com/group/borland.public.delphi.winapi/msg/186a95701207b5b4
> http://groups.google.com/group/borland.public.delphi.winapi/msg/186a95701207b5b4 >Не е ясно какви са изкуствените "системни ограничения" за бутоните за минимизиране и максимизиране на прозореца. И за затваряне изглежда по-важен бутон - няма ограничения. Мисля, че това е очевиден бъг.
> Не е ясно какви точно изкуствени "системни ограничения" > за бутони за минимизиране и увеличаване на прозореца. И за близо изглеждаше > ще има по-важен бутон - няма ограничения. Мисля, че е > очевиден бъг. Ограниченията, IMHO, важат не само за споменатите бутони, само малко се знае за него, защото не е документиран. В Delphi в такива случаи те просто изтриватненужни предмети.
> Как Borland-sheep успяха да направят това, защото Delphi - > красива обвивка на WinAPI? Ако изберете един biMaximize, той ще бъде подобен. Не е в borland, те правят същото (Forms.pas): procedure TCustomForm.WMNCCreate(var Message: TWMNCCreate);
Очевидно MS смята, че ако тези функции не са необходими, тогава те нямат място в системното меню.
> Нищо не разбрах. Можете ли да ми кажете повече? Е, какво неразбираемо казах току-що?
процедура TForm1.CreateParams(var Params: TCreateParams); // override; begin inherited; Params.Style := Params.Style, а не WS_MINIMIZEBOX и не WS_MAXIMIZEBOX; end;
Това означава, че системното меню се конфигурира при създаване на прозорец с помощта на функциите CreateWindow, CreateWindowEx. И след това върху него поне няколко драскотини, EnableMenuItem може да промени само състоянието на SC_CLOSE. Правилно ли съм разбрала? :)
> Това означава, че системното меню се конфигурира, когато прозорецът е създаден с > CreateWindow, CreateWindowEx. И тогава има поне някои драскотини по него. Приложението може да извърши своя собствена проверка или оцветяване, като отговори на съобщението WM_INITMENU, което се изпраща, преди да се покаже което и да е меню.
Всъщност в манипулатора WM_INITMENU можете да зададете макси/минимизиране, но състоянието на бутоните няма да се промени.