This is some great code and offers a nice result. Thank you for posting it! I intend on using it in a future project that needs some cool buttons.
One big problem I found was placing the new button control on a form in Access 2000, and then assigning some code to it which _closes_ the form. This will result in a fatal error which kills Access on the spot. I have traced the problem to the destructor lines:
This makes sense because in some situations, those objects may not even exist any more. They are pointers to objects in the device context which were there already. The button control held on to them only briefly while using its own brushes (which should be deleted). This control should not try to delete things it doesn't own.
Having commented out these lines, the button runs wonderfully. They look great with some 256 colour icons drawn off to one side with the text on the other. I thank you again for posting some great material for others to benefit from.