VC++中HTControl控件类之CHTRichEdit富文本编辑控件实例

所属分类: 软件编程 / C 语言 阅读数: 90
收藏 0 赞 0 分享

本文所述CHTRichEdit控件类继承自CRichEditCtrl,为了避免CRichEditCtrl的界面风格与CRichEditCtr的滚动条不相协调,因此在CHTRichEdit控件中去掉了CRichEditCtrl的默认滚动条,替换成自己绘制的滚动条,这样就不会破坏整体外观了。替换的滚动条并不需要与默认的滚动条同样的宽度,不受操作系统主题的影响,可以支持任意的宽度,而且在不需要滚动条时它会自动消失,使软件布局不会受到影响。

具体实现代码如下:

#if !defined(__CHTRichEdit_H__)
#define __CHTRichEdit_H__
#include "CHTScrollButton.h"
#include "CHTVertScrollBar.h"
#include "CHTHorzScrollBar.h"
class AFX_CLASS_EXPORT CHTRichEdit : public CRichEditCtrl
{
 DECLARE_DYNAMIC(CHTRichEdit)
public:
 CHTRichEdit();
 virtual ~CHTRichEdit();
protected:
 DECLARE_MESSAGE_MAP()
public:
/****************************************************************************
| 函数功能:创建滚动条的按钮                        |
| 输入参数:                                |
| iWidth:  按钮宽                             |
| iHeight: 按钮高                             |
| hBitmapUpNormal: 向上按钮常态位图                    |
| hBitmapUpHover: 向上按钮鼠标停留位图                   |
| hBitmapUpDown: 向上按钮鼠标按下位图                   |
| hBitmapDownNormal: 向下按钮常态位图                   |
| hBitmapDownHover: 向下按钮鼠标停留位图                  |
| hBitmapDownDown: 向下按钮鼠标按下位图                  |
| hBitmapLeftNormal: 向左按钮常态位图                   |
| hBitmapLeftHover: 向左按钮鼠标停留位图                  |
| hBitmapLeftDown: 向左按钮鼠标按下位图                  |
| hBitmapRightNormal: 向右按钮常态位图                  |
| hBitmapRightHover: 向右按钮鼠标停留位图                 |
| hBitmapRightDown: 向右按钮鼠标按下位图                  |
| 输出参数:无                               |
| 返回值: 无                               |
| 说明:                                  |
****************************************************************************/
void CreateButton(int iWidth, int iHeight, HBITMAP hBitmapUpNormal, HBITMAP hBitmapUpHover, HBITMAP hBitmapUpDown,
 HBITMAP hBitmapDownNormal, HBITMAP hBitmapDownHover, HBITMAP hBitmapDownDown,
 HBITMAP hBitmapLeftNormal, HBITMAP hBitmapLeftHover, HBITMAP hBitmapLeftDown,
 HBITMAP hBitmapRightNormal, HBITMAP hBitmapRightHover, HBITMAP hBitmapRightDown);
/****************************************************************************
| 函数功能:创建滚动条                           |
| 输入参数:                                |
| iWidth:  滚动条宽度                           |
| hBmpVBg: 垂直滚动条背景位图                       |
| hBmpVThumb: 垂直滚动条滑块位图                      |
| hBmpVHoverThumb:垂直滚动条鼠标在滑块上的位图               |
| hBmpVPressThumb: 垂直滚动条鼠标按下滑块的位图               |
| hBmpHBg: 水平滚动条背景位图                       |
| hBmpHThumb: 水平滚动条滑块位图                      |
| hBmpHHoverThumb:水平滚动条鼠标在滑块上的位图               |
| hBmpHPressThumb: 水平滚动条鼠标按下滑块的位图               |
| iBgTopLen:滚动条背景位图顶端和左端不可拉伸部分长度            |
| iBgBottomLen:滚动条背景位图底端和右端不可拉伸部分长度          |
| iThumbTopLen:滑块背景位图顶端和左端不可拉伸部分长度           |
| iThumbBottomLen:滑块背景位图底端和右端不可拉伸部分长度          |
| 输出参数:无                               |
| 返回值: 无                               |
| 说明:                                  |
****************************************************************************/
void CreateScrollBar(int iWidth, HBITMAP hBmpVBg, HBITMAP hBmpVThumb, HBITMAP hBmpVHoverThumb, HBITMAP hBmpVPressThumb,
 HBITMAP hBmpHBg, HBITMAP hBmpHThumb, HBITMAP hBmpHHoverThumb, HBITMAP hBmpHPressThumb,
 int iBgTopLen = 0, int iBgBottomLen = 0, int iThumbTopLen = 0, int iThumbBottomLen = 0);
 //以下是重载的原接口,可以查阅MSDN
 virtual BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);
 virtual BOOL CreateEx(DWORD dwExStyle, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);
 void MoveWindow(int x, int y, int nWidth, int nHeight, BOOL bRepaint = TRUE);
 void MoveWindow(LPCRECT lpRect, BOOL bRepaint = TRUE);
 BOOL SetWindowPos(HWND hWndInsertAfter, int x, int y, int cx, int cy, UINT uFlags);
private:
 afx_msg void OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp);
 afx_msg void OnPaint();
 afx_msg void OnEnChange();
 afx_msg void OnNcPaint();
 afx_msg BOOL OnNcActivate(BOOL bActive);
 afx_msg BOOL OnEraseBkgnd(CDC* pDC);
 afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
 afx_msg void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);
 afx_msg void OnEnHscroll();
 afx_msg void OnEnVscroll();
 afx_msg void OnCaptureChanged(CWnd *pWnd);
 afx_msg void OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized);
 afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
 afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
 afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
 afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
 afx_msg void OnTimer(UINT_PTR nIDEvent);
 afx_msg LRESULT OnNcHitTest(CPoint point);
 afx_msg void OnEnRequestresize(NMHDR *pNMHDR, LRESULT *pResult);
 afx_msg void OnSize(UINT nType, int cx, int cy);
 void SetScrollState();
 void UpdateScrollBar();
public:
 CHTScrollButton m_HTButtonUp;
 CHTVertScrollBar m_HTVScrollBar;
 CHTScrollButton m_HTButtonDown;
 CHTScrollButton m_HTButtonLeft;
 CHTHorzScrollBar m_HTHScrollBar;
 CHTScrollButton m_HTButtonRight;
private:
 int m_iBtnHeight;
 int m_iBtnWidth;
 BOOL m_bVScrollBarFlag;
 BOOL m_bHScrollBarFlag;
 int m_iWidth;
 int m_iHeight;
 int m_iX;
 int m_iY;
 BOOL m_bScrollFlag;
 BOOL m_bMoveFlag;
 int m_iScrollBarWidth;
 int m_iScrollBarHeight;
 BOOL m_bFlag;
 int m_iCountV;
 int m_iCountH;
};
#endif //!__CHTRichEdit_H__

代码备有一定的注释,希望本例所述能够对大家有所帮助。

更多精彩内容其他人还在看

用标准c++实现string与各种类型之间的转换

这个类在头文件中定义, < sstream>库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。另外,每个类都有一个对应的宽字符集版本
收藏 0 赞 0 分享

C++如何通过ostringstream实现任意类型转string

再使用整型转string的时候感觉有点棘手,因为itoa不是标准C里面的,而且即便是有itoa,其他类型转string不是很方便。后来去网上找了一下,发现有一个好方法
收藏 0 赞 0 分享

C/C++指针小结

要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区
收藏 0 赞 0 分享

C++ 类的静态成员深入解析

在C++中类的静态成员变量和静态成员函数是个容易出错的地方,本文先通过几个例子来总结静态成员变量和成员函数使用规则,再给出一个实例来加深印象
收藏 0 赞 0 分享

C++类的静态成员初始化详细讲解

通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或是枚举型const,则可以在类声明中初始化
收藏 0 赞 0 分享

C++类静态成员与类静态成员函数详解

静态成员不可在类体内进行赋值,因为它是被所有该类的对象所共享的。你在一个对象里给它赋值,其他对象里的该成员也会发生变化。为了避免混乱,所以不可在类体内进行赋值
收藏 0 赞 0 分享

C++中的friend友元函数详细解析

友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。友元函数的特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样
收藏 0 赞 0 分享

static全局变量与普通的全局变量的区别详细解析

以下是对static全局变量与普通的全局变量的区别进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
收藏 0 赞 0 分享

C++ explicit关键字的应用方法详细讲解

C++ explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢?下面就让我们一起来看看这方面的知识吧
收藏 0 赞 0 分享

教你5分钟轻松搞定内存字节对齐

随便google一下,人家就可以跟你解释的,一大堆的道理,我们没怎么多时间,讨论为何要对齐.直入主题,怎么判断内存对齐规则,sizeof的结果怎么来的,请牢记以下3条原则
收藏 0 赞 0 分享
查看更多