September 23, 2020
Hot Topics:

Create a Shaped 3D Control with GDI+

  • By Paul Kimmel
  • Send Email »
  • More Articles »

Preventing Properties from Appearing in the Properties Window

Other properties were removed from the designer either arbitrarily or because they cause design-time errors. For example, no property editor exists for Pen objects as yet (see my book Visual Basic .NET Power Coding [Addison-Wesley, 2003] for more on custom property editors); thus, the designer would not be able to adequately permit modifying a Pen at design time. (You probably could write a custom property editor in terms of a Pen color, but that's another article.)

Public properties are visible in the Properties window by default. As Listing 5 shows, to make a property invisible, you tag the property with the BrowsableAttribute, passing False to the attribute. Remember that the Attribute suffix is dropped from attributes by convention.

Listing 5: Use the BrowsableAttribute initialized with False to remove properties from the design-time environment.

   <Browsable(False)> _
   Public Property CubeSize() As CubeSize
            Return FCube.Size
      End Get
         Set(ByVal Value As CubeSize)
            FCube.Size = Value
      End Set
   End Property
   <Browsable(False)> _
   Public ReadOnly Property CubeX() As Integer
         Return FCube.X
      End Get
   End Property
   <Browsable(False)> _
   Public ReadOnly Property CubeY() As Integer
         Return FCube.Y
      End Get
   End Property
   <Browsable(False)> _
      Public Property CubePen() As Pen
         Return FPen
      End Get
      Set(ByVal Value As Pen)
         FPen = Value
      End Set
   End Property
   <Browsable(False)> _
   Public ReadOnly Property Cube() As Cube
         Return FCube
      End Get
   End Property

The non-browsable properties in Listing 5 complete the implementation of the 3D Cube control.

Shaping the Control

.NET supports shaped controls directly. In earlier versions of VB, one had to have a pretty comprehensive understanding of device contexts and the Windows API to create shaped controls. While you'll find some pretty good articles on shaped VB6 Forms with the API, the conspicuous absence of information about non-rectilinear forms suggests that this topic is fairly obscure.

Controls in .NET have a Region property, which is an instance of the Region class. This class supports Transforms, which in turn are an instance of the Matrix class. The Region class permits shaping and the Transform property of the Region class makes it easier to twist, turn, and rotate regions. In this example, all you had to do was get the bounding region of the cube, assign that to the containing control, and violà! You have a shaped control. Because Forms are controls, you can use the same technique to create shaped Windows forms.

Defining a Toolbar Bitmap

VS.NET contains several designers and editors. One such designer is icon and bitmap designer. By adding a bitmap item (select Project|Add New Item|Bitmap File) to your project, you can add a bitmap and draw the bitmap for your control's Toolbar representation or add an existing bitmap to the project.

If you add a new bitmap file to your project, VS.NET opens the designer and makes a new Image menu available. The Image menu contains menu items and links to toolbars that permit drawing a bitmap from scratch. Figure 2 shows a bitmap that represents an approximation of the control's visual representation. The preview window (see Figure 2, middle) shows you how the bitmap will appear with its actual size, and the drawing window (see Figure 2, right) is a zoomed-in view that makes it easier to draw the bitmap.

Click here for a larger image.

Figure 2: Drawing a custom bitmap for your control's Toolbar appearance

To associate this bitmap with your custom control, you need to use the ToolboxBitmapAttribute and the path to the bitmap file or a resource type. (This demonstration uses the latter approach.) The bitmap can be a 16x16- or 32x32-pixel image. Listing 6 shows the ToolboxBitmapAttribute applied to your control class header.

Listing 6: Use the ToolboxBitmapAttribute to add a graphic to the toolbox along with your control.

Imports System
Imports System.Collections
Imports System.ComponentModel
Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.Data
Imports System.Windows.Forms

<ToolboxBitmap(GetType(Cube3d))> _
Public Class Cube3d
   Inherits System.Windows.Forms.Control

From my previously mentioned book, the following summary of instructions incorporates a toolbox graphic for your control:

  1. Select the class library from the solution explorer.
  2. Click File|Add New Item from VS.NET's menu.
  3. In the Add New Item dialog, pick the Bitmap File template, change the name to Cube3d.bmp, and click Open.
  4. Open the bitmap item (if it is not already open). In the Properties window, change the Height and Width to 16.
  5. Draw the bitmap.
  6. Use bright green for your background color (by selecting the Image|Show Colors Window and picking the neon green color).
  7. Select the Cube3d.bmp file in the Solution explorer, press F4 to display the Properties window, and change the Build Action to Embedded Resource (see Figure 3).
  8. Finally, specify the resource type (GetType(Cube3d) in the ToolboxBitmapAttribute for your control class.

Figure 3: Embedding a bitmap is an easy way to drag it along with your application.

(The IDE seems to be a bit particular about the image details, so much so that I did not gratuitously mention my book. Rather, I mentioned the book because I had to go back and check when the image did not show up in the toolbox the first time.)

The final steps include copying the cube3d.bmp to the folder containing the assembly (or including the full path in the ToolboxBitmapAttribute) or embedding the bitmap as a resource, compiling the library containing your custom control, and adding the library to the toolbox.

Page 3 of 6

This article was originally published on September 30, 2004

Enterprise Development Update

Don't miss an article. Subscribe to our newsletter below.

Thanks for your registration, follow us on our social networks to keep up-to-date