Professional User Interface Suite

CodeGuru content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More.

Contents

1. Introduction
2. Prof-UIS Features
3. Getting Started with Prof-UIS
3.1. Setting Paths and Compiling
3.2. SDI/MDI Applications
3.2.1. Menu bar and toolbars
3.2.2. Resizable control bars
3.2.3. GUI persistence
3.2.4. Command manager
3.3. Dialog-based Applications
4. Prof-UIS Usage Tips
4.1. How to use pop-up menus in your application
4.2. How to set up popup menu visualization options
4.3. How to use expandable menus
4.4. How to set/change text for a toolbar buttons and menu items
4.5. How to insert controls into toolbar
4.6. How to set a menu for a toolbar button
4.7. How to remove a toolbar’s chevron/option buttons
4.8. How to display Prof-UIS advanced Color Dialog
4.9. How to change User Interface Manager
5. Samples
6. Version History
7. Copyright
8. Credits
9. Reporting Bugs
10. Additional Information

1. Introduction

Prof-UIS is a feature-rich MFC extension library that enables you to deliver Windows applications with a professional and user-friendly interface. It will help you take the time and complexity out of incorporating sophisticated UI facilities into your projects. On-the-fly changeable, Microsoft® Office 2000/XP/2003 appearance, dockable control bars, menus and toolbars, multi profile UI persistence, and much more can be easily implemented with the help of Prof-UIS in the Microsoft Visual C++® 6.0/7.0/7.1 development environment.

Prof-UIS is designed to help Visual C++ programmers save hundreds of hours in implementing today’s most demanded GUI facilities in their applications. This makes Prof-UIS an invaluable tool for GUI development.

2. Prof-UIS Features

  • On-the-fly changeable Microsoft Office 2000, XP, and 2003 themes
  • Visual Studio .NET-like resizable control bar, that optionally shows its contents while dragging/resizing. Such bars can be placed in all sorts of combinations relative to each other both in the main frame window and in the smart floating containers
  • Powerful set of tools for color management: color popup menu with shadow (color picker menu), color picker button, color palette control, color picker control, and color selection dialog
  • Pop-up menu with shadows, animation, frequently/rarely used commands, and Windows 2000-like tooltip window
  • Menu bar with automatic support for lists of MRU files and MDI windows, the system menu for the MDI/SDI main frame and MDI child frame, and the context menu for application’s toolbars and resizable control bars
  • Enhanced resizable dialog, resizable property sheet, and resizable property page
  • Fixed-size panel control bar
  • Edit control and combo box with optional auto-complete, which support the flat/semi-flat style and whose context menus are consistent with Prof-UIS themes
  • Flat/semi-flat button control with icon, which supports the push-like check-box style (also known as a two-state button)
  • Enhanced check box and radio button controls whose appearance are based on bitmaps and can be easily customized
  • Group box, which allows its child controls to be drawn correctly when the Office 2003 theme is applied and which supports three border styles: ETCHED, ROUNDED, and FLAT
  • Built-in toolbar buttons with divided drop-down areas
  • Toolbar’s chevron button support
  • Toolbar slider/scrollbar button
  • Dialog for managing open child windows in MDI-applications (the “Windows…” dialog)
  • Status bar control
  • Powerful “persistent affixment algorithm” that makes Prof-UIS control bars extremely user-friendly&#151they can restore their exact positions and sizes after redocking the bars or resizing the frame
  • Generalized template window classes for various common tasks such as injecting non-client area borders into any window, providing flicker-free repainting, and anchoring child windows to the borders of their parent window
  • Multi profile UI persistence and archive-based serialization of UI state, which supports the command usage statistics. These features are based on the Command Manager serializable component
  • Alpha icons for disabled menu and toolbar items used when both the Microsoft Office 2003 style and high/true color monitor modes are on
  • Multi-monitor support
  • Visual Studio 6.0/7.0/7.1 compatibility
  • ANSI, MBCS, Unicode, and native Unicode support
  • Czech, German, Korean, Polish, Russian, and Swedish localizations

3. Getting Started with Prof-UIS

This section is intended to help you start using Prof-UIS. Although Prof-UIS is an MFC extension library and follows MFC standards to some extent, the section puts emphasis on difference issues rather then what the libraries have in common. We recommend you refer to the following samples while reading this chapter: SDI, SDIDOCVIEW, MDI, and MDIDOCVIEW. The ProfUIS Controls sample also may be useful if you are interested in how to work with a menu bar and/or toolbars inside dialog-based applications.

3.1. Setting paths and compiling

After completing the installation, you need to set up the required paths. Select Options from the Tools menu. Open the Directories tab in Visual Studio 6 or open the Projects folder and then select Visual C++ in Visual Studio 7.0/7.1. In the Show directories for drop-down list, specify file types and corresponding paths according to the following table:

File types Paths Visual Studio
Include files …/Prof-UIS/Include 6.0, 7.0, 7.1
…/Prof-UIS/Src
Source files …/Prof-UIS/Include
…/Prof-UIS/Src
Library files …/Prof-UIS/Bin_600 6.0
…/Prof-UIS/Bin_700 7.0
…/Prof-UIS/Bin_710 7.1

Now you can compile Prof-UIS and its samples to any of the available build configurations. Prof-UIS samples serve on one hand as an example of how your application may look, and on the other, they should help you implement library’s features in your projects.

3.2. SDI/MDI applications

In this section, we will outline some issues related to migrating from already existing MFC SDI/MDI applications to those based on Prof-UIS. Before starting to use Prof-UIS, do not forget to add the following line to your StdAfx.h file:

#include < Prof-UIS.h >    // Prof-UIS library

Also, make sure you set appropriate .\lib, .\bin and .\include paths in the Visual Studio settings (see Setting Paths and Compiling).

3.2.1. Menu bar and toolbars

Make the following changes in your code:

  • Replace the toolbar names with CExtToolControlBar
  • Use CExtMenuControlBar for your menu bar

There can be many CExtToolControlBar toolbars in your applications and only one menu bar. You may initialize the menu bar in the CMainFrame::OnCreate() method with this code:

if(!m_wndMenuBar.Create(
   NULL,    // _T("Menu Bar"),
   this,
   ID_VIEW_MENUBAR
   )
{
   TRACE0("Failed to create menubar\n");
   return -1;
}

Make some changes in CMainFrame::PreTranslateMessage(MSG* pMsg) to allow the menu bar to work correctly:

BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
   if( m_wndMenuBar.TranslateMainFrameMessage(pMsg) )
      return TRUE;
   return CMDIFrameWnd::PreTranslateMessage(pMsg);
}

Replace the current code for creating Prof-UIS toolbars with the following code snippet:

if( !m_wndToolBar.Create(
      _T( "Toolbar name" ),
      this,
      AFX_IDW_TOOLBAR
   )
   || !m_wndToolBar.LoadToolBar( IDR_MAINFRAME )
   )
{
   TRACE0( "Failed to create toolbar" );
   return -1;
}

The menu bar and each toolbar should have correspondent entries in the message map of the main frame window:

ON_COMMAND_EX(ID_YOUR_BAR, OnBarCheck)
ON_UPDATE_COMMAND_UI(ID_YOUR_BAR, OnUpdateControlBarMenu)

To enable Prof-UIS control bars (including the menu bar and toolbar) to be docked correctly, you should use CExtControlBar::FrameEnableDocking(this) instead of the MFC’s EnableDocking() method:

if( !CExtControlBar::FrameEnableDocking(this) )
{
   ASSERT( FALSE );
   return -1;
}
3.2.2. Resizable control bars

Add the m_wndResizableBar bar property of the CExtControlBar type to your frame window declaration:

CExtControlBar m_wndResizableBar;

Add the resizable bar creation code to the OnCreate() method:

if( ! m_wndResizableBar.Create(
      _T( "Resizable bar name" ),
      this,
      ID_YOUR_RESIZABLE_BAR
      )
   )
{
   TRACE0( "Failed to create resizable bar" );
   return -1;
}

Create any window that you want to insert into the resizable bar and specify m_wndResizableBar as the parent of this window.

Now, we need to enable the resizable bar to be docked. This can be done with two methods:

EnableDocking( &m_wndResizableBar )         //enables control bar to
                                            //be docked
CExtControlBar::FrameEnableDocking(this)    //single call for entire
                                            //frame window; enables
                                            //drag-n-drop of control
                                            //bars inside frame

You can set the initial state of a resizable bar (docked, floating. If docked, then how exactly it should be docked?) with the following methods of CExtControlBar: DockControlBar() and FloatControlBar().

DockControlBar() allows you to dock a resizable bar with one of the frame sides: top, bottom, left, or right. Because resizable bars can be docked in a nested way, you also should specify a nested level with the second parameter, which must be equal to or greater than 1 (read the article Docking Mechanism Explained for details):

m_wndResizableBar.DockControlBar( AFX_IDW_DOCKBAR_LEFT, 1,
                                  this, false );

The second overload of DockControlBar() enables you to arrange a resizable bar relative to others, which are already docked. In the code below, first, the OtherBar bar is docked, and then it is placed next to the bar specified with m_wndResizableBar:

OtherBar.DockControlBar( AFX_IDW_DOCKBAR_LEFT, 1, this, false );
OtherBar.DockControlBar( &m_wndResizableBar, true, false, NULL, false );

You may implement a Show or Show/Hide command for your resizable bar. For example, to toggle between the visible and invisible states, you need to add the following lines to the main frame window’s message map:

ON_COMMAND_EX(ID_YOUR_RESIZABLE_BAR, OnBarCheck)
ON_UPDATE_COMMAND_UI(ID_YOUR_RESIZABLE_BAR, OnUpdateControlBarMenu)
3.2.3. GUI persistence

In most cases, it is user friendly to store the state of the application’s GUI elements between launches. Add to the header of the CMainFrame class the WINDOWPLACEMENT m_dataFrameWP variable. To the CMainFrame‘s constructor, add the initialization code below:

::memset( &m_dataFrameWP, 0, sizeof(WINDOWPLACEMENT) );
m_dataFrameWP.length = sizeof(WINDOWPLACEMENT);
m_dataFrameWP.showCmd = SW_HIDE;

To restore the state of the main frame window, overload the CMainFrame::ActivateFrame method with:

void CMainFrame::ActivateFrame(int nCmdShow)
{
   if( m_dataFrameWP.showCmd != SW_HIDE )
   {
      SetWindowPlacement( &m_dataFrameWP );
      CMDIFrameWnd::ActivateFrame( m_dataFrameWP.showCmd );
      m_dataFrameWP.showCmd = SW_HIDE;
      return;
   }
   CMDIFrameWnd::ActivateFrame(nCmdShow);
}

The invoke of the CExtControlBar::ProfileBarStateSave function in the the DestroyWindow() method of CMainFrame saves the state of all control bars.

CWinApp * pApp = ::AfxGetApp();
ASSERT( pApp != NULL );
ASSERT( pApp->m_pszRegistryKey != NULL );
ASSERT( pApp->m_pszRegistryKey[0] != _T('\0') );
ASSERT( pApp->m_pszProfileName != NULL );
ASSERT( pApp->m_pszProfileName[0] != _T('\0') );
VERIFY(
   CExtControlBar::ProfileBarStateSave(
      this,
      pApp->m_pszRegistryKey,
      pApp->m_pszProfileName,
      pApp->m_pszProfileName
      )
   );

To load the application’s saved state when starting the application, add the call of CExtControlBar::ProfileBarStateLoad to the OnCreate() method:

if(!CExtControlBar::ProfileBarStateLoad(
   this,
   pApp->m_pszRegistryKey,
   pApp->m_pszProfileName,
   pApp->m_pszProfileName,
   &m_dataFrameWP
   )
)
{
   // if the state is not loaded, dock the initial layout
   // ..............
}
3.2.4. Command manager

When running most Prof-UIS sample applications, you may have noticed that popup menus display icons for some commands. The very same icons are set for correspondent commands in toolbars. This feature is automatically provided by the Prof-UIS command manager, which is an object of the CExtCmdManager type and can be accessed from within the entire application with the g_CmdManager smart pointer variable.

The command manager is a named collection of command profiles. Each profile is an object of the CExtCmdProfile class. Each profile has its own unique name and keeps a list of HWND handles. This allows a window to “know” which profile it belongs to.

The most important role of the command profile is to keep descriptions of the commands. The command description is a CExtCmdItem object, which keeps information related to a single command:

  • Identifier
  • Text strings for the menu item, toolbar button, tooltip, and status pane
  • Icon
  • Command usage statistics required for supporting expandable popup menus

Most applications are based on a single profile in the command manager. This profile keeps HWND of the main frame window or main dialog, which allows the main window and all its child controls to find a required command description automatically.

When starting the application, you should initialize the command manager. Add your command profile to the command manager and then put all the command descriptions into this profile. You may do this at the beginning of the OnCreate() method of the main frame window or in the OnInitDialog() of the main dialog window:

VERIFY(
   g_CmdManager->ProfileSetup(
      "name of the command profile",
      GetSafeHwnd()    // HWND of the frame window
      )
   );

If you register your menu bar and/or toolbar resources in the command manager, all their data will be added to the command manager automatically:

VERIFY(
   g_CmdManager->UpdateFromMenu(
      "name of the command profile",
      IDR_MAINFRAME
      )
   );
VERIFY(
   g_CmdManager->UpdateFromMenu(
      "name of the command profile",
      IDR_YourMdiProjectsDOCTYPE
      )
   );
VERIFY(
   g_CmdManager->UpdateFromToolBar(
      "name of the command profile",
      IDR_TOOLBAR1
      )
   );

Finally, notify the command manager about destroying the frame window in CMainFrame::DestroyWindow() (or about the main dialog window in OnOK() and OnCancel()) so that it can release HWND of the window:

g_CmdManager->ProfileWndRemove( GetSafeHwnd() );

3.3. Dialog-based applications

To provide your dialog-based application with any of available visual styles (Microsoft Office 2000, XP or 2003) and/or to use the anchoring for its controls, you should inherit the main dialog from the CExtResizableDialog class.

The Prof-UIS dialog has a resizing gripper, which can be on or off with the ShowSizeGrip() method. For example, you may pass FALSE to it in the OnInitDialog handler to turn it off.

As in the standard MFC dialog application, the resizing of the dialog is enabled/disabled in the Border field of the dialog resource’s properties.

If you use a menu and want to replace it with that of Prof-UIS, follow the steps below.

Add a custom control to your dialog resource and specify the string “ProfUIS-ControlBar” as its window class, IDC_MY_MENUBAR as its control identifier, the value 0x50402034 as its window style and the zero value as its extended style.

Add the CExtMenuControlBar m_wndMenuBar member variable to your dialog and the DDX_Control(pDX, IDC_MY_MENUBAR, m_wndMenuBar) line to the DoDataExchange() method’s body.

To assign the required menu resource to your menu bar, you should put the following lines into OnInitDialog():

ASSERT( m_wndMenuBar.GetSafeHwnd() != NULL );
if( !m_wndMenuBar.LoadMenuBar( IDR_MY_MENU_FOR_MENUBAR ) )
{
   ASSERT( FALSE );
   return FALSE;
}

To stretch your menu bar to the dialog border, you should put the following line somewhere at the end of the OnInitDialog() method:

CWnd::RepositionBars(0,0xFFFF,0);

If you use the Prof-UIS resizable dialog as a base class for your application, implement the WM_SIZE message handler in the following way:

void CYourDlg::OnSize(UINT nType, int cx, int cy)
{
   CExtResizableDialog::OnSize(nType, cx, cy);
   if( nType != SIZE_MINIMIZED )
   CWnd::RepositionBars(0,0xFFFF,0);
}

The Prof-UIS Controls sample demonstrates how to use the menu bar as a dialog control.

4. Prof-UIS Usage Tips

4.1. How to use pop-up menus in your application

The CExtPopupMenuWnd class implements a popup menu. To use it is no more difficult than the standard CMenu class.

  1. Create the CExtPopupMenuWnd object dynamically:
  2. CExtPopupMenuWnd *pPopupWnd = new CExtPopupMenuWnd;
  3. Initialize menu items by loading the menu resource
  4. VERIFY(
       pPopupWnd->LoadMenu( hWnd, IDR_TEST_POPUP_MENU )
    );
    

    or by performing a set of calls to CExtPopupMenuWnd::ItemInsert()

  5. Let us now look at how a new popup submenu can be inserted. First, create and initialize it by going through Step 1 and Step 2. Then, call ItemInsertSpecPopup() to insert a new popup at the specified position in the existing CExtPopupMenuWnd object. The following code inserts a color picker menu to the existing menu:
  6. pPopupWnd->ItemInsertSpecPopup(
       new CExtPopupColorMenuWnd,
       -1,
       _T( "test color menu" )
    );
    
  7. Track the created and initialized popup menu:
  8. VERIFY(
       pPopupWnd->TrackPopupMenu( 0, x, y )
    );
    

    Please note that the popup menu’s tracking position is set in screen coordinates. The CExtPopupMenuWnd objects are auto-destroyed, so do not call the delete operator for these objects.

4.2. How to set popup menu visualization options

The CExtPopupMenuWnd popup menu class has the following properties:

Property Default Value Meaning
static bool g_bMenuWithShadows; true Allow displaying shadows
static bool g_bMenuExpanding; true Allow hiding rarely used menu items in initial state
static bool g_bMenuHighlightRarely; true Display rarely used menu items in a different style
static bool g_bMenuShowCoolTips; true Allow displaying cool tooltips
static bool g_bMenuExpandAnimation; true Turn on animation when expanding rarely used menu items
static bool g_bUseDesktopWorkArea; true If true, align to desktop work area; otherwise, to screen area
static e_animation_type_t g_DefAnimationType; __AT_FADE Default animation during menu activation. Acceptable values are:
__AT_NONE
__AT_RANDOM
__AT_ROLL
__AT_SLIDE
__AT_FADE
__AT_ROLL_AND_SREETCH
__AT_SLIDE_AND_SREETCH
__AT_NOISE
__AT_BOXES
__AT_CIRCLES
__AT_HOLES

4.3. How to use expandable menus

Expandable menus are implemented in the DRAWCLI sample application. When you open any drop down menu from the menu bar, the only items that are visble at first correspond to basic commands. Other items appear when you click on the Expand button at the bottom of the menu or when you press the CTLT+DOWN_ARROW key combination. The frequently used or basic commands are those that do not depend on usage statistics or a number of clicks. All application commands are registered in the command manager (tt>CExtCmdManager), whose members and methods can be accessed via the global smart pointer variable g_CmdManager with operator ->. The SetBasicCommands() method allows you to replenish the basic commands list. The system commands (from the window’s system menu), OLE commands, and the commands relating to MRU files and to MDI windows are automatically considered to be basic.

If you want to disable the most recently used menu items, there are two ways to do this:

  • add the following lines to your initialization code
  • CExtPopupMenuWnd::g_bMenuExpanding       = false;
    CExtPopupMenuWnd::g_bMenuHighlightRarely = false;
    

    This way is preferable.

  • use g_CmdManager->SetBasicCommands to make all your commands basic; in other words, initially visible in your menus.

4.4. How to set/change text for a toolbar buttons and menu items

You should get the command specifier from the command manager and then set the text attributes m_sToolbarText and m_sMenuText. If you have to set/change the text after the frame window has been created, call the RecalcLayout() method of the frame.

UINT nCmdID = ID_xxx;    // comand identifier
CExtCmdItem * pCmdItem =
   g_CmdManager->CmdGetPtr(
      g_CmdManager->ProfileNameFromWnd( this->GetSafeHwnd() ),
      nCmdID
   );
ASSERT( pCmdItem != NULL );
if( pCmdItem != NULL )
{
   pCmdItem->m_sMenuText    = _T("Menu text");
   pCmdItem->m_sToolbarText = pCmdItem->m_sMenuText;
   pCmdItem->m_sTipTool     = _T("Tooltip text");
   pCmdItem->m_sTipStatus   = pCmdItem->m_sTipTool;
}

4.5. How to insert controls into toolbar

Create a control with Dialog Control ID value equal to the ID of an existing button on the toolbar. Then, set then control to the button by calling the CExtToolControlBar::SetButtonCtrl() method.

If there is no command with such ID in the application menu, it is recommended to set a menu text for this command. That allows the button/control to be displayed correctly in case there is no space in the toolbar for it.

if( !m_wndComboFindText.Create(
      WS_CHILD|WS_VISIBLE|CBS_HASSTRINGS|CBS_DROPDOWN,
      CRect(0,0,180,200),
      &m_wndToolBarStandard,
      ID_HELP_SEARCH_COMBO))
{
   TRACE0( _T( "Failed to create ID_HELP_SEARCH_COMBO\n" ) );
   return -1;    // fail to create
}
m_wndToolBarStandard.SetButtonCtrl(
   m_wndToolBarStandard.CommandToIndex(ID_EDIT_FIND),
   &m_wndComboFindText
);
m_wndComboFindText.SetFont(
   CFont::FromHandle((HFONT)::GetStockObject(DEFAULT_GUI_FONT)) );
m_wndComboFindText.SetItemHeight(
   -1, m_wndComboFindText.GetItemHeight(-1) - 1 );
g_CmdManager->CmdGetPtr( m_wndComboFindText.GetDlgCtrlID() )->
   m_sMenuText = _T( "Search help system" );

///////////////////////////////////////////////////////////////////

CZoomBarSliderButton *pZoomSliderTBB = new CZoomBarSliderButton(
      &m_wndToolBarZoom,
      ID_MYEXTBTN_SLIDER,
      0,
      11, 4, 0,    // scroll total/pos/page
      0, 0,        // button extent horz(left/right)/vert(up/down)
                   // in pixels
                   // (if zeros, use slider-like layout instead of
                   // scrollbar-like)
      100, 100     // total slider control extent horz/vert in pixels
    );
VERIFY(m_wndToolBarZoom.InsertSpecButton(-1,pZoomSliderTBB,FALSE));

CSeekBarSliderButton *pSeekScrollerTBB = new CSeekBarSliderButton(
      &m_wndToolBarSeek,
      ID_MYEXTBTN_SCROLLER,
      0,
      0, 0, 0,    // scroll total/pos/page
      10, 10,     // button extent horz(left/right)/vert(up/down)
                  // in pixels
                  // (if zeros, use slider-like layout instead of
                  // scrollbar-like)
      300, 300    // total slider control extent horz/vert in pixels
   );
VERIFY(m_wndToolBarSeek.InsertSpecButton(-1,pSeekScrollerTBB,FALSE));

4.6. How to set menu for a toolbar button

The CExtToolControlBar class stores the HMENU attribute for every button. You can set it by activating CExtToolControlBar::SetButtonMenu().

INT nBtnIdx = m_wndToolBarStandard.CommandToIndex(ID_xxxx);
ASSERT( nBtnIdx >= 0 );
CMenu _menu;
VERIFY(
   _menu.LoadMenu(IDR_MENU_xxxx)
);
VERIFY(
   m_wndToolBarStandard.SetButtonMenu( nBtnIdx, _menu.Detach() )
);

4.7. How to remove a toolbar’s chevron/option buttons

To remove the right-most button in the toolbar, which is also known as “a toolbar option button” or “chevron button,” you should override the CExtToolControlBar::OnCreateBarRightBtn() method and simply return NULL:

class CMyToolControlBar : public CExtToolControlBar
{
   virtual CExtBarContentExpandButton * OnCreateBarRightBtn(){
      return NULL;
   }
};

4.8. How to display Prof-UIS advanced Color Dialog

Prof-UIS provides an advanced color selection dialog with a set of color navigation modes. Just declare the CExtColorDlg object and call DoModal(). Use the m_strCaption member to set a custom dialog caption. To set initial colors, use the m_clrInit and m_clrNew members. Some modes are demonstrated below:

4.9. How to change User Interface Manager

User interface Manager is an instance of CExtPaintManager or the one derived from it and is stored in a global smart pointer variable g_PaintManager. CExtPaintManager methods are used for drawing all supported interface components as provided by the Office 2000/XP/2003 appearance. Prof-UIS also includes the CExtPaintManagerXP and CExtPaintManagerOffice2003 classes used for drawing in the Office XP and Office 2003 styles. The following lines describe how to set the Office 2000/XP/2003 interface style.

VERIFY(
   g_PaintManager.InstallPaintManager( new CExtPaintManager )
);

VERIFY(
   g_PaintManager.InstallPaintManager( new CExtPaintManagerXP )
);

VERIFY(
   g_PaintManager.InstallPaintManager( new CExtPaintManagerOffice2003 )
);
MS Office2000 theme MS OfficeXP theme MS Office2003 theme

5. Samples

DrawCli
This sample application based on Microsoft’s sample with OLE Server-Container technology support illustrates the use of OLE-verb menus, OLE Client-Server compatible control bars, color picker menus both in menu bar and in toolbar, toolbar buttons with dynamically generated icons, owner-draw menu, and more.
GLViews
Demonstrates how to output rendered images (OpenGL animation) both to the main view and to the dockable views resided in resizable control bars. This multithreaded application allows you to select an active camera in each view, set up its parameters, and perform 6 DOF simulation of camera maneuvers. GLViews also illustrates playing an AVI file on a 3D surface, OpenGL stencil buffer-based reflection, and frame image rendering during animation.
Avi Frames
Shows how to work with the slider button built into the Prof-UIS toolbar. The slider features optional scroll arrow buttons like those in the standard scroll bar. The Zoom and Seek slider buttons represented in the sample demonstrate how to control the playing of AVI files.
Status Bar Panes
Demonstrates the features of the Prof-UIS status bar. This control, which is an enhanced version of the standard MFC status bar, enables you to easily add or remove panes on-the-fly. Its panes may contain almost any control you need: buttons, edits, animations, progress bars, and so on.
Funny Bars
Shows how to use icons of different sizes and different color depths in toolbars. It also demonstrates how, for the toolbar buttons, to change the font, font size, and font style of the caption as well as the button image on-the-fly.
ProfUIS_Controls
Illustrates the primary controls, including toolbars and the menu bar in the dialog window, user-defined toolbar buttons, pop-up menus with owner-draw items and left area, menu animation effects, the powerful color picker menu and dialog, status bar control and more…
ResizablePropertySheet
A simple resizable property sheet-based application. Illustrates the usage of the resizable property sheet window as an application’s main window.
ResizableChildSheet
Demonstrates how to use CExtResizablePropertySheet as a child window of the resizable control bar and MDI child frame.
StateInFile
A simple single document interface application without DOC/VIEW architecture support demonstrates how to save the current state of control bars in a file.
MDI_InnerOuterBars
A simple multiply document interface application without DOC/VIEW architecture support demonstrates how to use control bars both in the MDI frame window and in the MDI child window.
FullScreenState
Illustrates full state persistence of control bars when switching between windowed and full screen modes.
FixedSizePanels
Demonstrates how to implement different kinds of bars with fixed size, including dialog bars, palette bars, and custom-drawn panels.
MthOutput
Shows multithreaded output to rich edit controls placed in resizable control bars and MDI child frames.

6. Version History

Version 2.25

Released on July 12, 2004.

New features

  • Enhanced check box and radio button controls whose appearance are based on bitmaps and can be easily customized
  • Group box, which allows its child controls to be drawn correctly when the Office 2003 theme is applied. The new group box also supports three border styles: ETCHED, ROUNDED, and FLAT
  • Context menu to the combo box/edit now supports the Prof-UIS themes
  • Dialog for managing open child windows in MDI-applications (the “Windows…” dialog)
  • Completely renewed Prof-UIS Controls sample, which demonstrates the existing and new features
  • Help file included

Bug fixes

  • Fixed a bug with the white background of the status bar when it was used in dialogs
  • Fixed a bug with black push buttons, check boxes, and radio buttons in resizable dialogs in manifest-based applications on Windows XP
  • Fixed a bug with an invalid size of child pages in the resizable property sheet
  • Fixed a bug with invalid painting of the disabled standard edit window in the resizable dialog
  • Corrected the border of combined menu area when the Office 2003 theme applied
  • Fixed a bug that caused invalid behavior of the context menu over floating control bars
  • Resizable bars now handle the WM_SETTEXT message correctly when they are placed inside the tab container: the caption text and tab item text are now synchronized
  • Improved handling of the main frame window in the full screen state

Version 2.23

Released on January 15, 2004.

New features

  • Improved Office 2003 style
  • Alpha icons for disabled menu and toolbar items used when both the Microsoft Office 2003 style and high/true color monitor modes are on
  • Experimental subsystem of the native Unicode character support
  • German, Polish, Swedish, and Russian localizations

Bug fixes

  • Fixed a bug that caused the crash of complex floating palettes containing more than one resizable bar
  • Corrected a style of toolbar chevron button when the Microsoft Office XP/2003 UI style is turned on

Version 2.22

Released on September 25, 2003.

New features

  • MS Office 2003 theme based both on classic GDI API and native Windows XPs theme API
  • Multiple-monitor support
  • Visual Studio NET 2003 compatibility
  • Improved docking algorithm for toolbars
  • Enhanced algorithm dealt with the message loop now makes resizing windows smoother

Bug fixes

  • Fixed a bug with an incorrect initial position of the system menu when clicking the right mouse button on the dialogs caption
  • Fixed an XP style bug with too dark shadow under the system menu’s items

Version 2.21

Released on July 8, 2003.

New features

  • Fixed-size control bars (an enhanced toolbar and a completely new panel bar) with a new powerful “persistent affixment algorithm” that makes them extremely user-friendly. The control bars can restore their exact positions and sizes after redocking the bars or resizing the frame.
  • Built-in toolbar buttons with divided drop-down areas.
  • CExtButton button control can now support divided drop-down areas.
  • All the context menus over different frame areas (including control bars, docking bars, and floating palettes) and the toolbar’s contents button menu can be constructed on-the-fly.
  • Menu item with a submenu can combine its area with the area of the currently opened submenu.

Bug fixes

  • Fixed a bug dealing with the locked loop when resizing the floating toolbars with icons of size greater than 16×16.

Version 2.20

Released on September 15, 2002.

New features

  • Completely new docking mechanism for resizable control bars
  • Visual Studio .NET-like resizable control bar that optionally shows its content while dragging/resizing as the Task Area bar does in Office 2000 and Office XP
  • Resizable dialog and resizable property sheet with styled push buttons, which both have the new system menu, and resizable property page (these windows also support the MFC automatic tooltip feature for their child toolbar windows)
  • Generalized template window classes for various common tasks like injecting non-client area borders into any window, providing flicker-free repainting, anchoring child windows to the borders of their parent window

Bug fixes

  • Fixed incorrect vertical text painting under Windows NT 4
  • Fixed a bug with crashing the program after clicking the mouse on the “Show/Hide bars” menu item in the expanded button of the toolbar/menu bar

Version 2.15

Released on July 8, 2002.

New features

  • Completely new dragging algorithm for toolbars and resizable control bars
  • Streamlined resizing algorithm for floating control bars
  • Owner-drawn popup menu with the left image area
  • Smoother menu animation effects
  • Support for standard Windows sounds in menu
  • Updated Hue/Saturation/Luminance roller mode in CExtColorCtrl
  • Enhanced 256 color painting
  • Source Code compiled at warning level 4
  • ANSI/MBCS/Unicode support
  • Fully compatible with Visual Studio .NET

Bug fixes

  • Unwanted frame repainting when dragging control bars
  • Bug dealing with painting the owner-drawn CExtComboBox in toolbars
  • Bug arising when auto-completing the user input in the CExtComboBox editor popup menu

Version 2.1

Released on April 13, 2002. First public release.

7. Copyright

The Prof-UIS library presented in this article is freeware software and a subject of this license agreement.

8. Credits

Thanks to all those whose names appear in the library source code, and to anybody whom I have been forgotten to mention. Many thanks to people who submitted bug information.

9. Reporting Bugs

Your questions, suggestions, and bug reports may be posted either to the forum below or to the forum at the Prof-UIS Web site.

10. Additional Information

Any additional information on Prof-UIS as well as its latest versions can be obtained at www.prof-uis.com.

More by Author

Get the Free Newsletter!

Subscribe to Developer Insider for top news, trends & analysis

Must Read