📄 renderedit.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 + -