COleControl subclassing ListView ctrl: painting problem
=?iso-8859-1?Q?Klaus_G=FCtter?= -- KG@it-gmbh.de
Saturday, December 07, 1996
Environment: VC++ 4.2b, NT 4.0
I have a problem with the painting of a COleControl which subclasses a
ListView ("SysListView32"): the background of the control window is not
erased at all.
E.g. I try to switch to report mode using the following code:
ModifyStyle(LVS_TYPEMASK, LVS_REPORT);
Invalidate();
The result is that the list view is only partly redrawn, rests of the
previous list view mode are left on the screen.
SPYing on the Window I found that no WM_ERASEBKGND message is sent to
the control.
I suspect COleControl::OnPaint (in ctlcore.cpp) to be the culprit.
Instead of calling BeginPaint, it uses a function _AfxFastBeginPaint. As
I understand it, WM_ERASEBKGND is generated by BeginPaint, but the
optimized function _AfxFastBeginPaint essentially just does a GetDC and
ValidateRect.
I currently work around the problem by adding a line
pdc->FillSolidRect(rcBounds, ::GetSysColor(COLOR_WINDOW));
to my control's OnDraw function before calling DoSuperclassPaint.
Is this to be considered a bug in COleControl::OnPaint?
Is there a better workaround?
- Klaus
=?iso-8859-1?Q?Gunnar_=D6rn_Rafnsson?= -- gor@nervus.is
Tuesday, December 10, 1996
Klaus=20
You can override the GetControlFlags function and remove the =
fastBeginPaint from the control flags, then the OleControl will use =
standard methods for erasing the background, that is does not call =
_AfxFastBeginPaint but uses CPaintDC
DWORD CYourListViewSubclassedControl::GetControlFlags()
{
return COleControl::GetControlFlags() &~ fastBeginPaint;
}
Gunnar =D6rn Rafnsson
Taugagreining hf
Armuli 7b Reykjavik Iceland
E-mail : gor@nervus.is
WWW : http://www.nervus.is/gor/
----------
From: Klaus G=FCtter[SMTP:KG@it-gmbh.de]
Sent: 10. desember 1996 11:57
To: 'MFC List'
Subject: COleControl subclassing ListView ctrl: painting problem
Environment: VC++ 4.2b, NT 4.0
I have a problem with the painting of a COleControl which subclasses a
ListView ("SysListView32"): the background of the control window is not
erased at all.
E.g. I try to switch to report mode using the following code:
ModifyStyle(LVS_TYPEMASK, LVS_REPORT);
Invalidate();
The result is that the list view is only partly redrawn, rests of the
previous list view mode are left on the screen.
SPYing on the Window I found that no WM_ERASEBKGND message is sent to
the control.
I suspect COleControl::OnPaint (in ctlcore.cpp) to be the culprit.
Instead of calling BeginPaint, it uses a function _AfxFastBeginPaint. As
I understand it, WM_ERASEBKGND is generated by BeginPaint, but the
optimized function _AfxFastBeginPaint essentially just does a GetDC and
ValidateRect.
I currently work around the problem by adding a line
pdc->FillSolidRect(rcBounds, ::GetSysColor(COLOR_WINDOW));
to my control's OnDraw function before calling DoSuperclassPaint.
Is this to be considered a bug in COleControl::OnPaint?
Is there a better workaround?
- Klaus
| Вернуться в корень Архива
|