Image 1. Fully opened dialog window.
Image 2. Scrolled dialog window.
A popup dialog window is one of the most common GUI elements in the Windows world. Everybody knows how to create a dialog with
DialogBox function call. Also, everybody knows that popup dialogs are neither resizable nor scrollable by default. Unfortunately there is no good example of simple resizable and scrollable dialog box implemented in pure Win32 API without MFC, ATL, WTL, etc. Most of examples require MFC or some other GUI framework. This article demonstrates how to implement scrollable dialog window in pure Win32 API with Windows Platform SDK.
The idea behind scrollable dialog is extremely simple. All that one needs to do in order to get a scrollable dialog is summarized in the following steps:
- Specify resizable border for a dialog in resource editor or add
WS_THICKFRAME style to dialog template by hand.
- Enable scroll bars for a dialog window or add
WS_VSCROLL | WS_HSCROLL style(s) to dialog window.
Note: The dialog is resizable, however the current sample does not reposition dialog controls according to dialog size. If you need to stretch or shrink dialog contents according to window size, then you will need to do it by yourself.
Using the Code
The sample project for the article is created with Microsoft Visual C++ 2008. However, the code does not use MFC, ATL or any other VC++ specific framework or library. The code can be compiled with any decent C/C++ compiler and requires Windows Platform SDK only.
In order to better organize the source code, the project uses so-called message crackers. Windows message crackers are simple macros defined in WindowsX.h header file, which can be found in PSDK's include directory. Here is the excellent description of Windows message crackers: Message Cracker Wizard for Win32 SDK Developers.
Basically, the algorithm for scrollable dialog is as follows:
WM_INITDIALOG handler, set initial range (maximum and minimum values) and page size for a scrollbar. Make page size the same as the range, so scrollbars are hidden by default.
WM_SIZE handler, set new page size for scrollbars, so scrollbars will recalculate thumb size and redraw it accordingly. New page size equals client area width/height. Scroll window client area into a view if necessary.
WM_VSCROLL message handlers, scroll window client area by requested amount with
ScrollWindow[Ex] call. Update current scrolling position.
The Windows will do the rest.
- 29th January, 2009: Initial post