自定义控件CRulerWnd的实现与使用

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_MODALFRAMEWS_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; }

这些函数允许获取控件的当前样式、背景颜色、毫米线颜色、文字颜色、分隔符大小、边距、毫米像素和分隔符大小。此外,还可以通过调用SetStyleSetBackGroundColorSetMilimeterLineColorSetTextColor等函数来设置这些属性。

添加和删除分隔符

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;
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485