Click here to Skip to main content
15,889,512 members
Articles / Programming Languages / Visual Basic
Article

About... The About Box

Rate me:
Please Sign up or sign in to vote.
4.70/5 (98 votes)
4 Mar 20073 min read 307.5K   4.4K   200   45
A reusable About Box form for developers and users.

Sample Image - aboutbox.gif

Introduction

The About Box dialog isn't an essential part of any application, but it serves an important role, as the "dogtags" for your application.

There are two distinct, and very different, audiences for this dialog.

  • users: to identify the application's name, who made it, when it was created, and what version they have. Very basic stuff.
  • developers: to provide extremely detailed build, version, and file information. Typically used when troubleshooting problems with compiled, deployed code.

You definitely should have an About Box-- but to continue with the dogtag analogy, if you're whipping out dogtags on a regular basis, that's symptomatic of a deeper problem (Mediiiic!). When you do need it, it can be a lifesaver. It's OK to be used infrequently, but it also needs to provide decent diagnostic info. Decorative About Boxes with their scrolling text and 3D graphics may be fun, but they aren't helpful.

In order to serve the needs of these two vastly different user groups, my About Box provides two views: a simple, basic view for users, and a vastly more detailed view (accessible through a "More >>" button) for developers.

Using the code

This form is intended to be a standalone, resuable component; simply drag and drop the AboutBox.vb file into your project, then instantiate it as you would any other form. It has no special dependencies.

VB.NET
Private Sub MenuItemAbout_Click(ByVal sender As System.Object,_
                   ByVal e As System.EventArgs) Handles MenuItemAbout.Click
   Dim frmAbout As New AboutBox
   frmAbout.ShowDialog(Me)
End Sub

That provides the simplest, default About Box behavior. This should work for most applications right out of the box (as pictured in the screenshot). If you want to customize the form's behavior, it does have a number of optional properties that can be set before showing the dialog:

VB.NET
Public Property AppEntryAssembly() As System.Reflection.Assembly
Public Property AppTitle() As String
Public Property AppDescription() As String
Public Property AppVersion() As String
Public Property AppCopyright() As String
Public Property AppImage() As Image
Public Property AppMoreInfo() As String
Public Property AppDetailsButton() As Boolean

The sample application demonstrates how to set these properties to customize the text in the dialog.

Points of Interest

The primary information presented by the About Box form is automatically derived from the AssemblyInfo.* file. The AssemblyInfo.* file should always be populated for all of your assemblies as a best programming practice, but you'll want to make doubly sure in this case.

VB.NET
<Assembly: AssemblyTitle("About Box Demo")>
<Assembly: AssemblyDescription("Demonstration of AboutBox.vb code")>
<Assembly: AssemblyCompany("Atwood Heavy Industries")>
<Assembly: AssemblyProduct("Demo code")>
<Assembly: AssemblyCopyright("© 2004, Atwood Heavy Industries")>
<Assembly: AssemblyTrademark("All Rights Reserved")>

The rest of the detailed information is gathered through .NET's built in, and very powerful, reflection capabilities.

The build date is automatically calculated for each assembly based on the Build and Revision numbers specified in the AssemblyInfo.*:

XML
<Assembly: AssemblyVersion("4.1.*")>

This algorithm only works if standard auto-increment values were used (as pictured):

VB.NET
dt = CType("01/01/2000", DateTime). _
  AddDays(AssemblyVersion.Build). _
  AddSeconds(AssemblyVersion.Revision * 2)
If TimeZone.IsDaylightSavingTime(dt, _
  TimeZone.CurrentTimeZone.GetDaylightChanges(dt.Year)) Then
  dt = dt.AddHours(1)
End If
If dt > DateTime.Now Or AssemblyVersion.Build < 730 Or _
  AssemblyVersion.Revision = 0 Then
  dt = AssemblyLastWriteTime(a)
End If

If you've overridden the Build or Revision numbers, I can't calculate build date that way. In those scenarios, I use GetLastWriteTime on the assembly DLL file. I'm not aware of any more accurate methods to get build date, but between these two, the build time is usually correct.

