Форум: "Основная";
Текущий архив: 2003.07.03;
Скачать: [xml.tar.bz2];
Внизпринудительно перерисовать форму Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.308 c