VC++中HTControl控件类之CHTRichEdit富文本编辑控件实例
本文所述CHTRichEdit控件类继承自CRichEditCtrl,为了避免CRichEditCtrl的界面风格与CRichEditCtr的滚动条不相协调,因此在CHTRichEdit控件中去掉了CRichEditCtrl的默认滚动条,替换成自己绘制的滚动条,这样就不会破坏整体外观了。替换的滚动条并不需要与默认的滚动条同样的宽度,不受操作系统主题的影响,可以支持任意的宽度,而且在不需要滚动条时它会自动消失,使软件布局不会受到影响。
具体实现代码如下:
#if!defined(__CHTRichEdit_H__) #define__CHTRichEdit_H__ #include"CHTScrollButton.h" #include"CHTVertScrollBar.h" #include"CHTHorzScrollBar.h" classAFX_CLASS_EXPORTCHTRichEdit:publicCRichEditCtrl { 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:向右按钮鼠标按下位图| |输出参数:无| |返回值:无| |说明:| ****************************************************************************/ voidCreateButton(intiWidth,intiHeight,HBITMAPhBitmapUpNormal,HBITMAPhBitmapUpHover,HBITMAPhBitmapUpDown, HBITMAPhBitmapDownNormal,HBITMAPhBitmapDownHover,HBITMAPhBitmapDownDown, HBITMAPhBitmapLeftNormal,HBITMAPhBitmapLeftHover,HBITMAPhBitmapLeftDown, HBITMAPhBitmapRightNormal,HBITMAPhBitmapRightHover,HBITMAPhBitmapRightDown); /**************************************************************************** |函数功能:创建滚动条| |输入参数:| |iWidth:滚动条宽度| |hBmpVBg:垂直滚动条背景位图| |hBmpVThumb:垂直滚动条滑块位图| |hBmpVHoverThumb:垂直滚动条鼠标在滑块上的位图| |hBmpVPressThumb:垂直滚动条鼠标按下滑块的位图| |hBmpHBg:水平滚动条背景位图| |hBmpHThumb:水平滚动条滑块位图| |hBmpHHoverThumb:水平滚动条鼠标在滑块上的位图| |hBmpHPressThumb:水平滚动条鼠标按下滑块的位图| |iBgTopLen:滚动条背景位图顶端和左端不可拉伸部分长度| |iBgBottomLen:滚动条背景位图底端和右端不可拉伸部分长度| |iThumbTopLen:滑块背景位图顶端和左端不可拉伸部分长度| |iThumbBottomLen:滑块背景位图底端和右端不可拉伸部分长度| |输出参数:无| |返回值:无| |说明:| ****************************************************************************/ voidCreateScrollBar(intiWidth,HBITMAPhBmpVBg,HBITMAPhBmpVThumb,HBITMAPhBmpVHoverThumb,HBITMAPhBmpVPressThumb, HBITMAPhBmpHBg,HBITMAPhBmpHThumb,HBITMAPhBmpHHoverThumb,HBITMAPhBmpHPressThumb, intiBgTopLen=0,intiBgBottomLen=0,intiThumbTopLen=0,intiThumbBottomLen=0); //以下是重载的原接口,可以查阅MSDN virtualBOOLCreate(DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID); virtualBOOLCreateEx(DWORDdwExStyle,DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID); voidMoveWindow(intx,inty,intnWidth,intnHeight,BOOLbRepaint=TRUE); voidMoveWindow(LPCRECTlpRect,BOOLbRepaint=TRUE); BOOLSetWindowPos(HWNDhWndInsertAfter,intx,inty,intcx,intcy,UINTuFlags); private: afx_msgvoidOnNcCalcSize(BOOLbCalcValidRects,NCCALCSIZE_PARAMS*lpncsp); afx_msgvoidOnPaint(); afx_msgvoidOnEnChange(); afx_msgvoidOnNcPaint(); afx_msgBOOLOnNcActivate(BOOLbActive); afx_msgBOOLOnEraseBkgnd(CDC*pDC); afx_msgvoidOnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags); afx_msgvoidOnKeyUp(UINTnChar,UINTnRepCnt,UINTnFlags); afx_msgvoidOnEnHscroll(); afx_msgvoidOnEnVscroll(); afx_msgvoidOnCaptureChanged(CWnd*pWnd); afx_msgvoidOnActivate(UINTnState,CWnd*pWndOther,BOOLbMinimized); afx_msgvoidOnChar(UINTnChar,UINTnRepCnt,UINTnFlags); afx_msgvoidOnVScroll(UINTnSBCode,UINTnPos,CScrollBar*pScrollBar); afx_msgvoidOnHScroll(UINTnSBCode,UINTnPos,CScrollBar*pScrollBar); afx_msgBOOLOnMouseWheel(UINTnFlags,shortzDelta,CPointpt); afx_msgvoidOnTimer(UINT_PTRnIDEvent); afx_msgLRESULTOnNcHitTest(CPointpoint); afx_msgvoidOnEnRequestresize(NMHDR*pNMHDR,LRESULT*pResult); afx_msgvoidOnSize(UINTnType,intcx,intcy); voidSetScrollState(); voidUpdateScrollBar(); public: CHTScrollButtonm_HTButtonUp; CHTVertScrollBarm_HTVScrollBar; CHTScrollButtonm_HTButtonDown; CHTScrollButtonm_HTButtonLeft; CHTHorzScrollBarm_HTHScrollBar; CHTScrollButtonm_HTButtonRight; private: intm_iBtnHeight; intm_iBtnWidth; BOOLm_bVScrollBarFlag; BOOLm_bHScrollBarFlag; intm_iWidth; intm_iHeight; intm_iX; intm_iY; BOOLm_bScrollFlag; BOOLm_bMoveFlag; intm_iScrollBarWidth; intm_iScrollBarHeight; BOOLm_bFlag; intm_iCountV; intm_iCountH; }; #endif//!__CHTRichEdit_H__
代码备有一定的注释,希望本例所述能够对大家有所帮助。