При использовании интерфейса MDI иногда необходимо отобразить некоторые графические изображения или обложки программного обеспечения в окне клиента MDI, чтобы интерфейс программного обеспечения не казался пустым и функции программного обеспечения были понятны с первого взгляда. Однако эти интерфейсы не предусмотрены напрямую в Delphi. Любые графические элементы управления, помещенные в форму MDI, не могут отображаться во время выполнения. Поэтому форму MDI необходимо изменить.
Заявление:
Это решение предназначено только для форм MDI. Если его применить к формам без MDI, последствия сложно сказать. Попробуйте сами.
Помните, что для свойства FormStyle формы должно быть установлено значение: fsMDIForm.
Решение:
1. Сообщение окна клиента MDI (Message) не может быть получено в основной форме MDI. Поэтому необходимо настроить процесс обработки окна клиента (Window PROcedure) и взять на себя управление окном клиента MDI (необходимо реализовать в перегруженном CreateWnd). процесс ):
процедура TMDIForm.CreateWnd;
начинать
унаследованный;
FNewWndProc := MakeObjectInstance(ClientWndProc);
FOldWndProc := Pointer(GetWindowLong(ClientHandle, GWL_WNDPROC));
SetWindowLong(ClientHandle, GWL_WNDPROC, Longint(FNewWndProc));
конец;
Среди них ClientWndProc — это пользовательская оконная процедура: процедура ClientWndProc(var Message: TMessage);
FOldWndProc используется для хранения указателя старой оконной процедуры.
2. Внедрите собственный процесс окна клиента:
процедура TMDIForm.ClientWndProc(var Сообщение: TMessage);
вар
Р: ТРЕКТ;
процедура по умолчанию;
начинать
с сообщением сделать
Результат: = CallWindowProc(FOldWndProc, ClientHandle, Msg, wParam, lParam);
конец;
вар
PS: TPaintStruct;
начинать
Р := КлиентРект;
дело Сообщение.Сообщение о
WM_PAINT:
начинать
BeginPaint(ClientHandle,PS);
пытаться
Холст.Блокировка;
пытаться
Canvas.Handle := PS.hdc;
пытаться
Краска;
если ControlCount > 0, то
PaintControls(PS.hdc,Controls[0]);
окончательно
Холст.Хэндл:= 0;
конец;
окончательно
Холст.Разблокировать;
конец;
окончательно
EndPaint(ClientHandle,PS);
конец;
конец;
WM_ERASEBKGND:
начинать
DrawBG(TWMEraseBkGnd(Сообщение).DC);
Сообщение.Результат:= 1;
конец;
WM_VSCROLL,WM_HSCROLL:
начинать
InvalidateRect(ClientHandle,@R,true);
По умолчанию;
конец;
WM_SIZE:
начинать
InvalidateRect(ClientHandle,@R,true);
По умолчанию;
конец;
еще
По умолчанию;
конец;
конец;
DrawBG выше используется для рисования фона окна.
3. Реализуйте фон окна.
Чтобы преемники могли определить свое собственное происхождение, этот процесс описывается как виртуальный:
защищенный
процедура DrawBG(DC:HDC виртуальная);
Здесь процесс DrawBG просто заполняет фон окна:
процедура TMDIForm.DrawBG(DC: HDC);
начинать
если Brush.Color <> clNone, тогда
FillRect(DC, ClientRect, Brush.Handle);
конец;
4. Вкратце, определение класса TMDIFrom выглядит следующим образом:
ТМДИФорм = класс (ТФорм)
частный
Фолдвндпрок: Тфарпрок;
ФНьюВндПрок: ТФарПрок;
процедура ClientWndProc (вар Сообщение: TMessage);
защищенный
процедура DrawBG(DC: HDC);виртуальная;
переопределение процедуры CreateWnd;
конец;
5. После вышеуказанного преобразования вы можете нарисовать указанный фон в DrawBG (необходимо напрямую вызвать графический интерфейс Windows), или напрямую использовать графические элементы управления, или реализовать событие OnPaint формы, и окно MDI будет цветным из теперь дальше.