Click here to Skip to main content
Click here to Skip to main content

Scrollable Dialog in Pure Win32 API

, 29 Jan 2009
Rate this:
Please Sign up or sign in to vote.
Minimalistic example of scrollable dialog implemented in pure Win32 API

ScrollDialog

Image 1. Fully opened dialog window.

scroll_dialog_resize.png

Image 2. Scrolled dialog window.

Introduction

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.

Background

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:

  1. Specify resizable border for a dialog in resource editor or add WS_THICKFRAME style to dialog template by hand.
  2. Enable scroll bars for a dialog window or add WS_VSCROLL | WS_HSCROLL style(s) to dialog window.
  3. Handle WM_RESIZE, WM_HSCROLL and WM_VSCROLL messages.

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:

  1. In 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.
  2. In 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.
  3. In WM_HSCROLL and 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.

History

  • 29th January, 2009: Initial post

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Alex Blekhman
Software Developer
Australia Australia
More than ten years of C++ native development, and counting.
 
Smile | :)

Comments and Discussions

 
QuestionWhat is the GetScrollInfo function called on lines 110 and 174? PinmemberSMD11130-May-14 9:47 
GeneralMy vote of 5 Pinmembergayantcc19-Apr-13 5:02 
GeneralRe: My vote of 5 PinmemberAlex Blekhman19-Apr-13 12:13 
SuggestionA great article [modified] PinmemberLupinTaiwan10-Apr-13 17:53 
GeneralRe: A great article PinmemberAlex Blekhman12-Apr-13 14:08 
Questionadding scroll bars initially Pinmembermike dorl31-Jan-12 5:24 
AnswerRe: adding scroll bars initially PinmemberAlex Blekhman31-Jan-12 15:57 
GeneralRe: adding scroll bars initially Pinmembermike dorl1-Feb-12 7:39 
Questionmaximize Pinmembermike dorl30-Jan-12 8:28 
AnswerRe: maximize PinmemberAlex Blekhman30-Jan-12 11:24 
GeneralRe: maximize PinmemberMike Dorl1-Feb-12 11:51 
Bugstatic variables in SD_ScrollClient() Pinmemberevgeniy.ukhanov3-Nov-11 14:43 
GeneralRe: static variables in SD_ScrollClient() PinmemberAlex Blekhman3-Nov-11 16:37 
Generalport to WinCE Pinmemberevgeniy.ukhanov2-Nov-11 14:23 
GeneralRe: port to WinCE PinmemberAlex Blekhman2-Nov-11 16:09 
GeneralMy vote of 5 PinmemberViSlav16-Jul-10 10:45 
Generalit's useful code to me. thx! PinmemberNice Gom25-May-10 15:02 
GeneralWorks great with win32++ Pinmembermayo200022-Jun-09 3:50 
GeneralRe: Works great with win32++ PinmemberAlex Blekhman22-Jun-09 3:58 
Generalthere is a bug ... if I resize the dialog smaller and then maximize it, i can only see the same section like bevore, not the complete dialog... Pinmemberm.moestl28-May-09 5:22 
GeneralRe: there is a bug ... if I resize the dialog smaller and then maximize it, i can only see the same section like bevore, not the complete dialog... PinmemberAlex Blekhman28-May-09 6:56 
GeneralMy vote of 1 Pinmemberryo-oh-ki2-Feb-09 16:55 
GeneralRe: My vote of 1 Pinmembermaplewang17-Feb-09 16:11 
General.h file PinmemberMayIsONe1-Feb-09 3:30 
GeneralRe: .h file PinmemberAlex Blekhman1-Feb-09 3:35 

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

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

| Advertise | Privacy | Mobile
Web03 | 2.8.140721.1 | Last Updated 30 Jan 2009
Article Copyright 2009 by Alex Blekhman
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid