MDI TaskBar

This is an UserControl transferring concept of Windows 95 TaskBar to MDI application. When located inside MDI window, it will group icons for all MDI child windows and allow user to select one by pressing respective button. Also context menu for an icon and for whole toolbar is supported, but has to be provided by MDI parental window in event handlers.
"Auto hide" feature is not implemented yet.

Files

Source code is provided with a sample (MDI application generated by VB Application Wizard). Actual code (which should be ported to your application) is in following files:

  • TaskBar.ctl  - UserControl code
  • Icon.cls - a class used for storing information about child windows handled
  • Declares.bas - contains all necessary API related stuff.

Components

As it was written, there are two major components: a control itself and an auxiliary class clsIcon. The TaskBar control uses some functions from API, declared in moduleDeclares and some module routines implemented there.

UserControl TaskBar

The idea is simple. User control located inside MDI parental window receives notifications about all changes in status of any MDI child window (e.g. change in state, destroying, creating, activating and deactivating), and, when notified, scans Forms collection for all windows with proper attributes (MDIChild & ShowInTaskbar). In order to receive these notifications, MDIClient window has to be subclassed (described in Declares section).

For each control an object of the clsIcon class is created and stored internally in the collection m_colIcons. All important changes (e.g. these, we carry about) to each window made by an user are thus reflected in the collection. Then the collection will be used (in UserControl_Paint event handler) to prepare buttons for each window.

There are no other controls placed on TaskBar control. Everything is painted "by hand" and all events (mouse up, down etc.) are handled by a code of the control. When an user clicks within control, program determines, which button is affected and then changes it's state (and look). I think, I implemented reasonable behavior. When a change made by user to a window affect only one button, only a part of the toolbar will be repainted (I use API InvalidateRect instead of VB's Refresh).

Operations of minimizing and restoring MDI windows are handled separately in order to achieve effect of "hiding" windows.

Class clsIcon

Class clsIcon stores all information necessary to paint a button for a specific window, including a reference to window's icon. It also has a feature (touch properties), which helps me to detect, which window has ben destroyed and is no longer present without performing separate iteration through Forms and icons collections to compare them.

Module Declares

The module contains all global API declares required and implementation of two crucial functions:

  • the one, which subclasses MDIClient window
  • new WndProc for MDIClient, which notifies UserControl about events among MDI Client children

How to Use That

Simply append these three files to your project and place TaskBar on your MDI Form. If you want to have context menu for taskbar and for child windows (right click on a button), you have to provide proper menu objects in handlers for events fired by this control.

Limitations

  • MDI TaskBar, as it is implemented can't exist as a separate ActiveX - the reason is it uses the Forms collection.
  • You can't place additional buttons on the toolbar unless you will change all calculation related functions (ItemRect etc.).
  • Although TaskBar may be docked vertically, it won't work properly if there are to many windows (it won't crash, but new windows won't be displayed).
  • This cool "Auto hide" feature is not implemented yet.

Download project file



Comments

  • There are no comments yet. Be the first to comment!

Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • There has been growing buzz about DevOps. DevOps is a methodology that unites the often separate functions of software development (Dev) and production and operations (Ops) into a single, integrated, and continuous process. DevOps is about breaking down the barriers between Dev and Ops. It leverages people, processes, and technology to stimulate collaboration and innovation across the entire software development and release process. Dev and Ops should always be part of an integrated process, but that's not …

  • Thanks to wide spread cloud hosting and innovations small businesses can meet and exceed the legacy systems of goliath corporations. Explore the freedom to work how you want, with a phone system that will adapt to your evolving needs and actually save you lots of expense—read Get an Enterprise Phone System without High Cost and Complexity. The article clearly illustrates: The only hardware you'll need is phone equipment for advanced voice and fax. How to join all your employees, mobile devices, …

Most Popular Programming Stories

More for Developers

RSS Feeds

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