在MFC应用程序中,经常需要创建一些自定义的控件来满足特定的需求。CRulerWnd是一个自定义的控件类,它可以用来在对话框或视图中添加一个标尺。要使用这个控件,需要在对话框编辑器中添加一个自定义控件,并将其类名设置为CRulerWnd。这样,就可以在运行时创建并使用这个控件了。
在CRulerWnd类中,首先需要注册一个窗口类,以便Windows可以识别和创建这个控件。这个过程是通过调用RegisterWindowClass()
成员函数来完成的。如果这个类还没有被注册,需要创建一个新的窗口类。以下是注册窗口类的代码示例:
#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;
}
}
在这个代码中,首先定义了窗口类的名称,并尝试获取这个类的信息。如果获取失败,说明这个类还没有被注册,需要创建一个新的窗口类。设置了窗口类的风格、处理函数、实例句柄、图标、光标、背景画刷和类名。然后,调用AfxRegisterClass
函数来注册这个窗口类。如果注册失败,会抛出一个资源异常。
CRulerWnd控件允许设置窗口样式,以创建不同的外观。例如,可以使用WS_EX_MODALFRAME
和WS_EX_STATICEDGE
等样式。此外,CRulerWnd类提供了许多成员函数来设置控件的属性,如颜色和其他属性。以下是一些获取属性的函数:
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;
}
这些函数允许获取控件的当前样式、背景颜色、毫米线颜色、文字颜色、分隔符大小、边距、毫米像素和分隔符大小。此外,还可以通过调用SetStyle
、SetBackGroundColor
、SetMilimeterLineColor
、SetTextColor
等函数来设置这些属性。
CRulerWnd控件允许添加、删除和修改分隔符。以下是一些相关的函数:
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);
这些函数允许获取、删除和添加分隔符。分隔符可以有颜色、位置、ID号和运动区域。以下是分隔符的结构定义:
typedef struct _tagSEPERATOR_TYPE{
int iPos;
int iType;
int iID;
COLORREF clrLine;
COLORREF clrFill;
int iMinMargin;
int iMaxMargin;
LPARAM lParam;
} SEPERATOR_TYPE;
这个结构定义了分隔符的属性,如位置、类型、ID、线条颜色、填充颜色、最小边距和最大边距。
CRulerWnd控件可以发送通知消息,以便可以处理分隔符的变化。以下是一些相关的定义:
#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;