Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.03;
Скачать: CL | DM;

Вниз

принудительно перерисовать форму   Найти похожие ветки 

 
koks ©   (2003-06-20 10:28) [0]

Уважаемые знатоки !
Как принудительно заставит главную форму в MDI-приложении полностью перерисоваться. (я меняю ее обои).
Пробовал - Update, Repaint, Refresh, Invalidat.... не то - перерисовывается только "занятая" область формы. А мне надо, чтобы она вся перерисовалась.

Заранее спасибо.


 
ggsoft ©   (2003-06-20 12:25) [1]

А встречный вопрос, как ты на нее обои клеишь?
Не через TImage(Align=alClient), на MDIForm.

Если нет, надеюсь, тогда: SendMessage(ClientHandle, WM_ERASEBKGND, 0, 0);


 
koks ©   (2003-06-20 13:02) [2]

нет, я делаю так:

procedure TfmMain.ClientWndProc(var Message: TMessage);
var
Dc: hDc;
Row: integer;
Col: integer;
begin
with Message do
if (Msg = WM_ERASEBKGND) then
begin
Dc := TWMEraseBkGnd(Message).Dc;
for Row := 0 to ClientHeight div imBackground.Picture.Height do
for Col :=0 to ClientWidth div imBackground.Picture.Width do
BitBlt(Dc, Col * imBackground.Picture.Width,
Row * imBackground.Picture.Height,
imBackground.Picture.Width,
imBackground.Picture.Height,
imBackground.Picture.Bitmap.Canvas.Handle,
0, 0, SRCCOPY);
Result := 1;
end
else
Result := CallWindowProc(FPrevClientProc, ClientHandle, Msg, wParam, lParam);
end;

Вызвал SendMessage(fmMain.ClientHandle, WM_ERASEBKGND, 0, 0);
Рузультат - тот же. Может вся фишка в том, что вызов этой функции производится из диалогового окна (не fmMain). причем оно на этот момент модальное...



 
ggsoft ©   (2003-06-20 13:42) [3]

Я так понимаю, что, по-твоему коду, легче бы это изменить на:

procedure TfmMain.ClientWndProc(var Message: TMessage);
var
hdcClient: HDC;
hbrOld: HBRUSH;
begin
case Message.Msg of
WM_ERASEBKGND: begin
hdcClient := GetDC(ClientHandle);
hbrOld := SelectObject(hdcClient, CreatePatternBrush(imBackground.Picture.Bitmap.Handle));
FillRect(hdcClient, ClientRect, 0);
DeleteObject(SelectObject(hdcClient, hbrOld));
Result := 1;
end;
else
Result := CallWindowProc(FPrevClientProc, ClientHandle, Msg, wParam, lParam);
end;
end;

Ведь, судя по-всему, ты "замостить" хочешь ClientHandle, пусть Win сама рассчитывает...
Да и потом, в вызове SendMessage(fmMain.ClientHandle, WM_ERASEBKGND, 0, 0); - надо бы в wParam передавать HDC (GetDC(ClientHandle)), так как ты пишешь:

>Dc := TWMEraseBkGnd(Message).Dc;


попробовал и так и эдак, работает и из диалогового окна тоже...


 
koks ©   (2003-06-20 14:53) [4]

Огромное спасиба..



Страницы: 1 вся ветка

Текущий архив: 2003.07.03;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.013 c
14-7605
_Alex_
2003-06-15 14:47
2003.07.03
Карта 2000, ГИС Панорама, проблемы


9-7279
Axis_of_Evil
2003-01-20 13:42
2003.07.03
UnDelphiX


14-7679
Pat
2003-06-17 01:08
2003.07.03
Система уравнений. Маткад


7-7729
mobilzero
2003-04-21 11:02
2003.07.03
Как научить программу на АСМ работать под виндами?


1-7449
Mishenka
2003-06-23 16:29
2003.07.03
Как в TreeView определить над каким узлом находжится курсор мыши?