📄 fontcurvectl.cpp
字号:
/*******************************************************************************
注意:
1. 此控件是以传入数据的各个bit位是否为1,来组建Grid队列;然后通过Grid队列对
矩形区域进行绘图;
2. 目前支持可变的属性有:背景色的变换、GRID网格颜色的变换、Grid边线颜色的变换、
Grid水平个数变换、Grid垂直个数变换、显示方向的变换(水平还是垂直)、
显示图像形状(是矩形还是圆形);
********************************************************************************/
#include "stdafx.h"
#include "FontCurve.h"
#include "FontCurveCtl.h"
#include "FontCurvePpg.h"
#include "..\include\MemDC.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_DYNCREATE(CFontCurveCtrl, COleControl)
/////////////////////////////////////////////////////////////////////////////
// Message map
BEGIN_MESSAGE_MAP(CFontCurveCtrl, COleControl)
//{{AFX_MSG_MAP(CFontCurveCtrl)
ON_WM_NCCALCSIZE()
ON_WM_SIZE()
//}}AFX_MSG_MAP
ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// Dispatch map
BEGIN_DISPATCH_MAP(CFontCurveCtrl, COleControl)
//{{AFX_DISPATCH_MAP(CFontCurveCtrl)
DISP_FUNCTION(CFontCurveCtrl, "SetBackColor", SetBackColor, VT_EMPTY, VTS_COLOR)
DISP_FUNCTION(CFontCurveCtrl, "SetGridLineColor", SetGridLineColor, VT_EMPTY, VTS_COLOR)
DISP_FUNCTION(CFontCurveCtrl, "SetGridColor", SetGridColor, VT_EMPTY, VTS_COLOR)
DISP_FUNCTION(CFontCurveCtrl, "SetGridHoriNum", SetGridHoriNum, VT_EMPTY, VTS_I2)
DISP_FUNCTION(CFontCurveCtrl, "SetGridVerNum", SetGridVerNum, VT_EMPTY, VTS_I2)
DISP_FUNCTION(CFontCurveCtrl, "SetGridShowType", SetGridShowType, VT_EMPTY, VTS_I2)
DISP_FUNCTION(CFontCurveCtrl, "SetGridDrawType", SetGridDrawType, VT_EMPTY, VTS_I2)
DISP_FUNCTION(CFontCurveCtrl, "ShowGridData", ShowGridData, VT_BOOL, VTS_PBSTR VTS_I2 VTS_I2 VTS_I2)
//}}AFX_DISPATCH_MAP
END_DISPATCH_MAP()
/////////////////////////////////////////////////////////////////////////////
// Event map
BEGIN_EVENT_MAP(CFontCurveCtrl, COleControl)
//{{AFX_EVENT_MAP(CFontCurveCtrl)
// NOTE - ClassWizard will add and remove event map entries
// DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_EVENT_MAP
END_EVENT_MAP()
/////////////////////////////////////////////////////////////////////////////
// Property pages
// TODO: Add more property pages as needed. Remember to increase the count!
BEGIN_PROPPAGEIDS(CFontCurveCtrl, 1)
PROPPAGEID(CFontCurvePropPage::guid)
END_PROPPAGEIDS(CFontCurveCtrl)
/////////////////////////////////////////////////////////////////////////////
// Initialize class factory and guid
IMPLEMENT_OLECREATE_EX(CFontCurveCtrl, "FONTCURVE.FontCurveCtrl.1",
0x39ca78cf, 0xecfe, 0x4e88, 0x8b, 0x44, 0x51, 0xe9, 0x60, 0x18, 0x3a, 0x22)
/////////////////////////////////////////////////////////////////////////////
// Type library ID and version
IMPLEMENT_OLETYPELIB(CFontCurveCtrl, _tlid, _wVerMajor, _wVerMinor)
/////////////////////////////////////////////////////////////////////////////
// Interface IDs
const IID BASED_CODE IID_DFontCurve =
{ 0x680ae108, 0xf7ef, 0x45a1, { 0xbf, 0xdc, 0xfc, 0x29, 0xd0, 0xfb, 0xc6, 0x5c } };
const IID BASED_CODE IID_DFontCurveEvents =
{ 0x7e93f453, 0xe502, 0x4f31, { 0xb7, 0xff, 0x8, 0xb3, 0x35, 0xb6, 0xc3, 0xa6 } };
/////////////////////////////////////////////////////////////////////////////
// Control type information
static const DWORD BASED_CODE _dwFontCurveOleMisc =
OLEMISC_ACTIVATEWHENVISIBLE |
OLEMISC_SETCLIENTSITEFIRST |
OLEMISC_INSIDEOUT |
OLEMISC_CANTLINKINSIDE |
OLEMISC_RECOMPOSEONRESIZE;
IMPLEMENT_OLECTLTYPE(CFontCurveCtrl, IDS_FONTCURVE, _dwFontCurveOleMisc)
/////////////////////////////////////////////////////////////////////////////
// CFontCurveCtrl::CFontCurveCtrlFactory::UpdateRegistry -
// Adds or removes system registry entries for CFontCurveCtrl
BOOL CFontCurveCtrl::CFontCurveCtrlFactory::UpdateRegistry(BOOL bRegister)
{
// TODO: Verify that your control follows apartment-model threading rules.
// Refer to MFC TechNote 64 for more information.
// If your control does not conform to the apartment-model rules, then
// you must modify the code below, changing the 6th parameter from
// afxRegApartmentThreading to 0.
if (bRegister)
return AfxOleRegisterControlClass(
AfxGetInstanceHandle(),
m_clsid,
m_lpszProgID,
IDS_FONTCURVE,
IDB_FONTCURVE,
afxRegApartmentThreading,
_dwFontCurveOleMisc,
_tlid,
_wVerMajor,
_wVerMinor);
else
return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
}
/////////////////////////////////////////////////////////////////////////////
// Licensing strings
static const TCHAR BASED_CODE _szLicFileName[] = _T("FontCurve.lic");
static const WCHAR BASED_CODE _szLicString[] =
L"Copyright (c) 2004";
/////////////////////////////////////////////////////////////////////////////
// CFontCurveCtrl::CFontCurveCtrlFactory::VerifyUserLicense -
// Checks for existence of a user license
BOOL CFontCurveCtrl::CFontCurveCtrlFactory::VerifyUserLicense()
{
return AfxVerifyLicFile(AfxGetInstanceHandle(), _szLicFileName,
_szLicString);
}
/////////////////////////////////////////////////////////////////////////////
// CFontCurveCtrl::CFontCurveCtrlFactory::GetLicenseKey -
// Returns a runtime licensing key
BOOL CFontCurveCtrl::CFontCurveCtrlFactory::GetLicenseKey(DWORD dwReserved,
BSTR FAR* pbstrKey)
{
if (pbstrKey == NULL)
return FALSE;
*pbstrKey = SysAllocString(_szLicString);
return (*pbstrKey != NULL);
}
/////////////////////////////////////////////////////////////////////////////
// CFontCurveCtrl::CFontCurveCtrl - Constructor
CFontCurveCtrl::CFontCurveCtrl()
{
InitializeIIDs(&IID_DFontCurve, &IID_DFontCurveEvents);
m_colorBackGround = RGB(0xFF, 0xFF, 0xFF);
m_colorGridLine = RGB(0xC0, 0xC0, 0xC0); //灰色
m_colorGrid = RGB(0x00, 0x00, 0x00);
m_nGridHeightNum = GRID_LENGTH_16;
m_nGridWidthNum = GRID_LENGTH_16;
m_nGridLineWidth = WIDTH_GRID_LINE_INIT;
memset(m_byShowBuf, 0x00, GRID_SHOW_BUF_LEN*sizeof(BYTE));
m_nGridShowType = GRID_SHOW_POS_HORI;
m_nGridDrawType = GRID_DRAW_RECT;
m_nGridShowWidth = GRID_LENGTH_16;
m_nGridShowHeight = GRID_LENGTH_16;
}
/////////////////////////////////////////////////////////////////////////////
// CFontCurveCtrl::~CFontCurveCtrl - Destructor
CFontCurveCtrl::~CFontCurveCtrl()
{
FreeAllResource();
}
/////////////////////////////////////////////////////////////////////////////
// CFontCurveCtrl::OnDraw - Drawing function
void CFontCurveCtrl::OnDraw(
CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
//调整显示矩形区域
int nWidth = rcBounds.Width();
int nHeight = rcBounds.Height();
if(nWidth < GRID_LENGTH_MIN)
nWidth = GRID_LENGTH_MIN;
if(nHeight < GRID_LENGTH_MIN)
nHeight = GRID_LENGTH_MIN;
if(nWidth > nHeight)
nWidth = nHeight;
else
nHeight = nWidth;
int nGridWidth = (nWidth - m_nGridLineWidth * (m_nGridWidthNum + 1))/m_nGridWidthNum;
int nWidthResidue = (nWidth - m_nGridLineWidth * (m_nGridWidthNum + 1))%m_nGridWidthNum;
CRect rc(0,0,0,0);
CMemDC memDC(pdc);
CBrush * pBrush = NULL;
if(nWidthResidue != 0)
{
rc = CRect(rcBounds.left, rcBounds.top, rcBounds.left+nWidth - nWidthResidue,
rcBounds.top+nHeight - nWidthResidue);
CBrush bkBrush(m_colorBackGround);
pBrush = memDC.SelectObject(&bkBrush);
memDC.FillRect(CRect(rc.left+rc.Width(), rc.top, rcBounds.right, rcBounds.bottom), &bkBrush);
memDC.FillRect(CRect(rc.left, rc.top+rc.Height(), rcBounds.right, rcBounds.bottom), &bkBrush);
memDC.SelectObject(pBrush);
}
{
rc = CRect(rcBounds.left, rcBounds.top, rcBounds.left+nWidth, rcBounds.top+nHeight);
}
//填充背景色
CBrush backBrush(m_colorBackGround);
pBrush = memDC.SelectObject(&backBrush);
memDC.FillRect(rc, &backBrush);
//memDC.DrawEdge(rc,EDGE_ETCHED, BF_RECT);
memDC.SelectObject(pBrush);
//画背景网格
DrawGrid(&memDC, rc);
//利用数据填充指定网格
FillGrid(&memDC, rc, m_colorGrid, m_nGridDrawType);
}
/////////////////////////////////////////////////////////////////////////////
// CFontCurveCtrl::DoPropExchange - Persistence support
void CFontCurveCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
// TODO: Call PX_ functions for each persistent custom property.
}
/////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -