Главная страница
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
3-7305
Fantasy
2003-06-09 05:06
2003.07.03
Пример простого лукап поля


1-7444
Борис К.
2003-06-23 14:51
2003.07.03
Форма тормозит... :(


3-7289
Stelius
2003-06-07 22:54
2003.07.03
По поводу сортировки


6-7574
GTS
2003-04-28 13:31
2003.07.03
webbrowser


1-7416
Yurique
2003-06-23 09:31
2003.07.03
Фокус ввода в TListBox