Click here to Skip to main content
Licence CPOL
First Posted 29 Jan 2009
Views 28,506
Downloads 984
Bookmarked 38 times

Scrollable Dialog in Pure Win32 API

By | 29 Jan 2009 | Article
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

Member

More than ten years of C++ native development, and counting.
 
Smile | :)

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
Questionadding scroll bars initially Pinmembermike dorl5:24 31 Jan '12  
AnswerRe: adding scroll bars initially PinmemberAlex Blekhman15:57 31 Jan '12  
GeneralRe: adding scroll bars initially Pinmembermike dorl7:39 1 Feb '12  
Questionmaximize Pinmembermike dorl8:28 30 Jan '12  
AnswerRe: maximize PinmemberAlex Blekhman11:24 30 Jan '12  
GeneralRe: maximize PinmemberMike Dorl11:51 1 Feb '12  
Bugstatic variables in SD_ScrollClient() Pinmemberevgeniy.ukhanov14:43 3 Nov '11  
GeneralRe: static variables in SD_ScrollClient() PinmemberAlex Blekhman16:37 3 Nov '11  
Generalport to WinCE Pinmemberevgeniy.ukhanov14:23 2 Nov '11  
GeneralRe: port to WinCE PinmemberAlex Blekhman16:09 2 Nov '11  
GeneralMy vote of 5 PinmemberViSlav10:45 16 Jul '10  
Generalit's useful code to me. thx! PinmemberNice Gom15:02 25 May '10  
GeneralWorks great with win32++ Pinmembermayo20003:50 22 Jun '09  
GeneralRe: Works great with win32++ PinmemberAlex Blekhman3:58 22 Jun '09  
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.moestl5:22 28 May '09  
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 Blekhman6:56 28 May '09  
GeneralMy vote of 1 Pinmemberryo-oh-ki16:55 2 Feb '09  
GeneralRe: My vote of 1 Pinmembermaplewang16:11 17 Feb '09  
General.h file PinmemberMayIsONe3:30 1 Feb '09  
GeneralRe: .h file PinmemberAlex Blekhman3:35 1 Feb '09  
GeneralMessage Automatically Removed Pinmemberkilt13:18 30 Jan '09  

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.

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