CAD工具之家's Archivers

From boitboy on 2014-02-17 15:40:38

一个Edit控件的扩展类

一、 一个Edit控件的扩展类 转:http://hi.baidu.com/%CF%FB%BB%EA%D2%B9/blog/item/4711ce1a457cb10c35fa41fe.html   自己写的一个Edit控件的扩展类(源码)修改版 2010年01月17日 星期日 下午 04:35 #if !defined(AFX_COOLEDIT_H__3F4B9BD7_EFF9_45F5_AD79_EEF2B95742B3__INCLUDED_) #define AFX_COOLEDIT_H__3F4B9BD7_EFF9_45F5_AD79_EEF2B95742B3__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 // CoolEdit.h : header file // /* 作者:段晓辉 版本:2.0 功能:对标准的Edit控件进行扩展,可以在标准的控件中加入小位图, 并可以改变背景、文字的颜色和文字的字体。 接口: void SetEditFont(LPLOGFONT lpFont);////功能:设置编辑框的字体 void SetTextColor(COLORREF textColor);//功能:设置编辑框字体的颜色 void SetBkColor(COLORREF bkColor);//功能:设置编辑框的背景颜色 void LoadBitmap(UINT bmpID);//功能:在编辑框内增加位图 void SetClearBk(BOOL bClearBk = TRUE);//功能:设置是否对图标的背景进行去除操作,默认为清除。 void SetClearColor(COLORREF clearColor = RGB(255, 255, 255));//设置要去除的颜色。 修改: 1、修改了小图标不能和编辑框相匹配的问题 2、修改了当改变编辑框背景色时,图标有边框(背景)的问题 */ ///////////////////////////////////////////////////////////////////////////// // CCoolEdit window class CCoolEdit : public CEdit { // Construction public: CCoolEdit(); // Attributes public: // Operations public: // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CCoolEdit) //}}AFX_VIRTUAL // Implementation public: void SetClearColor(COLORREF clearColor = RGB(255, 255, 255)); void SetClearBk(BOOL bClearBk = TRUE); void SetEditFont(LPLOGFONT lpFont); void SetTextColor(COLORREF textColor); void SetBkColor(COLORREF bkColor); void LoadBitmap(UINT bmpID); virtual ~CCoolEdit(); // Generated message map functions protected: //{{AFX_MSG(CCoolEdit) afx_msg BOOL OnEraseBkgnd(CDC* pDC); afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor); afx_msg void OnSetFocus(CWnd* pOldWnd); afx_msg void OnChange(); //}}AFX_MSG DECLARE_MESSAGE_MAP() private: COLORREF m_clearColor; BOOL m_bClearBk; CFont m_font; CBrush m_brush; COLORREF m_colBack;//背景颜色 COLORREF m_colText;//文本颜色 CBitmap m_bmpBack;//用于保存加载的位图 BITMAP bmpBack; }; ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_COOLEDIT_H__3F4B9BD7_EFF9_45F5_AD79_EEF2B95742B3__INCLUDED_)       // CoolEdit.cpp : implementation file // #include "stdafx.h" //#include "wdm.h" #include "CoolEdit.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CCoolEdit CCoolEdit::CCoolEdit() { this->m_colBack = RGB(255, 255, 255); this->m_colText = RGB(0, 0, 0); this->m_brush.CreateStockObject(NULL_BRUSH); this->m_bClearBk = TRUE; this->m_clearColor = RGB(255, 255, 255); } CCoolEdit::~CCoolEdit() { } BEGIN_MESSAGE_MAP(CCoolEdit, CEdit) //{{AFX_MSG_MAP(CCoolEdit) ON_WM_ERASEBKGND() ON_WM_CTLCOLOR_REFLECT() ON_WM_SETFOCUS() ON_CONTROL_REFLECT(EN_CHANGE, OnChange) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CCoolEdit message handlers //功能:绘制背景 BOOL CCoolEdit::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default if(this->m_bmpBack.GetSafeHandle() != NULL) {    CDC dcMem;    dcMem.CreateCompatibleDC(pDC);    CBitmap *pOldBitmap = dcMem.SelectObject(&m_bmpBack);    CRect re;    CBrush brush;    GetClientRect(&re);    brush.CreateSolidBrush(m_colBack);    pDC->FillRect(&re, &brush);    COLORREF Old = dcMem.SetBkColor(this->m_clearColor); //   pDC->BitBlt(0, 0, bmpBack.bmWidth, bmpBack.bmHeight, &dcMem, 0, 0, SRCCOPY);    int bl = bmpBack.bmWidth/bmpBack.bmHeight;    if(this->m_bClearBk)    {     pDC->StretchBlt(0, 0, re.Height()*bl, re.Height(), &dcMem, 0, 0, bmpBack.bmWidth, bmpBack.bmHeight, SRCINVERT);     CDC dcMask;     dcMask.CreateCompatibleDC(pDC);     CBitmap bitmapMask;     bitmapMask.CreateBitmap(re.Height()*bl, re.Height(), 1, 1, NULL); //把mask位图装入mask DC     CBitmap* pOldBitmapMask = dcMask.SelectObject(&bitmapMask); //用透明色创建“掩码”位图       dcMask.StretchBlt(0, 0, re.Height()*bl, re.Height(), &dcMem, 0, 0, bmpBack.bmWidth, bmpBack.bmHeight, SRCCOPY);     pDC->BitBlt(0, 0, re.Height()*bl, re.Height(), &dcMask, 0, 0, SRCAND);     pDC->StretchBlt(0, 0, re.Height()*bl, re.Height(), &dcMem, 0, 0, bmpBack.bmWidth, bmpBack.bmHeight, SRCINVERT);    }    else    {     pDC->StretchBlt(0, 0, re.Height()*bl, re.Height(), &dcMem, 0, 0, bmpBack.bmWidth, bmpBack.bmHeight, SRCCOPY);    }    dcMem.SelectObject(pOldBitmap);    dcMem.SetBkColor(Old);    return TRUE; } return CEdit::OnEraseBkgnd(pDC); } //功能:加载位图资源并依附于m_bmpBack对象 void CCoolEdit::LoadBitmap(UINT bmpID) { if(this->m_bmpBack.GetSafeHandle() != NULL) {    this->m_bmpBack.DeleteObject();    this->m_bmpBack.LoadBitmap(bmpID); } else {    this->m_bmpBack.LoadBitmap(bmpID); } this->m_bmpBack.GetBitmap(&bmpBack); // this->m_bmpBack.GetBitmap(&bmpChange); }   HBRUSH CCoolEdit::CtlColor(CDC* pDC, UINT nCtlColor) { pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(this->m_colText); pDC->SetBkColor(this->m_colBack); if(this->m_bmpBack.GetSafeHandle() == NULL) {    this->m_brush.DeleteObject();    this->m_brush.CreateSolidBrush(this->m_colBack);    return this->m_brush; } else {    return this->m_brush; } // TODO: Return a non-NULL brush if the parent's handler should not be called // return NULL; } //功能:当编辑框获得焦点时,设置光标的正确位置 void CCoolEdit::OnSetFocus(CWnd* pOldWnd) { // TODO: Add your message handler code here if(this->m_bmpBack.GetSafeHandle() != NULL) {    int bl = bmpBack.bmWidth/bmpBack.bmHeight; ///   SetMargins(this->bmpBack.bmWidth,1);    CRect re;    GetClientRect(&re);    SetMargins(re.Height()*bl,1); } CEdit::OnSetFocus(pOldWnd); } void CCoolEdit::OnChange() { // TODO: If this is a RICHEDIT control, the control will not // send this notification unless you override the CEdit::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask. // TODO: Add your control notification handler code here Invalidate(); } //功能:设置编辑框的背景颜色 void CCoolEdit::SetBkColor(COLORREF bkColor) { this->m_colBack = bkColor; Invalidate(); } //功能:设置编辑框字体的颜色 void CCoolEdit::SetTextColor(COLORREF textColor) { this->m_colText = textColor; Invalidate(); } //功能:设置编辑框的字体 void CCoolEdit::SetEditFont(LPLOGFONT lpFont) { if(m_font.GetSafeHandle() != NULL) {    m_font.DeleteObject(); } m_font.CreateFontIndirect(lpFont); SetFont(&m_font); }   void CCoolEdit::SetClearBk(BOOL bClearBk) { this->m_bClearBk = bClearBk; } void CCoolEdit::SetClearColor(COLORREF clearColor) { this->m_clearColor = clearColor; }     二、 在evc下面的edit控件背景贴图 转:http://hi.baidu.com/%CA%AE%C6%DF%C8%D5%D4%C2/blog/item/0f767aec61380836279791ac.html     这个是很久以前写的程序了。这里贴出来是为了方便以后找资料。 下面的是头文件的代码: //EditCtrl.h #if !defined(AFX_EDITCTRL_H__DCBB58E6_7C67_4656_9CA1_BE3793A759FA__INCLUDED_) #define AFX_EDITCTRL_H__DCBB58E6_7C67_4656_9CA1_BE3793A759FA__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 // EditCtrl.h : header file // #include   <Sipapi.h> ///////////////////////////////////////////////////////////////////////////// // CEditCtrl window class CEditCtrl : public CEdit { // Construction public: CEditCtrl(); // Attributes public: CBitmap* m_MainBmp; CBitmap *m_pOldMianBmp; BOOL    flag; int   Width; int     Height; BOOL    IsPanDown; HIMC    m_hImc; // Operations public: // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CEditCtrl) protected: virtual BOOL PreCreateWindow(CREATESTRUCT& cs); //}}AFX_VIRTUAL // Implementation public: void SetInvalidate(BOOL bPanDown =FALSE); void GetBkBmp(CBitmap* bkbmp); virtual ~CEditCtrl(); // Generated message map functions protected: //{{AFX_MSG(CEditCtrl) afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor); afx_msg BOOL OnEraseBkgnd(CDC* pDC); afx_msg void OnChange(); afx_msg void OnLButtonUp(UINT nFlags, CPoint point); afx_msg void OnMouseMove(UINT nFlags, CPoint point); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_EDITCTRL_H__DCBB58E6_7C67_4656_9CA1_BE3793A759FA__INCLUDED_) //下面是源文件的代码: //EditCtrl.cpp // EditCtrl.cpp : implementation file // #include "StdAfx.h" #include "2530templatedll.h" #include "EditCtrl.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CEditCtrl CEditCtrl::CEditCtrl() { flag   =FALSE; Width =0; Height =0; IsPanDown =FALSE; } CEditCtrl::~CEditCtrl() { } BEGIN_MESSAGE_MAP(CEditCtrl, CEdit) //{{AFX_MSG_MAP(CEditCtrl) ON_WM_CTLCOLOR_REFLECT() ON_WM_ERASEBKGND() ON_CONTROL_REFLECT(EN_CHANGE, OnChange) ON_WM_LBUTTONUP() ON_WM_MOUSEMOVE() ON_WM_LBUTTONDOWN() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CEditCtrl message handlers HBRUSH CEditCtrl::CtlColor(CDC* pDC, UINT nCtlColor) { // TODO: Change any attributes of the DC here pDC->SetBkMode(TRANSPARENT); ///选择透明背景模式 return HBRUSH(GetStockObject(HOLLOW_BRUSH)); return NULL; } BOOL CEditCtrl::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default CDC m_MianDC; //创建与内存兼容的DC m_MianDC.CreateCompatibleDC(pDC); m_pOldMianBmp =m_MianDC.SelectObject(m_MainBmp); pDC->BitBlt(0, 0, Width, Height, &m_MianDC, 0, 0, SRCCOPY); m_MianDC.SelectObject(m_pOldMianBmp); m_MianDC.DeleteDC(); return TRUE; } void CEditCtrl::OnChange() { // TODO: Add your control notification handler code here Invalidate(); } void CEditCtrl::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default if(!IsPanDown)    Invalidate(); else {    ::SetCapture(NULL);    ClientToScreen(&point);    GetParent()->SendMessage(WM_LBUTTONUP, (WPARAM)m_hWnd, (LPARAM)MAKELONG(point.x,point.y)); } CEdit::OnLButtonUp(nFlags, point); } void CEditCtrl::GetBkBmp(CBitmap* bkbmp) { BITMAP bm; m_MainBmp =bkbmp; //将位图资源与句柄绑定 m_MainBmp->GetObject(sizeof(BITMAP),&bm);     Width =bm.bmWidth; Height =bm.bmHeight; /* CString str; str.Format(_T("%d,%d"),Width,Height); AfxMessageBox(str); */ } void CEditCtrl::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default ::SetCapture(NULL); ClientToScreen(&point); GetParent()->SendMessage(WM_MOUSEMOVE, (WPARAM)m_hWnd, (LPARAM)MAKELONG(point.x,point.y)); CEdit::OnMouseMove(nFlags, point); } void CEditCtrl::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default ::SetCapture(NULL); ClientToScreen(&point); GetParent()->SendMessage(WM_LBUTTONDOWN, (WPARAM)m_hWnd, (LPARAM)MAKELONG(point.x,point.y)); CEdit::OnLButtonDown(nFlags, point); } void CEditCtrl::SetInvalidate(BOOL bPanDown) { IsPanDown =bPanDown; } BOOL CEditCtrl::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Add your specialized code here and/or call the base class return CEdit::PreCreateWindow(cs); }

查看完整版本: 一个Edit控件的扩展类

Tags: CEdit, 颜色


©CAD工具之家
创办于:2013年5月24日