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:
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.
This is the partner of the lower bound.
The scaling factor determines what interval is used to draw major and minor tickers. In the sample, 5 is used. See demo for illustration.
TRUE to create a horizontal ruler (default).
FALSE for vertical.
TRUE for 3D borders (default).
FALSE for flat. See demo.
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);
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.
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.