Главная страница
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.024 c
1-7435
RDA
2003-06-22 12:25
2003.07.03
Подсветка компонента имеющего фокус ввода


14-7651
Дмитрий Белькевич
2003-06-15 21:17
2003.07.03
MPL 1.1 - шо за зверь?


3-7297
pathfinder
2003-06-07 14:59
2003.07.03
Вопрос об индексе...


4-7757
STAINER
2003-05-02 01:42
2003.07.03
НЕ МОГУ СОЗДАТЬ COM-ОБЬЕКТ ЧЕРЕЗ CREATECOMOBJECT


1-7484
Evil_forever
2003-06-19 23:52
2003.07.03
---|Ветка была без названия|---