📄 dcmacro.cpp
字号:
// DCMacro.cpp: implementation of the CDCMacro class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "DCMacro.h"
//#include "MyPen.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDCMacro::CDCMacro()
{
}
CDCMacro::~CDCMacro()
{
}
BOOL CDCMacro::IntersectLine(CPoint p1, CPoint p2, CRect r)
{
CRect tmp, tmpi;
tmp.TopLeft() = p1;
tmp.BottomRight() = CPoint(p2.x + 1, p2.y + 1);
tmp.NormalizeRect();
BOOL bRet = r.PtInRect(p1) || r.PtInRect(p2) ||
tmpi.IntersectRect(&r, &tmp) ;
return bRet;
}
void CDCMacro::Line(CDC *pDC, POINT p1, POINT p2)
{
POINT pntLine[2];
pntLine[0] = p1;
pntLine[1] = p2;
pDC->Polyline(pntLine, 2);
}
void CDCMacro::Circle(CDC* pDC, POINT c, int r)
{
pDC->Ellipse(c.x - r, c.y - r, c.x + r, c.y + r);
}
void CDCMacro::RectDiv(CRect &r, double scale)
{
r.left = (LONG)((double)r.left / scale + 1);
r.right = (LONG)((double)r.right / scale + 1);
r.top = (LONG)((double)r.top / scale + 1);
r.bottom = (LONG)((double)r.bottom / scale + 1);
}
BOOL CDCMacro::IntersectLine(int x1, int y1, int x2, int y2, CRect& r)
{
CPoint p1(x1, y1);
CPoint p2(x2, y2);
return CDCMacro::IntersectLine(p1, p2, r);
}
void CDCMacro::Line(CDC *pDC, int x1, int y1, int x2, int y2)
{
CPoint p1(x1, y1);
CPoint p2(x2, y2);
CDCMacro::Line(pDC, p1, p2);
}
void CDCMacro::CrossLine(CDC *pDC, CRect r)
{
CDCMacro::Line(pDC, r.left, r.top, r.right, r.bottom);
CDCMacro::Line(pDC, r.left, r.bottom, r.right, r.top);
}
void CDCMacro::DrawRect(CDC *pDC, CRect r, BOOL bSunken)
{
DWORD dwRop0 = bSunken ? BLACKNESS : WHITENESS;
DWORD dwRop1 = bSunken ? WHITENESS : BLACKNESS;
pDC->PatBlt(r.left, r.top, r.Width(), 1, dwRop0);
pDC->PatBlt(r.left, r.top, 1, r.Height(), dwRop0);
pDC->PatBlt(r.left, r.bottom, r.Width(), 1, dwRop1);
pDC->PatBlt(r.right, r.top, 1, r.Height(), dwRop1);
}
void CDCMacro::DrawText(CDC* pDC, CString &s, CPoint &p, UINT nFormat)
{
CRect r;
r.TopLeft() = p;
r.BottomRight() = r.TopLeft();
r.InflateRect(2, 2, 2, 2);
pDC->DrawText(s, &r, nFormat);
// pDC->ExtTextOut(p.x, p.y, ETO_OPAQUE, NULL, s, NULL);
}
void CDCMacro::DrawSolidRect(CDC *pDC, CRect r, COLORREF cf)
{
CPen pen(PS_SOLID, 2, cf);
CBrush brush(cf);
CPen* op = pDC->SelectObject(&pen);
CBrush* ob = pDC->SelectObject(&brush);
pDC->Rectangle(&r);
pDC->SelectObject(op);
pDC->SelectObject(ob);
pen.DeleteObject();
brush.DeleteObject();
}
void CDCMacro::DrawPolygon(CDC* pDC, POINT *pp, int nSum, COLORREF rgbInner, COLORREF rgbOutner)
{
CBrush brush(rgbInner);
// CPen pen(PS_SOLID, 0, rgbOutner);
HPEN pen = ::CreatePen(PS_SOLID, 1, rgbOutner);
HPEN pop = (HPEN)pDC->SelectObject(pen);
CBrush* pob = pDC->SelectObject(&brush);
pDC->Polygon(pp, nSum);
pDC->SelectObject(pob);
pDC->SelectObject(pop);
brush.DeleteObject();
::DeleteObject(pen);
}
void CDCMacro::CircleTrans(CDC *pDC, POINT c, int r, int w, COLORREF clr, COLORREF clrInner)
{
CDC dcMem;
BOOL bOk = dcMem.CreateCompatibleDC(pDC);
if ( bOk ) {
CRect rBnd(0, 0, 2 * r, 2 * r);
int r2 = r - w / 2;
CBitmap bmp;
bOk = bmp.CreateCompatibleBitmap(pDC, rBnd.Width(), rBnd.Height());
if ( bOk ) {
CDC* pMem = &dcMem;
CBitmap* pob = pMem->SelectObject(&bmp);
pMem->PatBlt(0, 0, rBnd.Width(), rBnd.Height(), WHITENESS);
HPEN pen = ::CreatePen(PS_SOLID, w, clr);
HPEN po = (HPEN)pMem->SelectObject(pen);
CBrush brush(clrInner);
CBrush* pobr = pMem->SelectObject(&brush);
CDCMacro::Circle(pMem, rBnd.CenterPoint(), r2);
#if defined(_WIN32_WCE) && !defined(_MIPS_)
::TransparentImage(pDC->m_hDC, c.x - rBnd.Width() / 2,
c.y - rBnd.Height() / 2, rBnd.Width(), rBnd.Height(),
dcMem.m_hDC, 0, 0, rBnd.Width(), rBnd.Height(),
RGB(255, 255, 255));
#else
pDC->BitBlt(c.x - rBnd.Width() / 2,
c.y - rBnd.Height() / 2,
rBnd.Width(), rBnd.Height(), pMem,
0, 0, SRCAND);
#endif
pMem->SelectObject(po);
::DeleteObject(pen);
pMem->SelectObject(pob);
bmp.DeleteObject();
pMem->SelectObject(pobr);
brush.DeleteObject();
} //end if CreateCompatibleBitmap
}//end if CreateCompatibleDC
if ( bOk == FALSE ) {
CDCMacro::Circle(pDC, c, r);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -