Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > OnDrawColumnCell


Автор: Delphist 9.1.2007, 12:59
В OnDrawColumnCell  я веду отрисовку грида, при потере фокуса (т.е. на фоне данного окна двигаю окно другой проги) отрисовка перестает работать. Скорее всего не посылается сообщение WM_PAINT. Вопрос: Как заставить прорисовываться грид даже если окно теряет фокус.

Автор: Delphist 10.1.2007, 08:53
См. рисунок там отображен момент когда я двигаю калькулятор на фоне грида

Автор: aktuba 10.1.2007, 09:15
Попробуй в TForm.OnPaint вызвать OnDrawColumnCell

Автор: MetalFan 10.1.2007, 09:26
Цитата(aktuba @  10.1.2007,  09:15 Найти цитируемый пост)
... вызвать OnDrawColumnCell 

или у грида Invalidate или Refresh)

Автор: Delphist 10.1.2007, 10:00
Цитата(aktuba @  10.1.2007,  10:15 Найти цитируемый пост)
Попробуй в TForm.OnPaint вызвать OnDrawColumnCell 

1) OnPaint не вызывается при не активной форме
2)Какие же параметры мне передавать в OnDrawColumnCell.

Автор: aktuba 10.1.2007, 10:04
Цитата

или у грида Invalidate или Refresh)


Цитата

1) OnPaint не вызывается при не активной форме
2)Какие же параметры мне передавать в OnDrawColumnCell. 


1. Значит надо искать какие сообщения приходят форме, когда она неактивна. К сожалению, пока не могу этим заняться...
2. А что за компонент используешь?

Автор: Delphist 10.1.2007, 10:20
Цитата(aktuba @  10.1.2007,  11:04 Найти цитируемый пост)
А что за компонент используешь? 

DBGridEh. 
Вертикальные разделители рисую сам. 

Автор: aktuba 10.1.2007, 10:33
Попробуй так:

Код

type
  TForm1 = class(TForm)
  ...
  FOldProc: TWndMethod;
  procedure MyProc(var Mess: TMessage);
...
procedure TForm1.Create(Sender: TObject);
begin
  FOldProc := Form1.WindowProc;
  Form1.WindowProc := MyProc;
end;
...
procedure TForm1.MyProc(var Mess: TMessage);
begin
  if Mess.Msg = WM_ERASEBKGRD then
    if not Form1.Active then RepaintGrid;
  FoldProc(Mess);
end;


Я не использую DBGridEh, поэтому не знаю, какие там параметры...

Автор: MetalFan 10.1.2007, 10:47
aktuba, а кто будет старый обработчик вызывать?! )

Автор: aktuba 10.1.2007, 10:52
Виноват, в ручную с компа переписывал. На этом нет Delphi, поэтому приходится так поступать.

Уже поправил...

Автор: Delphist 10.1.2007, 11:11
Цитата(aktuba @  10.1.2007,  11:52 Найти цитируемый пост)
Виноват, в ручную с компа переписывал. На этом нет Delphi, поэтому приходится так поступать.

Уже поправил... 

Не помагает твой код. Дело в том что сообщение wm_EraseBkgnd срабатывает только тогда когда я калькулятор перенашу в свободную область формы.

Автор: Delphist 10.1.2007, 11:21
Цитата(aktuba @  10.1.2007,  12:13 Найти цитируемый пост)
Delphist, не понял, как это? 

Очень просто. Если я такскаю калькулятор на фоне грида, то линии затираются. Если я перенесу калькулятор в свободную от компонентов область формы (грид у меня занимает не всю область) то перерисовка произойдет.

Автор: aktuba 10.1.2007, 11:23
Поменяй WM_ERASEBKGRD на WM_PAINT

Автор: Delphist 10.1.2007, 15:48
Цитата(aktuba @  10.1.2007,  12:23 Найти цитируемый пост)
WM_PAINT 

То же самое

Автор: aktuba 10.1.2007, 15:59
Странно, насколько я помню, сообщение WM_PAINT посылается форме всегда, когда необходимо перерисовать форму...
Во-всяком случае, у меня, при создании пробного проекта все срабатывает...

Может у тебя где-то фильтр стоит на активность формы?

Автор: aktuba 10.1.2007, 17:16
Попробуй дебаггером посмотреть, приходит ли сообщение в MyProc и как оно обрабатыватся...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)