Drawing a 3D Push Button
Mike Bryga -- MBryga@PickSys.com
Thursday, January 23, 1997
Environment: MSVC 4.0, Win 95/NT 4.0
I've subclassed a Button of the Push Button personality control using =
AppWizard and am having difficulty getting it to look like Microsoft's =
Push Button in VB4.0a.
Microsoft's Push Button appears to ignore the Appearance property both =
at design time and runtime - changing it from Flat to 3-D has no effect. =
The button is normally raised, and when pushed appears to be flush with =
the form's surface. That is what I want.
At design time, my subclassed control appears flat if (m_sAppearance =
=3D=3D 0) and sunken like an Edit Box if (m_sAppearance =3D=3D 1). This =
is not what I want. I do nothing at design time, but call FillRect() in =
OnDraw() to achieve this (undesired) behaviour. What do I want to do at =
design time?
At runtime, my subclassed control normally appears raised if =
(m_sAppearance =3D=3D 0) - great, and appears raised but set in a sunken =
Edit Box if (m_sAppearance =3D=3D 1) - so so. When clicked, both press =
through the level of the form and appear sunken - yuch. I do nothing but =
rely on the stock m_sAppearance property and DoSuperclassPaint() in =
OnDraw(). What do I want to do at runtime?
I'm also confused by why AppWizard overrides OnDraw() and calls =
DoSuperclassPaint() instead of the the OnDraw(). Looking at the on-line =
documentation for COleControl::OnDraw(), it would appear to make sense =
to call it. Can someone explain this discrepancy to me?
Thanks again, Mike.
Joao Marcos Melo Mendes -- jmmm@megamedia.pt
Monday, January 27, 1997
Hello, :)
On Thu, 23 Jan 1997, Mike Bryga wrote:
Environment: MSVC 4.0, Win 95/NT 4.0
> I'm also confused by why AppWizard overrides OnDraw() and calls
> DoSuperclassPaint() instead of the the OnDraw(). Looking at the on-line
> documentation for COleControl::OnDraw(), it would appear to make sense
> to call it. Can someone explain this discrepancy to me?
Yes, but if you look at the code for COleControl::OnDraw(), you'll see...
no code. The funtion is just there to be overriden by the derived class.
The thing is, C++ class derivation and OLE Control subclassing aren't the
same thing at all.
For instance, in an OCX project I'm developping, I have class A derived
from COleControl and class B derived from class A. However, class A is not
a subclassed control at all, while class B subclasses a BUTTON.
If you look at the implementation for COleControl::DoSuperClassPaint,
you'll see that it looks for a subclassed window class and sends that
class's WindowProc the WM_PAINT (or WM_PRINT) message.
It certainly makes more sense for the default implementation of a
subclassed window's paint routine to be its superclass's paint than its
C++ derived class's paint.
I hope I made some sense there...:)
Joao Mendes
MegaMedia, S.A.
"We're fools to make war on our brothers in arms." - Mark Knopfler
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: 2.6.2
mQBNAzKu3TgAAAECAL8+YSEFZ0XrlBMu9t2xDq3rhpWZoscP83VrX5MevAm3UOd6
fOtDKsJxsWugnVMexo50NfBjeWOHz5nA1b9hYx0ABRG0H0pvYW8gTWVuZGVzIDxq
bW1tQG1lZ2FtZWRpYS5wdD4=
=sspP
-----END PGP PUBLIC KEY BLOCK-----
| Вернуться в корень Архива
|