History

  • Monday, June 14, 2004 - Published.
  • Sunday, December 19, 2004 - Version 1.1
    • code refactored for readability and simplicity.
    • switched to RichTextBox for more text, so URLs and MAILTO are automatically supported in .AppMoreInfo property.
    • More assembly properties are enumerated in the Assembly Detail tab.
    • converted to VB.NET 2005 style XML comments.
    • now with 36% more cowbell!
  • Wednesday, Janary 30, 2007 - Version 1.2
    • Added support for using proper system font
    • Tested in Windows Vista
    • Ported to Visual Studio 2005 and .NET 2.0
  • Monday, February 26, 2007 - Version 1.2a
    • Added C# version, thanks to Scott Ferguson!

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Web Developer
United States United States
My name is Jeff Atwood. I live in Berkeley, CA with my wife, two cats, and far more computers than I care to mention. My first computer was the Texas Instruments TI-99/4a. I've been a Microsoft Windows developer since 1992; primarily in VB. I am particularly interested in best practices and human factors in software development, as represented in my recommended developer reading list. I also have a coding and human factors related blog at www.codinghorror.com.

Comments and Discussions

 
GeneralThanks for the code--- Pin
mef5268-Feb-06 7:59
mef5268-Feb-06 7:59 
GeneralThanks! Pin
Fenra6-Dec-05 8:26
Fenra6-Dec-05 8:26 
GeneralNice One Pin
Sk8tz5-Apr-05 20:05
professionalSk8tz5-Apr-05 20:05 
QuestionWeb Application ? Pin
mejax3-Jan-05 21:13
mejax3-Jan-05 21:13 
AnswerRe: Web Application ? Pin
wumpus19-Feb-05 14:11
wumpus19-Feb-05 14:11 
GeneralRe: Web Application ? Pin
mejax9-Feb-05 22:27
mejax9-Feb-05 22:27 
GeneralAWSOME JOB!!! Pin
Badger08128-Aug-04 16:56
Badger08128-Aug-04 16:56 
GeneralDisplaying custom information Pin
Memetican5-Jul-04 18:20
Memetican5-Jul-04 18:20 
Very nice. I wish I had found your article earlier; I just spent the last 6 hours rolling a very similar design. A few thoughts that might be of interest though;

+ Make it a separate GAC'd library. Something that you can painlessly reference in a new app, and customize. Using EntryAssembly, this works nicely, and lets all your about boxes upgrade at the same time. (you might have done this; I haven't looked at the source yet)

+ Allow for adding ad-hoc information. I discovered (after some head-banging) that custom attributes are actually quite useful, and that you can extend the AssemblyInfo.cs/.vb file with your own. So things like an AssemblyAuthor tag, AssemblyCompanyWebsite, etc. become easily definable (from your own namespace), and can be absorbed by the about box as well. It also seems useful to support the loading of generic key-value pairs from a resource file. In my case, I tell my about box the name of the resource (App.resources in my case), and it grabs it from the entry assembly and blindly appends everything into a ListView.

+ Allow linking to further detail. It's possible to make subitems in a listview appear blue and underlined, hyperlink-style. I found this really useful for adding links to support websites, bug reporting, documentation, feature suggestion lists, an author mailto:, and things like that. Makes it very easy to connect the app into the business network supporting it.

+ Support a logo. Found this surprisingly easy. You can drop a .png into your main app project, and mark it as an embedded resource. Then tell the about box the name of the resource, and it can load and display it with just a few lines of code. I originally tried GIF, but PNG supports full a full alpha channel, so the logo transparency blends flawlessly with the about box background.

Thanks again for the idea on the complete assembly list, and detailed inspection; very very wise, and I'm definately adding both tonight...

GeneralRe: Displaying custom information Pin
wumpus15-Jul-04 20:30
wumpus15-Jul-04 20:30 
GeneralButtons at title bar Pin
w1424317-Jun-04 15:40
w1424317-Jun-04 15:40 
GeneralRe: Buttons at title bar Pin
wumpus120-Jun-04 19:05
wumpus120-Jun-04 19:05 
GeneralRe: Buttons at title bar Pin
Isaac Answers25-Dec-04 1:22
Isaac Answers25-Dec-04 1:22 
GeneralUndersold Pin
Joel Holdsworth14-Jun-04 1:52
Joel Holdsworth14-Jun-04 1:52 
GeneralRe: Undersold Pin
wumpus115-Jun-04 13:10
wumpus115-Jun-04 13:10 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.