⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 renderedit.h

📁 vc编写的
💻 H
字号:
/*
 Copyright (c) 1999, kSet Lab 
 Author: Konstantin Bukreev 
 E-mail: konstantin@mail.primorye.ru 
 
 Created: 28.09.99 16:40:10
 Version: 1.1.0
  
 Description: render class for line edix box

 
*/

#ifndef _RenderEdit_17e40fc7_75bc_11d3_9285_0080adb811c5
#define _RenderEdit_17e40fc7_75bc_11d3_9285_0080adb811c5

#if _MSC_VER > 1000 
#pragma once
#endif // _MSC_VER > 1000

#include "GdiHelper.h"
#include "HSVModel.h"

template <class T>
class _RenderEdit
{

	class _kSinglePen : public _kPen
	{
	public:
		void Create(int fnPenStyle, int nWidth, COLORREF crColor)
		{
			if (!m_handle)
				_kPen::Create(fnPenStyle, nWidth, crColor);
		}
	};

	COLORREF m_clrBack;
	COLORREF m_clrShadow;
	COLORREF m_clrHighlight;
	COLORREF m_clrBorder;
	COLORREF m_clrContainer;
	COLORREF m_clrText;
	COLORREF m_clrShadowText;
	COLORREF m_clrHighlightText;
	_kSinglePen  m_Pen;

public:
	_RenderEdit() {memset(this, 0, sizeof _RenderEdit<T>);}

	void DrawIt(HDC hdc);
	void Prepare(DISPID);	

private:
	void _DrawText(HDC hdc, POINT& crTxt, TCHAR* pStr, UINT uiLen, COLORREF clrText, COLORREF clrBack, int start = 0, int end = 0);
	
	typedef void (_RenderEdit::*PTR_FDRAW)(_kDrawDC& dc, RECT& rc);
	
	static PTR_FDRAW& f_table (int appearance)
	{
		//appearance
		static PTR_FDRAW table[7] = 
		{			
			&_RenderEdit::draw_flat, //flat
			&_RenderEdit::draw_bottom_line, //bottom line
			&_RenderEdit::draw_border, //border
			&_RenderEdit::draw_3d_border_up, //3d border raised
			&_RenderEdit::draw_3d_border_down, //3d border sunken
			&_RenderEdit::draw_3dlow, //3d low
			&_RenderEdit::draw_3dhigh //3d high						
		};

		ATLASSERT( appearance >= 0 && appearance <= 6);
		return table[appearance];	
	}

	void draw_flat(_kDrawDC& dc, RECT& rc)
	{
		dc.FillSolidRect(&rc, m_clrBack);
	}	
	void draw_bottom_line(_kDrawDC& dc, RECT& rc)
	{
		dc.FillSolidRect(&rc, m_clrBack);

		m_Pen.Create(PS_SOLID, 1, m_clrBorder);
		_kAutoSelect<HPEN> _auto(dc, m_Pen);
		
		MoveToEx(dc, rc.left, rc.bottom - 1, 0);
		LineTo(dc, rc.right, rc.bottom - 1);  			
	}	
	void draw_border(_kDrawDC& dc, RECT& rc)
	{
		dc.FillSolidRect(&rc, m_clrBack);
		dc.DrawBorder   (rc, m_clrBorder);	
	}	
	void draw_3d_border_up(_kDrawDC& dc, RECT& rc)
	{
		dc.FillSolidRect(&rc, m_clrBack);
		dc.Draw3DBorder (rc,  m_clrShadow, true, m_clrHighlight);		
	}	
	void draw_3d_border_down(_kDrawDC& dc, RECT& rc)
	{
		dc.FillSolidRect(&rc, m_clrBack);
		dc.Draw3DBorder(rc,   m_clrShadow, false, m_clrHighlight);
	}	
	void draw_3dlow(_kDrawDC& dc, RECT& rc)
	{
		dc.DrawLowButton(rc, m_clrBack, m_clrHighlight, m_clrShadow, false, false);
	}	
	void draw_3dhigh(_kDrawDC& dc, RECT& rc)
	{
		int x = rc.left; 
		int y = rc.top;
		int cx = rc.right - rc.left;
		int cy = rc.bottom - rc.top;
		dc.FillSolidRect(&rc, m_clrBack);
		dc.Draw3dRect(x + 1, y + 1, cx - 2, cy - 2, RGB(0, 0, 0), m_clrContainer); 			
		dc.Draw3dRect(x, y, cx, cy, m_clrShadow, m_clrHighlight); 			
	}	
	COLORREF Convert (OLE_COLOR oleClr)
	{
		T* pT = (T*)this;
		COLORREF clr = 0;
		OleTranslateColor(oleClr, pT->m_hPalette, &clr);
		return clr;
	}

};

