📄 pregraphic.cpp
字号:
// PreGraphic.cpp: implementation of the CPreGraphic class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "PreGraphic.h"
//#include "PreView.H"
#include "DataWin.H"
//#include "PreData.H"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
/*
"Button", // 按钮类0
"Edit", // 编辑框类1
"ComboBox", // 组合框类2
"ListBox", //NEW:列表框3
"ScrollBar", //4
"Static", //5
"#32770", //6
"msctls_hotkey32", // 热键7
"SysIPAddress32", // IP 地址8
"SysListView32", // 列表查看9
"SysTreeView32", // 树形查看10
"SysDateTimePick32", // 日期/时间选择11
"msctls_updown32", // 旋转12
"SysMonthCal32", // 月历13
"SysTabControl32", // TAB 控件14
"msctls_progress32", // 进度条15
"msctls_trackbar32", // 追踪条16
*/
CPreGraphic::CPreGraphic()
{
}
CPreGraphic::~CPreGraphic()
{
}
CPreGraphic::FrameRect(CDC *pDC, RECT *pRect)
{
pDC->MoveTo(pRect->left, pRect->top);
pDC->LineTo(pRect->right, pRect->top);
pDC->MoveTo(pRect->right, pRect->top);
pDC->LineTo(pRect->right, pRect->bottom);
pDC->MoveTo(pRect->right, pRect->bottom);
pDC->LineTo(pRect->left, pRect->bottom);
pDC->MoveTo(pRect->left, pRect->bottom);
pDC->LineTo(pRect->left, pRect->top);
}
//按比例转换坐标系
void CPreGraphic::CalMulRect(LPRECT pRect, double xPix, double yPix)
{
pRect->left *=xPix;
pRect->right *=xPix;
pRect->top *=yPix;
pRect->bottom *=yPix;
}
//按钮设置转成文本设置
UINT CPreGraphic::ButtonStyle2Format(DWORD style)
{
UINT uFormat = 0;
if((style & BS_MULTILINE) != BS_MULTILINE)
uFormat |= DT_SINGLELINE;
if((style & BS_TOP) == BS_TOP)
uFormat |= DT_TOP;
else if((style & BS_BOTTOM) == BS_BOTTOM)
uFormat |= DT_BOTTOM;
else
uFormat |= DT_VCENTER | DT_SINGLELINE;
if((style & BS_LEFT) == BS_LEFT)
uFormat |= DT_LEFT;
else if((style & BS_RIGHT) == BS_RIGHT)
uFormat |= DT_RIGHT;
else
uFormat |= DT_CENTER;
uFormat |= DT_END_ELLIPSIS;
if(style & WS_DISABLED) uFormat |= WS_DISABLED;
return uFormat;
}
//////////////////////////////////////////////
//画静态说明条
//原代码:可用
/*
BOOL CPreGraphic::DrawStatic(void * pDraw)
{
HICON hIcon = NULL;
HDC hBmpDC;
CDataCell *pData = (CDataCell*)pDraw;
CDC *pDC = pData->pDC;
CBrush Brush;
CRect Rect = pData->Rect;
DWORD dwStyle = pData->dwStyle;
if(!(dwStyle & WS_VISIBLE)) return TRUE;
if(dwStyle & SS_ICON || dwStyle & SS_BITMAP)
{
if ((hIcon = (HICON)::SendMessage(pData->hWnd,STM_GETICON,0L,0L)))
{
if(hIcon == NULL) return FALSE;
pDC->DrawIcon(Rect.left, Rect.top,(HICON) hIcon);
return TRUE;
}
else if ((hIcon = (HICON)::SendMessage(pData->hWnd,STM_GETIMAGE,IMAGE_BITMAP,0L)))
{
hBmpDC = ::CreateCompatibleDC(pDC->m_hDC);
if (!hBmpDC) return FALSE;
::SelectObject(hBmpDC, hIcon);
::BitBlt(pDC->m_hDC, Rect.left , Rect.top,
Rect.right - Rect.left,
Rect.bottom - Rect.top,
hBmpDC, 0 , 0, SRCCOPY);
DeleteObject(hBmpDC);
return TRUE;
}
}
//SS_BLACKFRAME或SS_FRAME类型表示绘线
if(dwStyle & SS_BLACKRECT)
return DrawLine(pDraw);
//写文字
if(hIcon == NULL)
DrawText(pDraw);
return TRUE;
}
*/
//////////////////////////////////////////////
//画静态说明条
//新代码:通过跟踪后得到
BOOL CPreGraphic::DrawStatic(void * pDraw)
{
CBrush Brush;//, *pOldBrush;
HICON hIcon = NULL;
HDC hBmpDC;
CDataCell *pData = (CDataCell*)pDraw;
CDC *pDC = pData->pDC;
CRect Rect = pData->Rect;
DWORD dwStyle = pData->dwStyle;
if(!(dwStyle & WS_VISIBLE)) return TRUE;
//dwStyle &= 0x3F;
switch(dwStyle & 0x3F) //前6位
{
case 7: //画FRAME类型同样处理
case 8:
case 9:
case 11:
return DrawFrame(pDraw);
case 15://画Metafile类型
case 4: //画RectRange
case 5:
case 6:
case 10:
return DrawRange(pDraw);
case 3: //画ICON
//hIcon = (HICON)::SendMessage(pData->hWnd,STM_GETICON,0L,0L);
if(hIcon == NULL) return FALSE;
pDC->DrawIcon(Rect.left, Rect.top,(HICON) hIcon);
return TRUE;
case 14: //画BITMAP
//hIcon = (HICON)::SendMessage(pData->hWnd,STM_GETIMAGE,IMAGE_BITMAP,0L);
if(hIcon == NULL) return FALSE;
hBmpDC = ::CreateCompatibleDC(pDC->m_hDC);
if (!hBmpDC) return FALSE;
::SelectObject(hBmpDC, hIcon);
::BitBlt(pDC->m_hDC, Rect.left , Rect.top,
Rect.right - Rect.left,
Rect.bottom - Rect.top,
hBmpDC, 0 , 0, SRCCOPY);
DeleteObject(hBmpDC);
return TRUE;
}//end switch
//处理扩展样式, 因为无法从dwStyle类型中取出
//对应的边框、内陷等样式,所以只能从StyleEx取了:(
DWORD dwStyleEx = pData->dwStyleEx;
/* if(dwStyleEx & WS_EX_DLGMODALFRAME) //按钮样式
{
if(!Brush.CreateSolidBrush(GetSysColor(COLOR_BTNFACE)))return FALSE;
pDC->FillRect(&Rect, &Brush);
Brush.DeleteObject();
pDC->Draw3dRect(&Rect,GetSysColor(COLOR_3DHILIGHT),
GetSysColor(COLOR_3DDKSHADOW));
pData->dwStyle |= DT_VCENTER| DT_SINGLELINE;
}
if(dwStyleEx & WS_EX_CLIENTEDGE)//内陷样式
{
// if(!Brush.CreateSolidBrush(GetSysColor(COLOR_BTNFACE)))return FALSE;
if(!Brush.CreateSolidBrush(pData->crBkColor))return FALSE;
pDC->FillRect(&Rect, &Brush);
Brush.DeleteObject();
pDC->Draw3dRect(&Rect, GetSysColor(COLOR_3DDKSHADOW),
GetSysColor(COLOR_3DHILIGHT));
pData->dwStyle |= DT_VCENTER| DT_SINGLELINE;
}
*/
if(dwStyleEx & WS_EX_STATICEDGE)//平板样式
{
if(!Brush.CreateSolidBrush(pData->crTextColor))return FALSE;
pDC->FrameRect(&Rect, &Brush);
Brush.DeleteObject();
pData->dwStyle |= DT_VCENTER| DT_SINGLELINE;
}
//写文字
DrawText(pDraw);
return TRUE;
}
//////////////////////////////////////////////////////
//画Radio
BOOL CPreGraphic::DrawRadio(void * pDraw)
{
CDataCell *pData = (CDataCell*)pDraw;
CDC *pDC = pData->pDC;
CBrush Brush;
CPen Pen;
CPen *pOldPen;
CBrush *pOldBrush;
BOOL bChecked = FALSE;
CRect Rect = pData->Rect;
CRect rcText, rcRound;
//画背景
/*
if(!Brush.CreateSolidBrush(pData->crBkColorParent))return FALSE;
pDC->FillRect(&Rect, &Brush);
Brush.DeleteObject();
*/
if(!(pData->dwStyle & WS_VISIBLE)) return TRUE;
//计算圆点
rcRound.SetRect(2,2,14,14);
CalMulRect(&rcRound, pData->xPix,pData->yPix);
if (pData->dwStyle & BS_LEFTTEXT)
{
rcText = Rect;
Rect.top += (Rect.Height()-rcRound.Height())/2;
Rect.bottom = Rect.top+rcRound.Height();
Rect.right -= rcRound.left; Rect.left = Rect.right - rcRound.Width();
rcText.right -= rcRound.right+rcRound.left;
}
else
{
rcText = Rect;
Rect.top += (Rect.Height()-rcRound.Height())/2;
Rect.bottom = Rect.top+rcRound.Height();
Rect.left += rcRound.left; Rect.right = Rect.left + rcRound.Width();
rcText.left += rcRound.right+rcRound.left;
}
//画圆
if(!Pen.CreatePen(PS_SOLID,pData->yPix, pData->crColor))
return FALSE;
pOldPen = pDC->SelectObject(&Pen);
if(pData->dwStyle & WS_DISABLED)
{//禁止
if(!Brush.CreateSolidBrush(GetSysColor(COLOR_GRAYTEXT)))
{
pDC->SelectObject(pOldPen);
Pen.DeleteObject();
return FALSE;
}
}
else
{
if(!Brush.CreateSolidBrush(pData->crBkColor))
{
pDC->SelectObject(pOldPen);
Pen.DeleteObject();
return FALSE;
}
}
pOldBrush = pDC->SelectObject(&Brush);
pDC->Ellipse(&Rect);
pDC->SelectObject(pOldBrush);
Brush.DeleteObject();
pDC->SelectObject(pOldPen);
Pen.DeleteObject();
if(pData->dwCommand == PNS_DATABASE)
{//数据库类型
if(pData->strText == "TRUE" ||
pData->strText == "1")
bChecked = TRUE;
}
if(bChecked)
{
if(!Brush.CreateSolidBrush(pData->crTextColor))return FALSE;
pOldBrush = pDC->SelectObject(&Brush);
Rect.DeflateRect(Rect.Width()/4,Rect.Height()/4);
pDC->Ellipse(&Rect);
pDC->SelectObject(pOldBrush);
Brush.DeleteObject();
}
if(pData->dwCommand == PNS_DATABASE) return TRUE;
//写文字
pData->Rect = rcText;
pData->nBkMode = TRANSPARENT;
pData->dwStyle=ButtonStyle2Format(pData->dwStyle);
DrawText(pDraw);
return TRUE;
}
//////////////////////////////////////////////
//画Group
BOOL CPreGraphic::DrawGroup(void * pDraw)
{
CDataCell *pData = (CDataCell*)pDraw;
CDC *pDC = pData->pDC;
CBrush Brush;
CRect Rect = pData->Rect;
if(!(pData->dwStyle & WS_VISIBLE)) return TRUE;
//画外框
Rect.top += 8*pData->yPix;;
if(!Brush.CreateSolidBrush(pData->crColor))return FALSE;
pDC->FrameRect(&Rect, &Brush);
Brush.DeleteObject();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -