UsingCoLib to Build a Visual Control (.OCX)
Copyright © Dec 30, 2000 by Ernest Murphy ernie@surfree.com
For educational use only. All commercial use only by written license.
Sample code for this tutorial is available at ...\COM\examples\AsmCtrl\
A VB sample client is available at ...\COM\examples\AsmCtrl\testapp
The Build OCX setting used for Quick Editor is at ...\COM\BIN\BLDOCX.BAT
ABSTRACT
A visual control is demonstrated. A Visual Basic project is supplied to test this object.
INTRODUCTION
Visual controls are a very useful area to be explored for COM in assembly. Currently. the popular methods of making these controls includes MFC and ATL in C++, VB, Java, and a few other minor players. With the possible exception of ATL, these methods lead to large bloated controls with huge runtimes.
The sample control resides in a 24,576 byte dynamic link library, and of that 9,009 are simply resources (bitmaps and the typelib). No further runtimes are required.
Description of the Control
The control described here is a fairly straightforward C++ to ASM port of the control designed and built by Sean Baxter as is available at: http://ript.net/~spec/captcom/journal3/
Sean does an excellent job of defining a control using just C++ (very light dependence on the ATL libraries) and explaining how a minimum set of interfaces can work in conjunction with the client site interface of Visual Basic to create a custom visual control.
I strongly suggest you read his excellent 3 part tutorial to understand how these interfaces work. You might also note I royally simplified Sean's custom control properties such that the PAINT methods needed in the asm control are to simply display the control name. I also eliminated his property pages. However, I did implement Property Categories
AsmCtrl also includes a Value property, Fore and BackColor properties, and implements ICategorizeProperties
Controls as Visual Basic Components
A Control is based on the same principles as any other in-process (dll) server. However, it does implement several special interfaces, methods, and resources to make it as simple to use for the VB developer as possible.
For those of you who see VB as far too simplistic a language to be of any note, and all its users 'lamers,' let me suggest an alternative definition for you:
VB users are clients. VB users will pay big bucks to buy your super duper super fast gizmo coded in 100% ASM.
VB users who cannot buy wonderful components will be forced to become crack distributers to the detriment of all of society. It is our civic duty to supply them with simple to use, functional components.
(Please note a written license is required to use CoLib.lib or any of these files in a commercial product. Have your girl call my girl, we'll do lunch and work it out.)
Visual controls have the following features to make them even easier to use:
ControlBox bitmap: This is the icon one uses to select the control. It is typically 16x15 pixels in size, 16 colors, and the lower left corner pixel is used to indicate a transparent color.
AboutBox: It is convienent to let the used know who made each component. By giving it an AboutBox method, you get the opportunity to sign your work, and also to pass on some hints to the user (such as a web page for further info).
Properties: Values saved in a control may be changed through a pair of Set and Get procedures. VB hides this complication from users, and uses the concept of Properties to hold values. In the VB IDE, those Properties that should be set at runtime are displayed in the Object Browser window. The control uses facilities offered by VB to save these properties, then retrieve them at runtime.
ICatagorizeProperties
This interface only makes sense in the Visual Basic IDE. VB is designed to make things as simple as possible for the programmer.
Property Catagories are groups of similar properties. Most standard properties, such as Width, Height, About, Tag, Index, and such, have pre-identified catagories.
When defining a new custom control, you need a to specify the catagory of the new properties. The ICategorizeProperties interface has this job.
The dispid (dispatch ID number) of a property is passed to ICategorizeProperties_MapPropertyToCategory, and if the property is mapped, that Catagory number is returned. ICategorizeProperties_GetCategoryName returns this Catagory name for the given number.
VB does this behind the scenes as it loads your control.
Conclusion
This article does not deserve the title 'tutorial,' as it is only the briefest of descriptions for this control. It will have to serve for now, until such time I finish a truly useful control, with events, error handling, and so on.