template <class T>
void _RenderEdit<T>::DrawIt(HDC hdc)
{
	T* pT = static_cast<T*>(this);
	
	RECT rc = {0, 0, pT->m_szControl.cx, pT->m_szControl.cy}; //*(RECT*)di.prcBounds;

	//draw edit box	
	(this->*f_table(pT->m_nAppearance))(_kDrawDC(hdc), rc);
	
	//draw text		
	_kAutoSelect<HFONT> _auto(hdc, pT->m_hFont);
			
	TCHAR* pStr = (TCHAR*)&pT->m_pedit->text()[pT->m_uiScroll];		

	int start = 0; 
	int end = 0;	

	if (pT->m_pedit->isselect() && (pT->m_IsFocused || (!pT->m_bHideSelection)))
	{
		start = min(pT->m_pedit->caret(), pT->m_pedit->select()) - pT->m_uiScroll;			
	   end = max(pT->m_pedit->caret(), pT->m_pedit->select()) - pT->m_uiScroll;
		start = max(0, start);
		end   = min(pT->m_uiLength, end);
	}	
	if (pT->m_eFontEffect) 
	{	
		POINT p = pT->m_pTxt;
		if (pT->m_eFontEffect == 1)
		{
			p.x--; p.y--;					
		}
		else
		{
			p.x++; p.y++;			
		}		

		_DrawText(hdc, p, pStr, pT->m_uiLength,  m_clrHighlightText, m_clrBack, start, end);
		_DrawText(hdc, pT->m_pTxt, pStr, pT->m_uiLength,  m_clrShadowText , m_clrBack, start, end);	
	}
	else
	{		
		_DrawText(hdc, pT->m_pTxt, pStr, pT->m_uiLength, m_clrText, m_clrBack, start, end);
	}
}

template <class T>
void _RenderEdit<T>::_DrawText (HDC hdc, POINT& crTxt, TCHAR* pStr, UINT uiLen, COLORREF clrText, COLORREF clrBack, int start, int end)
{
	T* pT = (T*)this;

	if (start != end)
	{
			SIZE szSel; 
			memset(&szSel, 0, sizeof SIZE);

			if (start)
			{
				SetTextColor(hdc, clrText); 
				SetBkMode(hdc, TRANSPARENT);
				TextOut(hdc, crTxt.x, crTxt.y,  pStr, start);
				GetTextExtentPoint32(hdc, pStr, start, &szSel);
			}
										
			SetTextColor(hdc, ~clrText);
			SetBkColor(hdc, ~clrBack);
			SetBkMode(hdc, OPAQUE);					
						
			TextOut(hdc, crTxt.x + szSel.cx, crTxt.y,  &pStr[start],  end - start);

			if (end != uiLen)
			{
				SetTextColor(hdc, clrText);						
				SetBkMode(hdc, TRANSPARENT);
				
				int x = szSel.cx;
				GetTextExtentPoint32(hdc, &pStr[start], end - start, &szSel);
				TextOut(hdc, crTxt.x + x + szSel.cx, crTxt.y,  &pStr[end],  uiLen - end);
			}
	}
	else
	{			
		SetTextColor(hdc, clrText); 
		SetBkMode(hdc, TRANSPARENT);
		TextOut(hdc, crTxt.x, crTxt.y, pStr, uiLen);
	}
}

template <class T>
void _RenderEdit<T>::Prepare(DISPID dispid)
{
	T* pT = static_cast<T*>(this);

	switch (dispid)
	{
		
	case DISPID_BORDERCOLOR: 
		m_clrBorder    = Convert(pT->m_clrBorderColor);
		if (m_Pen.isOk())
			DeleteObject(m_Pen.Detach());		
		break;

	case dispidContainerColor:
		m_clrShadow    = Convert(pT->m_clrShadowColor);
		m_clrHighlight = Convert(pT->m_clrHighlightColor);	
		m_clrContainer = Convert(pT->m_clrContainerColor);
																				//fall				
	case DISPID_ENABLED:		
	case DISPID_FORECOLOR:
		m_clrText = pT->m_bEnabled ? Convert(pT->m_clrForeColor) : Convert(pT->m_clrShadowColor);	 
		break;

	case DISPID_BACKCOLOR:
	case dispidFontEffect:
		m_clrBack = Convert(pT->m_clrBackColor);			
		if (pT->m_eFontEffect)
			pT->Get3DColors(m_clrBack, m_clrShadowText, m_clrHighlightText);			
		
		break;

	default:
		break;
	}	
}

#endif //_RenderEdit_17e40fc7_75bc_11d3_9285_0080adb811c5

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -