示例图(可以设置左右图标,字体颜色,圆角)
一、公共文件
和这篇一样,就不写了(MFC-自绘控件(CButton篇))
二、CEdit
头文件
#pragma once #include "Public.h" //////////////////////////////////////////////////////////////////////// #define TRANS_BACK RGB(255,0,0) #define DEFAULT_COLOR RGB(40,138,228) /////////////////////////////////////////////////////////////////////// class CPngEdit : public CStatic { public: CPngEdit(); ~CPngEdit(); public: // 初始化,左侧图标,右侧图标,圆角,内距 void Init(UINT left_icon, UINT right_icon, int radian = 0, int padding = 0); // 设置内框、外框、字体颜色 void setNormalColor(COLORREF inColor, COLORREF outColor, COLORREF textColor = RGB(0,0,0)); public: BOOL m_bTracking; BOOL m_bHover; Image* m_left_icon; Image* m_right_icon; int m_radian; int m_padding; COLORREF m_normal_in_color; COLORREF m_normal_out_color; COLORREF m_text_color; CEdit m_edit; protected: void OnNcPaint(); void OnPaint(); DECLARE_DYNAMIC(CPngEdit) DECLARE_MESSAGE_MAP() virtual void PreSubclassWindow(); virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); afx_msg BOOL OnEraseBkgnd(CDC* pDC); afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor); void DrawBorder(CDC* dc, CRect &rc); Image *ImageFromResource(HINSTANCE hInstance, UINT uImgID, LPCTSTR lpType); };
#include "stdafx.h" #include "PngEdit.h" IMPLEMENT_DYNAMIC(CPngEdit, CStatic) CPngEdit::CPngEdit() { m_bTracking = m_bHover = FALSE; m_normal_in_color = DEFAULT_COLOR; m_normal_out_color = DEFAULT_COLOR; m_text_color = RGB(0,0,0); m_left_icon = NULL; m_right_icon = NULL; } CPngEdit::~CPngEdit() { } BEGIN_MESSAGE_MAP(CPngEdit, CStatic) ON_WM_NCPAINT() ON_WM_ERASEBKGND() ON_WM_CTLCOLOR() END_MESSAGE_MAP() void CPngEdit::Init(UINT left_icon, UINT right_icon, int radian, int padding) { m_left_icon = ImageFromResource(AfxGetResourceHandle(), left_icon, L"PNG"); m_right_icon = ImageFromResource(AfxGetResourceHandle(), right_icon, L"PNG"); m_radian = radian; m_padding = padding; } void CPngEdit::PreSubclassWindow() { DWORD dwStyle = GetStyle(); SetWindowLong(GetSafeHwnd(), GWL_STYLE, dwStyle | SS_OWNERDRAW | SS_NOTIFY); CStatic::PreSubclassWindow(); } void CPngEdit::OnNcPaint() { CStatic::OnNcPaint(); } void CPngEdit::OnPaint() { CStatic::OnPaint(); } void CPngEdit::setNormalColor(COLORREF inColor, COLORREF outColor, COLORREF textColor) { m_normal_in_color = inColor; m_normal_out_color = outColor; m_text_color = textColor; } Image * CPngEdit::ImageFromResource(HINSTANCE hInstance, UINT uImgID, LPCTSTR lpType) { HRSRC hResInfo = ::FindResource(hInstance, MAKEINTRESOURCE(uImgID), lpType); if (hResInfo == NULL) return NULL; //fail DWORD dwSize; dwSize = SizeofResource(hInstance, hResInfo); //get resource size(bytes) HGLOBAL hResData; hResData = ::LoadResource(hInstance, hResInfo); if (hResData == NULL) return NULL; //fail HGLOBAL hMem; hMem = ::GlobalAlloc(GMEM_MOVEABLE, dwSize); if (hMem == NULL) { ::FreeResource(hResData); return NULL; } LPVOID lpResData, lpMem; lpResData = ::LockResource(hResData); lpMem = ::GlobalLock(hMem); ::CopyMemory(lpMem, lpResData, dwSize); //copy memory ::GlobalUnlock(hMem); ::FreeResource(hResData); //free memory IStream *pStream; HRESULT hr; hr = ::CreateStreamOnHGlobal(hMem, TRUE, &pStream);//create stream object Image *pImage = NULL; if (SUCCEEDED(hr)) { pImage = Image::FromStream(pStream);//get GDI+ pointer pStream->Release(); } ::GlobalFree(hMem); return pImage; } void CPngEdit::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { CRect rc; rc = lpDrawItemStruct->rcItem; CDC dc; dc.Attach(lpDrawItemStruct->hDC); DrawBorder(&dc,rc); rc.DeflateRect(m_padding, m_padding); if (m_left_icon) { rc.left += m_left_icon->GetWidth(); } if (m_right_icon) { rc.right -= m_right_icon->GetWidth(); } if (m_edit.GetSafeHwnd()) { m_edit.ShowWindow(SW_SHOW); } else { m_edit.Create(WS_CHILD | WS_VISIBLE | ES_LEFT | ES_AUTOHSCROLL, rc, this, 1); m_edit.SetFont(GetFont()); } ReleaseDC(&dc); } void CPngEdit::DrawBorder(CDC* dc,CRect &rc) { CPen inpen(PS_SOLID, 1, m_normal_out_color); CPen outpen(PS_SOLID, 1, m_normal_in_color); CPen * oldPen = dc->SelectObject(&inpen); dc->RoundRect(rc, CPoint(m_radian, m_radian)); rc.InflateRect(-1, -1); dc->SelectObject(&outpen); dc->RoundRect(rc, CPoint(m_radian, m_radian)); dc->SelectObject(oldPen); oldPen->Detach(); oldPen = NULL; Graphics graph(dc->GetSafeHdc()); if (m_left_icon) { graph.DrawImage(m_left_icon, 0, 0, 0, 0, m_left_icon->GetWidth(), m_left_icon->GetHeight(), UnitPixel); } if (m_right_icon) { graph.DrawImage(m_right_icon, rc.Width()- m_right_icon->GetWidth(), 0, 0, 0, m_right_icon->GetWidth(), m_right_icon->GetHeight(), UnitPixel); } graph.ReleaseHDC(dc->GetSafeHdc()); } BOOL CPngEdit::OnEraseBkgnd(CDC* pDC) { return TRUE; } HBRUSH CPngEdit::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CStatic::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: 在此更改 DC 的任何特性 pDC->SetTextColor(m_text_color); // TODO: 如果默认的不是所需画笔,则返回另一个画笔 return hbr; }
1、新建一个CStatic控件,绑定到自绘控件类上
CPngEdit m_edit_user; DDX_Control(pDX, IDC_NEWEDIT, m_edit_user); m_edit_user.Init(IDB_PNG_CRBACK, IDB_PNG_CRBACK,8,2); m_edit_user.setNormalColor(RGB(255, 255, 0), RGB(255, 255, 0), RGB(255, 0, 0));