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.
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
The files that contain
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:
BOTTOM. The default is
RIGHT. If you want to change the resize orientation, use:
BOOL SetResizeOrientation(TResizeOrientation val)
BOOL SetMaxScale(float newVal) and
BOOL SetMinScale(float newVal) set the maximum and minimum resize (0 up to 1).
I had no time to test this class extensively, but I am sure that t does not work correctly with top level windows like
CFrameWnd. But I think that it works fine with
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).