Click here to Skip to main content
15,115,960 members
Articles / Desktop Programming / MFC
Posted 9 May 2002


33 bookmarked

A general purpose ruler control

Rate me:
Please Sign up or sign in to vote.
4.89/5 (20 votes)
13 May 2002CPOL2 min read
This is a demostration of a general purpose ruler control in use. It consist of 2 apps and the ActiveX control itself. Control code is included.

Sample Image - ruler_control.jpg


After enduring enough abuse from some people on this site for not including the source in my last article, I guess they have succeeded. Here it is, with source, and all you codeheads have wanted. The sample has no executable so the source would have to be compiled. VC++6.0 automatically registers the control. Below is a list and description of the interfaces and how they may be utilized. The ruler itself consists of one CWnd derived class CScale. The implementation is about 2000 lines of code, so I wont be explaining anything here. The function names are pretty intuitive, so u shouldn't have a problem running through them.

void SetRulerInfo(short nLowerLimit,short nUpperLimit,
  short nScalingFactor,BOOL bHorz,BOOL  b3DLook,BOOL AutoResize);

This is the only method I thought needed explaining, as you can see, the rest are just getter and setter methods, with the exception of the message senders (which I'll get to soon). This method is used to set the properties of the ruler at run time in one atomic operation. The parameters are explained as follows:

short nLowerLimit

As the name suggests, sets the lower bound of the scale (left/top for horizontal ruler and vertical ruler respectively). The lower bound is a pixel location in client coordinate.

short nUpperLimit

This is the partner of the lower bound.

short nScalingFactor

The scaling factor determines what interval is used to draw major and minor tickers. In the sample, 5 is used. See demo for illustration.

BOOL bHorz

TRUE to create a horizontal ruler (default). FALSE for vertical.

BOOL  b3DLook

TRUE for 3D borders (default). FALSE for flat. See demo.

BOOL bAutoResize

This feature allows the ruler's scale to be resized at runtime without calling the setter methods. When on, resize handles appear at the side of the ruler. These are just setter and getter methods for the above properties.

void SetLowerLimit(short nLowerLimit);
void SetUpperLimit(short nUpperLimit);
void SetScalingFactor(short nScalingFactor);
void SetLook(BOOL bLook3D);
void SetAlignment(BOOL bHorz);
void SetAutoResize(BOOL bAutoResize);
short GetLowerLimit();
short GetUpperLimit();
short GetScalingFactor();
BOOL IsHorzAligned();
BOOL Has3DBorders();

Mouse event firers

void StartTracking(short nFlag, OLE_XPOS_PIXELS nX, OLE_YPOS_PIXELS nY);
void StopTracking(short nFlags, OLE_XPOS_PIXELS nX, OLE_YPOS_PIXELS nY);
void Track(short nFlags, OLE_XPOS_PIXELS nX, OLE_YPOS_PIXELS nY);

The above events are fired as a result of the mouse down, mouse up, and mouse move events respectively. nX and nY are the points in screen coordinates and should be converted into client coordinates before used. The nFlag is used to indicate which scaler is being used, 0 for regular arrow movement, 1 for left bar and 2 for right bar. See demo for illustration.


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


About the Author

Web Developer
United States United States
biography? I am not that old yet.

Comments and Discussions

GeneralASSERT failure Pin
BogMan18-Jun-02 18:34
MemberBogMan18-Jun-02 18:34 
GeneralRe: ASSERT failure Pin
Edd18-Jun-02 19:44
MemberEdd18-Jun-02 19:44 
Generalthanks Edd Pin
mloibl12-May-02 9:14
Membermloibl12-May-02 9:14 
GeneralRe: thanks Edd Pin
mystro_AKA_kokie12-May-02 9:37
Membermystro_AKA_kokie12-May-02 9:37 
GeneralRe: thanks Edd Pin
machiav13-May-02 23:19
Membermachiav13-May-02 23:19 

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

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