📄 buttonp.cpp
字号:
#include "stdafx.h"
#include "drawcli.h"
#include "ButtonP.h"
BEGIN_MESSAGE_MAP(CButtonP, CButton)
//{{AFX_MSG_MAP(CButtonP)
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CButtonP::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
CDC* pDC = CDC::FromHandle(lpDIS->hDC);
if (lpDIS->itemAction & ODA_DRAWENTIRE)
{
int x=lpDIS->rcItem.left;
int y=lpDIS->rcItem.top;
int x1=lpDIS->rcItem.right;
int y1=lpDIS->rcItem.bottom;
int i;
double a,b,c;
char sdx[40];
a = (double)(x1-x-x0)/(double)nWidth;
b = (double)(y1-y-y0)/(double)nHeight;
a = min(a, b);
c = a;
//页数
nPw = (nWidth + pWidth - 1)/pWidth;
nPh = (nHeight + pHeight - 1)/pHeight;
dx = (int)(pWidth*a);
dy = (int)(pHeight*a);
//
cbrs.CreateSolidBrush(RGB(128,128,0));
obrs = pDC->SelectObject(&cbrs);
a = (double)nWidth/(double)pWidth;
b = (double)nHeight/(double)pHeight;
x = (int)(a * dx);
y = (int)(b * dy);
pt[0].x = x0+0; pt[0].y = y0+0;
pt[1].x = x0+0; pt[1].y = y0+y;
pt[2].x = x0+x; pt[2].y = y0+y;
pt[3].x = x0+x; pt[3].y = y0+0;
pDC->Polygon(pt,4);
pDC->SelectObject(obrs);
cbrs.DeleteObject();
//
//标注总宽度
memset(&lft,0,sizeof(LOGFONT));
strcpy(lft.lfFaceName,"Arial");
lft.lfHeight = -14;
cfont.CreateFontIndirect(&lft);
ofont= pDC->SelectObject(&cfont);
i = sprintf(sdx,"%dMM", (int) (a*m_mWidth));
cs = pDC->GetTextExtent(sdx, i);
pDC->TextOut(x0+(x-cs.cx)/2,4, sdx);
pDC->MoveTo(x0,2);
pDC->LineTo(x0,y0);
pDC->MoveTo(x0+x,2);
pDC->LineTo(x0+x,y0);
pDC->SelectObject(ofont);
cfont.DeleteObject();
//
//标注总高度
memset(&lft,0,sizeof(LOGFONT));
strcpy(lft.lfFaceName,"Arial");
lft.lfHeight = -14;
lft.lfEscapement = 900;
cfont.CreateFontIndirect(&lft);
ofont= pDC->SelectObject(&cfont);
i = sprintf(sdx,"%dMM", (int) (b*m_mHeight));
cs = pDC->GetTextExtent(sdx, i);
pDC->TextOut(4, y0+y-(y-cs.cx)/2, sdx);
pDC->MoveTo(2, y0);
pDC->LineTo(x0,y0);
pDC->MoveTo(2, y0+y);
pDC->LineTo(x0,y0+y);
pDC->SelectObject(ofont);
cfont.DeleteObject();
//
for (i=0; i<=nPw; i++)
{
jpage[i]=(int)(x0+i*dx);
pDC->MoveTo(jpage[i], y0+0);
pDC->LineTo(jpage[i], (int)(y0+dy*nPh));
}
for (i=0; i<=nPh; i++)
{
kpage[i]=(int)(y0+i*dy);
pDC->MoveTo((int)x0+0, kpage[i]);
pDC->LineTo((int)(x0+dx*nPw),kpage[i]);
}
//selected page
cbrs.CreateSolidBrush(RGB(0,192,0));
obrs = pDC->SelectObject(&cbrs);
pt[0].x = jpage[iw]; pt[0].y = kpage[ih];
pt[1].x = jpage[iw]; pt[1].y = kpage[ih+1];
pt[2].x = jpage[iw+1]; pt[2].y = kpage[ih+1];
pt[3].x = jpage[iw+1]; pt[3].y = kpage[ih];
pDC->Polygon(pt,4);
pDC->SelectObject(obrs);
cbrs.DeleteObject();
//
memset(&lft,0,sizeof(LOGFONT));
strcpy(lft.lfFaceName,"Arial");
lft.lfHeight = -12;
cfont.CreateFontIndirect(&lft);
ofont= pDC->SelectObject(&cfont);
i = sprintf(sdx,"%dMM", m_mWidth);
cs = pDC->GetTextExtent(sdx, i);
pDC->TextOut(jpage[iw]+(int)(dx-cs.cx)/2, kpage[ih]+2, sdx);
pDC->SelectObject(ofont);
cfont.DeleteObject();
//
memset(&lft,0,sizeof(LOGFONT));
strcpy(lft.lfFaceName,"Arial");
lft.lfHeight = -12;
lft.lfEscapement = 900;
cfont.CreateFontIndirect(&lft);
ofont= pDC->SelectObject(&cfont);
i = sprintf(sdx,"%dMM", m_mHeight);
cs = pDC->GetTextExtent(sdx, i);
pDC->TextOut(jpage[iw]+2, kpage[ih]+(int)(dy-cs.cx)/2+cs.cx, sdx);
pDC->SelectObject(ofont);
cfont.DeleteObject();
cpn.CreatePen(PS_SOLID, 2, RGB(255,0,0));
opn = pDC->SelectObject(&cpn);
pt[0].x = (int)(x0+pminx*c); pt[0].y = (int)(y0+pminy*c);
pt[1].x = (int)(x0+pminx*c); pt[1].y = (int)(y0+pmaxy*c);
pt[2].x = (int)(x0+pmaxx*c); pt[2].y = (int)(y0+pmaxy*c);
pt[3].x = (int)(x0+pmaxx*c); pt[3].y = (int)(y0+pminy*c);
pt[4] = pt[0];
pDC->Polyline(pt,5);
pDC->SelectObject(opn);
cpn.DeleteObject();
}
if ((lpDIS->itemState & ODS_SELECTED) &&
(lpDIS->itemAction & (ODA_SELECT | ODA_DRAWENTIRE)))
{
// item has been selected - hilite frame
CBrush br(RGB(0,0,0));
pDC->FrameRect(&lpDIS->rcItem, &br);
}
if (!(lpDIS->itemState & ODS_SELECTED) &&
(lpDIS->itemAction & ODA_SELECT))
{
// Item has been de-selected -- remove frame
CBrush br(RGB(255,255,255));
pDC->FrameRect(&lpDIS->rcItem, &br);
}
}
void CButtonP::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
int i;
for (i=0; i<nPw; i++)
{
if (point.x >=jpage[i] && point.x<jpage[i+1]) break;
}
if (i==nPw) return;
iw = i;
for (i=0; i<nPh; i++)
{
if (point.y >=kpage[i] && point.y<kpage[i+1]) break;
}
if (i==nPh) return;
ih = i;
Invalidate();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -