Key := 0;
end;
end;
{ Disable close button }
procedureTForm1.Button1Click(Sender: TObject);
varSysMenu: HMenu;
begin
SysMenu := GetSystemMenu(Handle, False);
Windows.EnableMenuItem(SysMenu, SC_CLOSE, MF_DISABLED orMF_GRAYED);
end;
{ Enable close button }
procedureTForm1.Button2Click(Sender: TObject);
begin
GetSystemMenu(Handle, True);
Perform(WM_NCPAINT, Handle, 0);
end;
Но это окно можно закрыть из TaskBar'а.
Как бы это осуществить рисование в окне без его дурацкого мерцания и без помощи создания виртуального изображения в памяти? WM_SETREDRAW здесь поможет?
Попробуйте этот код. Даже если некоторые компоненты имеют пару BeginUpdate / EndUpdate, то для таких компонентов, как TTreeView, интенсивное рисование может послужить причиной перемещения полосы прокрутки и появления других «барабашек». В таких ситуаций вместо дескриптора элемента управления используйте родительский дескриптор.
procedureBeginScreenUpdate(hwnd : THandle);
begin
if(hwnd = 0) thenhwnd := Application.MainForm.Handle;
SendMessage(hwnd, WM_SETREDRAW, 0, 0);
end;
procedureEndScreenUpdate(hwnd : THandle; erase : Boolean);
begin
if(hwnd = 0) thenhwnd := Application.MainForm.Handle;
SendMessage(hwnd, WM_SETREDRAW, 1, 0);
RedrawWindow(hwnd, nil, 0, DW_FRAME + RDW_INVALIDATE + RDW_ALLCHILDREN + RDW_NOINTERNALPAINT);
if(erase) thenWindows.InvalidateRect(hwnd, nil, True);
end;
– Jeff Johnson
Минимизация модального окна
Мне нужно открыть из моей формы модальное окно, т.е. приостановить работу в моей форме до обработки этого модального окна. Но при этом я теряю возможность убрать (минимизировать) мою форму
Nomadicсоветует:
functionTMyForm.Execute: TModalResult;
begin
Show;
try
SendMessage(Handle, CM_ACTIVATE, 0, 0);
ModalResult := 0;
repeat
Application.HandleMessage;
ifApplication.Terminated thenModalResult := mrCancel;
ifModalResult = mrCancel thenCloseModal;
untilModalResult <> 0;
Hide;
Result := ModalResult;
SendMessage(Handle, CM_DEACTIVATE, 0, 0);
finally
Hide;
end;
end;
Конечно, в TMyForm должно быть FormStyle := fsStayOnTop;
Dmitry V. Koreybaсоветует:
Высылаю прогу которая делает прозрачной форму. Может кому-нибудь поможет в его дизайнерских изысканиях.
var FullRgn, ClientRgn, CtlRgn : THandle;
procedureTForm1.DoInvisible;
var
AControl : TControl;
A, Margin, X, Y, CtlX, CtlY : Integer;
begin
Margin := (Width - ClientWidth) div2;
FullRgn := CreateRectRgn(0, 0, Width, Height);
X := Margin;
Y := Height - ClientHeight - Margin;
ClientRgn := CreateRectRgn(X, Y, X + ClientWidth, Y + ClientHeight);
CombineRgn(FullRgn, FullRgn, ClientRgn, RGN_DIFF);
forA := 0 toControlCount - 1 do begin
AControl := Controls[A];
if(AControl isTWinControl) or(AControl isTGraphicControl) then
withAControl do begin
ifVisible then begin
CtlX := X + Left;
CtlY := Y + Top;
CtlRgn := CreateRectRgn(CtlX, CtlY, CtlX + Width, CtlY + Height);
CombineRgn(FullRgn, FullRgn, CtlRgn, RGN_OR);
end;
end;
end;
SetWindowRgn(Handle, FullRgn, TRUE);
end;
procedureTForm1.FormDestroy(Sender: TObject);
begin
DeleteObject(ClientRgn);DeleteObject(FullRgn);
DeleteObject(CtlRgn);
end;
procedureTForm1.DoVisible;
begin
FullRgn := CreateRectRgn(0, 0, Width, Height);
CombineRgn(FullRgn, FullRgn, FullRgn, RGN_COPY);
SetWindowRgn(Handle, FullRgn, TRUE);
end;
procedureTForm1.FormCreate(Sender: TObject);
begin
DoInvisible;
end;
Каким образом можно изменить системное меню формы?
Nomadicсоветует:
Hе знаю как насчет акселераторов,надо поискать, а вот добавить пункт меню(Item) — пожалуйста
typeTMyForm= class(TForm)
procedurewmSysCommand( var Message:TMessage); messageWM_SYSCOMMAND;
end;
const
ID_ABOUT = WM_USER+1;
ID_CALENDAR=WM_USER+2;
ID_EDIT = WM_USER+3;
ID_ANALIS = WM_USER+4;
implementation
procedureTMyForm.wmSysCommand;
begin
caseMessage.wParam of
ID_CALENDAR:DatBitBtnClick(Self);
Читать дальше