Главная страница
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.021 c
4-7761
tytus
2003-04-28 23:57
2003.07.03
wm_


1-7530
Ilg
2003-06-21 12:34
2003.07.03
TWinControl и наследование


14-7616
stupid
2003-06-14 16:29
2003.07.03
Linux - альтернатива или нет?


1-7403
Checist [root]
2003-06-22 20:12
2003.07.03
Открытие файла


1-7518
K_ostya
2003-06-21 20:38
2003.07.03
Screenshot