Introduction
This control is derived from MFC's CWnd
class. While you are adding this to your dialogbox, you should select "custom control", whose class name should be CRulerWnd,
else, you can't create this control. This control can be located in any dialogbox or View. The RegisterWindowClass()
member function will register this window class to Windows. After that, you will not have any problem when you create it. The class will be unregistered in the destructor member function.
Details
#define RULERWINDOW_CLASSNAME _T( "CRulerWnd" )
WNDCLASS wndcls;
HINSTANCE hInst = AfxGetResourceHandle();
if ( !( ::GetClassInfo( hInst, RULERWINDOW_CLASSNAME , &wndcls ) ) )
{
wndcls.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
wndcls.lpfnWndProc = ::DefWindowProc;
wndcls.cbClsExtra = wndcls.cbWndExtra = 0;
wndcls.hInstance = hInst;
wndcls.hIcon = NULL;
#ifndef _WIN32_WCE_NO_CURSOR
wndcls.hCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
#else
wndcls.hCursor = 0;
#endif
wndcls.hbrBackground = (HBRUSH)( COLOR_3DFACE + 1 );
wndcls.lpszMenuName = NULL;
wndcls.lpszClassName = RULERWINDOW_CLASSNAME;
if( !AfxRegisterClass( &wndcls ) )
{
AfxThrowResourceException();
return FALSE;
}
}
You can select your window styles what you want. For instance, WS_EX_MODALFRAME
, WS_EX_STATICEDGE
etc. to create for miscellaneous appearance. This control has a lot of member functions for setting it up. You can use them to change colors and other things.
DWORD GetStyle() { return m_dwStyle; }
COLORREF GetBackGroundColor() { return m_clrBackGround; }
COLORREF GetMilimeterLineColor() { return m_clrMilimeterLineColor; }
COLORREF GetTextColor() { return m_clrTextColor; }
UINT GetStartSeperateSize() { return m_nSeperateSize; }
UINT GetMargin() { return m_nRulerMargin; }
UINT GetMilimeterPixel() { return m_nMilimeterPixel; }
UINT GetSeperatorSize() { return m_nSeperatorSize; }
long GetScrollPos() { return m_lScrolPos; }
CWnd* GetMessageTarget() { return m_pMessageTarget; }
BOOL SetStyle( DWORD dwStyle );
BOOL SetBackGroundColor( COLORREF clr );
BOOL SetMilimeterLineColor( COLORREF clr );
BOOL SetTextColor( COLORREF clr );
BOOL SetStartSeperateSize( UINT nSize );
BOOL SetMargin( UINT nMargin );
BOOL SetMilimeterPixel( UINT nPixel );
BOOL SetSeperatorSize( UINT nSize );
BOOL SetScrollPos( long lPos );
BOOL SetMessageTarget( CWnd *pTarget = NULL );
Additionaly, you can add a separator, delete it, change position etc.
SEPERATOR_TYPE* GetSeperator( int iID );
int DeleteAllSeperator();
int DeleteSeperator( int iID );
int AddSeperator( int iPos , int iID , int iType = 0 ,
LPARAM lParam = NULL ,
COLORREF clrLine = RGB( 0 , 0 , 0 ) ,
COLORREF clrFill = RGB( 255 ,255 , 220 ) ,
int iMinMargin = 0 , int iMaxMargin = 0xFFFFFFF );
For taking separators, use
CPtrArray
collection.
typedef struct _tagSEPERATOR_TYPE{
int iPos;
int iType;
int iID;
COLORREF clrLine;
COLORREF clrFill;
int iMinMargin;
int iMaxMargin;
LPARAM lParam;
}SEPERATOR_TYPE;
This structure is separate and to the point for each separator above. Additionaly, you can set up each separator which can have color, position, id number and motion zone. These are shown as below. All notifications can be sent to whichever window will be the target. This notification is as below:
#define NM_RULER_NOTIFICATIONMESSAGE 0x1112
#define NMSUB_RULER_SEPERATORCHANGE 0x0001
#define NMSUB_RULER_SEPERATORCHANGING 0x0002
typedef struct _tagRULERWNDNOTIFY_INFO{
NMHDR hdr;
UINT nSubMessage;
DWORD dwRulerStyle;
int iSepID;
int iNewPos;
int iOldPos;
int iParam1;
int iParam2;
}RULERWNDNOTIFY_INFO;