📄 datawin.cpp
字号:
// DataWin.cpp : implementation file
//
#include "stdafx.h"
//#include "previewdemo.h"
#include "DataWin.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
///////////////////////////////////////////////////////////
//CDataCell
CDataCell::CDataCell()
{
Reset();
}
CDataCell::Reset()
{
dwCommand = 0; //命令类型
nID = 0; //控件ID
pDC = NULL; //绘图指针
nCol = -1; //当前行号
nRow = -1; //当前列号
Rect.SetRect(0,0,0,0); //区域
strName = _T(""); //名称
crTextColor = 0; //文字颜色
crColor = 0; //前景颜色
crBkColor = RGB(255,255,255); //背景颜色
crBkColorParent = crBkColor; //父窗口背景色
nBkMode = TRANSPARENT; //是否透明背景
hWnd = NULL;
strText = _T("");
strType = _T(""); //类型
dwStyle = 0; //样式
dwStyleEx = 0; //扩展样式
dwState = 0; //控件状态
pFont = NULL; //当前字体
pPen = NULL; //当前CPen,只在画线时用到
pDataEx = NULL; //扩展数据指针 *
dwDataEx = 0; //扩展数据 *
xPix = 1; //每mm对应象数
yPix = 1; //每mm对应象数
bIsPrint = FALSE; //是否为打印状态
fZoomH = 1; //水平放大
fZoomV = 1; //垂直放大
strValues = _T(""); //取值范围
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
CDataWin::CDataWin(UINT nIDD, CWnd* pParent /*=NULL*/)
: CDialog(nIDD, pParent)
{
//{{AFX_DATA_INIT(CDataWin)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
CreateInit();
}
CDataWin::CDataWin(CWnd* pParent /*=NULL*/)
: CDialog(CDataWin::IDD, pParent)
{
//{{AFX_DATA_INIT(CDlg1)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
CreateInit();
}
void CDataWin::CreateInit(void)
{
m_nPageMax = 1;
m_nCellMax = 0;
m_nHead=m_nBody=m_nEnd=m_nFoot=0;
m_nCellCol=m_nCellHeight=m_nCellID=0;
m_nCellRow=m_nCell=0;
m_nPage = 0;
m_nPagePn=m_nPageMaxPn=0;
m_RectPage.SetRect(0,0,0,0); //显示尺寸
SetPage("A4", true); //打印尺寸
m_shadowColor = RGB(68,68,68);
m_bkColor = RGB(255,255,255);
m_bkBrush.CreateSolidBrush(m_bkColor); //背景
m_strDefSQL = _T("");
// m_bIsPrint = FALSE;
m_bRedraw = TRUE;
m_pGraphic = m_pGraphicPn = NULL;
m_pConnection = NULL;
m_strPrinterName= _T("");
m_bIsPrintView = TRUE;
m_xPix = 1;
m_yPix = 1;
m_xScroll = 0;
m_yScroll = 0;
m_nFrameW = 10; //虚拟显示时,左右边距
m_nFrameH = 10; //上下边距
m_nDoubleRam = PNR_DISABLEDRAM; //双缓存
m_xZoom = 0.5; //水平缩放
m_yZoom = 1; //垂直缩放
m_bSimple = false; //简单模式,一行一责
m_pUp = NULL; //上翻页
m_pDown = NULL; //下翻页
}
void CDataWin::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDataWin)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDataWin, CDialog)
//{{AFX_MSG_MAP(CDataWin)
ON_WM_PAINT()
ON_WM_DESTROY()
ON_WM_HSCROLL()
ON_WM_VSCROLL()
ON_WM_SIZE()
ON_WM_ERASEBKGND()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/*
/////////////////////////////////////////////////////////////////////////////
//创建数据库连接
BOOL CDataWin::InitConnect()
{
if(m_pConnection==NULL)
{
m_pConnection = new CAdoConnection;
if (m_pConnection == NULL)return FALSE;
}
return m_pConnection->ConnectDef();
}
*/
//指定数据库连接
CAdoConnection *CDataWin::SetConnect(CAdoConnection *pConnection)
{
CAdoConnection *pOld;
pOld = m_pConnection;
m_pConnection = pConnection;
m_RecordSet.SetAdoConnection(pConnection);
return pOld;
}
BOOL CDataWin::Init()
{
InitGraphic(); //创建绘图类
ResetAll(); //复位所有变量
InitBase(); //修改窗口风格、初始化纸张
// fnEnumControl(); //枚举所有子窗口
if(!Init4Control()) return FALSE; //初始化窗口结构
// InitConnect(); //连结数据库
// Open(m_strDefSQL); //打开表格
// UpdateRecord(); //载入数据库数据
ShowWindow(SW_SHOW);
return TRUE;
}
////////////////////////////////////////////////
//设置区域1)显示区域-象数
// 2)打印区域-mm
//动态修改时应自行刷新
BOOL CDataWin::SetPage(CString strName, BOOL bIsPrint)
{
CRect rect(0,0,0,0);
BOOL bFound = FALSE;
if(strName = "A4")
{
rect.SetRect(0,0,210, 297);
bFound = TRUE;
}
else if(strName="A5")
{
rect.SetRect(0,0,148, 210);
bFound = TRUE;
}
//设置
if(bFound && bIsPrint) //设置打印机纸张
{
m_RectPrint = rect;
}
if(bFound && !bIsPrint)//设置显示纸张
{
m_RectPage.SetRect(0,0,rect.Width()*m_xPix,rect.Height()*m_yPix);
CalSize(m_RectPage, m_xPix, m_yPix); //重新计算页面
RefurbishDoubleRam(); //更新
}
return bFound;
}
////////////////////////////////////////////////////
//指定区域1)显示-象数 2)打印区域-mm
//动态修改时应自行刷新
BOOL CDataWin::SetPage(int nWidth, int nHeight, BOOL bIsPrint)
{
if(bIsPrint)
m_RectPrint.SetRect(0,0,nWidth, nHeight);
else
{
m_RectPage.SetRect(0,0,nWidth, nHeight);
CalSize(m_RectPage, m_xPix, m_yPix); //重新计算页面
RefurbishDoubleRam(); //更新
}
return TRUE;
}
/////////////////////////////////////////////////////
//打印主函数
void CDataWin::OnPrintBase(CDC &dc)
{
int row;
if(m_RectPage.Width()==0 && m_RectPage.Height()==0)
return; //没有初始化
// DrawBack(dc); // 画背景
DrawHead(dc); //画页头
DrawBodyPn(dc, &row, TRUE); //表体
DrawEnd(dc, &row, TRUE); //表尾
DrawFoot(dc, &row, TRUE); //页尾
}
////////////////////////////////////////////////////
//旧代码
/*
void CDataWin::OnPaintBase(CDC &dc)
{
CRect rect, rect2, rtClient;
CDataCell data;
CBrush Brush;
int i, j;
//坐标转换
DOUBLE xPix = m_xPix;
DOUBLE yPix = m_yPix;
rect.SetRect(0,0,m_RectPage.Width()*xPix, m_RectPage.Height()*yPix);
//计算滚动条相对位移
int xScroll = ::GetScrollPos(GetSafeHwnd(), SB_HORZ);
int yScroll = ::GetScrollPos(GetSafeHwnd(), SB_VERT);
GetClientRect(&rtClient);
DOUBLE xPixChange = 1; //相对象数转换
DOUBLE yPixChange = 1; //相对象数转换
if(m_bIsPrintView)//模似显示
{
//画外框
xScroll = xScroll*(rect.Width()-rtClient.Width()+14)/100;
yScroll = yScroll*(rect.Height()-rtClient.Height()+14)/100;
dc.SetWindowOrg(xScroll, yScroll);
rect2 = rect;
Brush.CreateSolidBrush(RGB(255,0,0));
rect2.InflateRect(1,1);
rect2.OffsetRect(5,5);
dc.FrameRect(&rect2, &Brush);
Brush.DeleteObject();
//画内框
Brush.CreateSolidBrush(RGB(255,255,255));
rect2.DeflateRect(1,1);
dc.FrameRect(&rect2, &Brush);
//位移至框内
dc.SetWindowOrg(-7+xScroll,-7+yScroll);
}
else
{
xScroll = xScroll*(rect.Width()-rtClient.Width())/100;
yScroll = yScroll*(m_nHead+m_nEnd+m_nFoot+
m_nCellMax*m_nCellHeight-rtClient.Height())/100;
dc.SetWindowOrg(xScroll, yScroll);
rect2 = rect;
}
CalSize(dc, rect); //计算页数
int nHeight = m_nCellHeight;
//画页头
for (i = 0; i < m_dataHead.size(); i++)
{
data = m_dataHead.at(i);
data.pDC = &dc;
CalMulRect(&data.Rect,xPix,yPix);
data.xPix = xPixChange; data.yPix=yPixChange;
if(OnCellStart(&data))
m_pGraphic->DrawItem((void*)&data);
OnCellEnd(&data);
}
//画表体
int row = -1;
if(m_pConnection != NULL && m_pConnection->IsOpen())
{//i=总项目、j=单页总项目
for (i =m_nPage*m_nCellMax*m_nCell, j = 0; i < m_data.size() && (j < m_nCellMax*m_nCell || !GetPrintView()); i++, j++)
{//列举数据库项目
if(!(j % m_nCell)) //新行
{//输出非数据库项目
row++;
if(row > m_nCellMax) break; //大于最大行数
for (int k = 0; k < m_dataBody.size() ; k++)
{
data = m_dataBody.at(k);
if(m_dataBody.at(k).dwCommand != PNS_DATABASE)
{
data.pDC = &dc;
data.nRow = row;
data.Rect.top += row * nHeight;
data.Rect.bottom += row * nHeight;
CalMulRect(&data.Rect,xPix,yPix);
data.xPix = xPixChange; data.yPix=yPixChange;
if(OnCellStart(&data))
m_pGraphic->DrawItem((void*)&data);
OnCellEnd(&data);
}
}
}
//输出数据库项目
data = m_data.at(i);
data.pDC = &dc;
data.nRow = row;
data.Rect.top += row * nHeight;
data.Rect.bottom += row * nHeight;
CalMulRect(&data.Rect,xPix,yPix);
data.xPix = xPixChange; data.yPix=yPixChange;
if(OnCellStart(&data))
m_pGraphic->DrawItem((void*)&data);
OnCellEnd(&data);
}//end for
}//end if
//画表脚
if(m_nPage == m_nPageMax-1)
{
row++;
for (i = 0; i < m_dataEnd.size() ; i++)
{
data = m_dataEnd.at(i);
data.pDC = &dc;
data.nRow = -1;
data.Rect.top += row * nHeight;
data.Rect.bottom += row * nHeight;
CalMulRect(&data.Rect,xPix,yPix);
data.xPix = xPixChange; data.yPix=yPixChange;
if(OnCellStart(&data))
m_pGraphic->DrawItem((void*)&data);
OnCellEnd(&data);
}
}
//画页尾
for (i = 0; i < m_dataFoot.size(); i++)
{
data = m_dataFoot.at(i);
data.pDC = &dc;
rect2 = data.Rect;
data.Rect.bottom = rect.bottom-rect2.bottom;
data.Rect.top = data.Rect.bottom-(rect2.bottom-rect2.top);
CalMulRect(&data.Rect,xPix,yPix);
data.xPix = xPixChange; data.yPix=yPixChange;
if(OnCellStart(&data))
m_pGraphic->DrawItem((void*)&data);
OnCellEnd(&data);
}
}
*/
//////////////////////////////////////////////////
//默认CELL初始化函数
void CDataWin::OnInitCell(CDataCell *pData, BOOL bIsPrint)
{
static char s_szClass[][32] =
{
"Button", // 按钮类0
"Edit", // 编辑框类1
"ComboBox", // 组合框类2
"ListBox", // 列表框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
};
if(pData->pDC==NULL)return ;
for (int lReturn = 0; lReturn < (sizeof(s_szClass) / sizeof(s_szClass[0])); lReturn++)
if (pData->strType == s_szClass[lReturn])
break;
DWORD dwStyle = pData->dwStyle;
pData->crBkColorParent = GetBkColor();
switch (lReturn)
{
case 0: //按钮
switch (dwStyle & SS_TYPEMASK)
{
case BS_DEFPUSHBUTTON: // 默认按钮
case BS_PUSHBUTTON: // 普通按钮
pData->crBkColor = GetSysColor(COLOR_BTNFACE);
break;
case BS_CHECKBOX: // 复选框
case BS_AUTOCHECKBOX: // 自动复选框
case BS_3STATE: // 三状态复选框
case BS_AUTO3STATE: // 自动三状态复选框
if (!(dwStyle & BS_PUSHLIKE)) //不是按钮
pData->crBkColor = GetBkColor();
break;
case BS_RADIOBUTTON: // 单选框
case BS_AUTORADIOBUTTON: // 自动单选框
if (!(dwStyle & BS_PUSHLIKE))
pData->crBkColor = GetBkColor();
break;
case BS_GROUPBOX: // 分组框
pData->crBkColor = GetBkColor();
break;
}
break;
}//end switch
}
///////////////////////////////////////////////////////////
//双缓存绘制
int CDataWin::OnPaintDoubleRam(CDC &dc)
{
CRect rtClient, rtAll, rtFree;
int xPos,yPos,xScroll, yScroll;
int nHeight, nWidth ;
//双缓存
switch(m_nDoubleRam)
{
case PNR_DELETERAM: //删除双缓存方式
m_nDoubleRam = 0;
m_bkBitmap.DeleteObject();
m_MemDC.DeleteDC();
return 0;
case PNR_DISABLEDRAM:
return 0;
case PNR_REFURBISHRAM://更新
m_nDoubleRam = 1;
m_bkBitmap.DeleteObject();
m_MemDC.DeleteDC();///////////////////////
case PNR_CREATERAM: //新建
::SetScrollPos(GetSafeHwnd(), SB_VERT,0, TRUE);
::SetScrollPos(GetSafeHwnd(), SB_HORZ,0, TRUE);
if(!m_MemDC.CreateCompatibleDC(&dc))
{
m_nDoubleRam = 0;
return 0;
}
GetPageRect(rtAll);
if(!m_bkBitmap.CreateCompatibleBitmap(&dc,rtAll.Width(),
rtAll.Height()))
{
m_nDoubleRam = 0;
m_MemDC.DeleteDC();
return 0;
}
m_MemDC.SelectObject(&m_bkBitmap);
m_nDoubleRam = 2;
return 1;
case PNR_USEDRAM://真正绘制
xPos = ::GetScrollPos(GetSafeHwnd(), SB_HORZ);
yPos = ::GetScrollPos(GetSafeHwnd(), SB_VERT);
GetPageRect(rtAll);
xScroll = GetScrollH(xPos);
yScroll = GetScrollV(yPos);
GetClientRect(&rtClient);
dc.BitBlt(0, 0, rtClient.Width(), rtClient.Height(),
&m_MemDC, xScroll, yScroll, SRCCOPY);
// dc.StretchBlt(0, 0, rtClient.Width(),rtClient.Height(),
// &m_MemDC, xScroll, yScroll,
// rtAll.Width(),
// rtAll.Height(),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -