65.9K
CodeProject is changing. Read more.
Home

Size Grip Control

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.31/5 (5 votes)

Aug 29, 2006

CPOL

2 min read

viewsIcon

35516

downloadIcon

263

A very easy way of resizing CWnd based objects.

Sample Image - Size_Grip_Control.jpg

Introduction

First of all, let me say that as an original MFC fan, I am also a great fan of this site. For a very long time, I have been looking for a chance to submit an article. I have developed very interested things, but the majority of those code are specialized to very specific aspects.

The reason

Recently, I was faced with the following issue. How could I resize a control bar or even a singe child control in a visual way (by moving the mouse)? Indeed, there are some great controls here in CodeProject, but they have a lot of code and they are oriented to specific controls.

All of us that use MFC know the peculiarities of CWnd based controls. I have, many times, been stuck for hours or days, trying to figure out how a control behaves. After all these years, I concluded that the most stable control is CWnd, and whenever possible, I skip classic controls and make my own directly from CWnd.

The concept

The files that contain HCSizeGrip are:

  • HCSizeGrip.h
  • HCSizeGrip.cpp

HCSizeGrip is derived directly from the CWnd class. It can be created very simply (by calling the CWnd::Create function), and it can be handled as a classical CWnd object. It uses a hook to capture mouse events.

When you hover the mouse above a HCSizeGrip object, you will see the mouse pointer change (to a sizing arrow). If you press the left button and start dragging the parent CWnd based control of HCSizeGrip, it will start resizing.

There are four orientations of resizing: LEFT, RIGHT, TOP, BOTTOM. The default is RIGHT. If you want to change the resize orientation, use:

BOOL SetResizeOrientation(TResizeOrientation val)

The functions BOOL SetMaxScale(float newVal) and BOOL SetMinScale(float newVal) set the maximum and minimum resize (0 up to 1).

Warnings

I had no time to test this class extensively, but I am sure that t does not work correctly with top level windows like CDialog or CFrameWnd. But I think that it works fine with CDialogBar controls.

Future

In the future, I want to do (when I have the time) virtual resize like all modern task bars have (not actual resize before the mouse movement is complete).