📄 reptabdlg.cpp
字号:
// RepTabDlg.cpp : implementation file
//
#include "stdafx.h"
#include "trans.h"
#include "RepTabDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CRepTabDlg dialog
static UINT indicators[] =
{
ID_SEPARATOR,
ID_SEPARATOR,
ID_SEPARATOR,
};
CRepTabDlg::CRepTabDlg(CWnd* pParent /*=NULL*/)
: CDialog(CRepTabDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CRepTabDlg)
//}}AFX_DATA_INIT
m_bCreated=false;
nPageWidth=687;
nPageHeight=971;
nPageInTop=40;
nPageInLeft=40;
nLeftMargin=40;
nTopMargin=20;
nGap=20;
nRowHeight=20;
// nPageCount=1;
// nRowCount=3;
// nColCount=5;
defdeviceset=NULL;
}
CRepTabDlg::~CRepTabDlg()
{
arrTxt.RemoveAll();
arrPageEndIndex.RemoveAll();
}
void CRepTabDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CRepTabDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CRepTabDlg, CDialog)
//{{AFX_MSG_MAP(CRepTabDlg)
ON_COMMAND(ID_SETPAGE, OnSetpage)
ON_COMMAND(ID_REPEXIT, OnRepexit)
ON_COMMAND(ID_PRINT, OnPrint)
ON_COMMAND(ID_PRE, OnPre)
ON_COMMAND(ID_NEXT, OnNext)
ON_COMMAND(ID_LAST, OnLast)
ON_COMMAND(ID_FIRST, OnFirst)
ON_WM_HSCROLL()
ON_WM_MOUSEWHEEL()
ON_WM_PAINT()
ON_WM_SIZE()
ON_WM_TIMER()
ON_WM_VSCROLL()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CRepTabDlg message handlers
void CRepTabDlg::OnSetpage()
{
// TODO: Add your command handler code here
CPageSetupDialog dlg(PSD_MARGINS);
if(defdeviceset!=NULL)
dlg.m_psd.hDevMode=defdeviceset;
else
{
PRINTDLG pd;
ZeroMemory(&pd, sizeof(PRINTDLG));
AfxGetApp()->GetPrinterDeviceDefaults(&pd);
DEVMODE* pDV = (LPDEVMODE) ::GlobalLock(pd.hDevMode);
pDV->dmPaperSize=DMPAPER_B5;
GlobalUnlock(pd.hDevMode);
dlg.m_psd.hDevMode=pDV;
}
if(dlg.DoModal()==IDOK)
{
CSize size = dlg.GetPaperSize();
nPageWidth=size.cx*37.7928949357521/1000;
nPageHeight=size.cy*37.7928949357521/1000;
CalPageCount();
SetLeftMargin();
SetHVScrollRange();
CalBeginAndEndIndex();
UpDatePage();
defdeviceset=dlg.GetDevMode();
}
}
void CRepTabDlg::OnRepexit()
{
// TODO: Add your command handler code here
CWnd* pWnd=AfxGetApp()->GetMainWnd()->GetDesktopWindow()->GetActiveWindow();
pWnd->PostMessage(WM_CLOSE);
}
void CRepTabDlg::OnPrint()
{
// TODO: Add your command handler code here
CPrintDialog dlg(FALSE, PD_SELECTION | PD_USEDEVMODECOPIES);
if(defdeviceset!=NULL)
dlg.m_pd.hDevMode=defdeviceset;
else
{
PRINTDLG pd;
ZeroMemory(&pd, sizeof(PRINTDLG));
AfxGetApp()->GetPrinterDeviceDefaults(&pd);
DEVMODE* pDV = (LPDEVMODE) ::GlobalLock(pd.hDevMode);
pDV->dmPaperSize=DMPAPER_B5;
GlobalUnlock(pd.hDevMode);
dlg.m_pd.hDevMode=pDV;
}
dlg.m_pd.nCopies=1;
dlg.m_pd.nMaxPage=nPageCount;
dlg.m_pd.nMinPage=1;
dlg.m_pd.nFromPage=1;
dlg.m_pd.nToPage=nPageCount;
if(dlg.DoModal()==IDOK)
{
int nBeginPage,nEndPage;
if (dlg.PrintAll()) // print all pages in the document
{
nBeginPage = dlg.m_pd.nMinPage;
nEndPage = dlg.m_pd.nMaxPage;
}
else if (dlg.PrintRange()) // print only a range of pages
{ // in the document
nBeginPage = dlg.GetFromPage();
nEndPage = dlg.GetToPage();
}
else if (dlg.PrintSelection()) // print only the currently selected
{
nBeginPage = nEndPage = 1; // -1 to denote unknown yet
}
HDC hdc = dlg.GetPrinterDC();
CDC* pDC=new CDC();
pDC->Attach(hdc);
PreParePrinter(pDC);
PrintTabPage(pDC,nBeginPage,nEndPage);
pDC->Detach();
delete pDC;
}
}
//移到第一页
void CRepTabDlg::OnFirst()
{
// TODO: Add your command handler code here
CRect rect;
GetClientRect(rect);
int nMin,nMax;
pVScrollbar.GetScrollRange(&nMin,&nMax);
pVScrollbar.SetScrollPos(nMax-nPageHeight-2*nTopMargin-27+rect.Height());
UpDatePage();
}
void CRepTabDlg::OnLast()
{
// TODO: Add your command handler code here
CRect rect;
GetClientRect(rect);
int nMin,nMax;
pVScrollbar.GetScrollRange(&nMin,&nMax);
pVScrollbar.SetScrollPos(nMax-nPageHeight-2*nTopMargin-27+rect.Height());
UpDatePage();
}
void CRepTabDlg::OnNext()
{
// TODO: Add your command handler code here
if(nNowPagePos>=nPageCount) return;
CRect rect;
GetClientRect(rect);
pVScrollbar.SetScrollPos(nNowPagePos*(nPageHeight+nGap)+27+nTopMargin);
nNowPagePos++;
UpDatePage();
}
//上一页
void CRepTabDlg::OnPre()
{
// TODO: Add your command handler code here
CRect rect;
GetClientRect(rect);
nNowPagePos--;
pVScrollbar.SetScrollPos(nNowPagePos*(nPageHeight+nGap)+27+nTopMargin-(nPageHeight+nGap));
UpDatePage();
}
void CRepTabDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
if(pScrollBar==&pHScrollbar)
{
switch(nSBCode)
{
case SB_THUMBPOSITION:
pHScrollbar.SetScrollPos(nPos);
break;
case SB_LINEUP:
pHScrollbar.SetScrollPos(pHScrollbar.GetScrollPos()-40);
break;
case SB_LINEDOWN:
pHScrollbar.SetScrollPos(pHScrollbar.GetScrollPos()+40);
break;
case SB_LEFT:
pHScrollbar.SetScrollPos(pHScrollbar.GetScrollPos()-10);
break;
case SB_RIGHT:
pHScrollbar.SetScrollPos(pHScrollbar.GetScrollPos()+10);
break;
case SB_PAGERIGHT:
pHScrollbar.SetScrollPos(pHScrollbar.GetScrollPos()+20);
break;
case SB_PAGELEFT:
pHScrollbar.SetScrollPos(pHScrollbar.GetScrollPos()-20);
break;
}
UpDatePage();
}
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
BOOL CRepTabDlg::OnInitDialog()
{
CDialog::OnInitDialog();
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_TOOLBAR1))
{
TRACE0("Failed to create toolbar\n");
return false; // fail to create
}
m_wndToolBar.MoveWindow(0,0,410,27,TRUE);
m_wndToolBar.ShowWindow(SW_SHOW);
pHScrollbar.Create(SBS_HORZ | SBS_BOTTOMALIGN | WS_CHILD, CRect(5, 5, 100, 30), this, 100);
pHScrollbar.ShowScrollBar();
pVScrollbar.Create(SBS_VERT | SBS_RIGHTALIGN | WS_CHILD, CRect(100, 0, 120, 100), this, 200);
pVScrollbar.ShowScrollBar();
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return FALSE; // fail to create
}
m_wndStatusBar.ShowWindow(SW_SHOW);
m_wndStatusBar.SetPaneInfo(0,ID_SEPARATOR,2,0);
m_wndStatusBar.SetPaneInfo(1,ID_SEPARATOR,1,300);
m_bCreated=true;
ShowWindow(SW_MAXIMIZE);
CalPageCount();
SetLeftMargin();
SetHVScrollRange();
UpdateStatusBar();
CalBeginAndEndIndex();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
BOOL CRepTabDlg::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
// TODO: Add your message handler code here and/or call default
pVScrollbar.SetScrollPos(pVScrollbar.GetScrollPos()-zDelta);
UpDatePage();
return CDialog::OnMouseWheel(nFlags, zDelta, pt);
}
void CRepTabDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
UpDatePage();
// Do not call CDialog::OnPaint() for painting messages
}
void CRepTabDlg::OnSize(UINT nType, int cx, int cy)
{
if(!m_bCreated)
return;
CDialog::OnSize(nType, cx, cy);
CRect rect;
GetClientRect(rect);
int nWidth=rect.Width();
int nHeight=rect.Height();
m_wndStatusBar.MoveWindow(0,nHeight-16,nWidth,16,TRUE);
pHScrollbar.MoveWindow(0,nHeight-32,nWidth-16,16,TRUE);
pVScrollbar.MoveWindow(nWidth-16,20,16,nHeight-52,TRUE);
SetHVScrollRange();
}
void CRepTabDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CDialog::OnTimer(nIDEvent);
}
void CRepTabDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
if(pScrollBar==&pVScrollbar)
{
switch(nSBCode)
{
case SB_THUMBPOSITION:
pVScrollbar.SetScrollPos(nPos);
break;
case SB_LINEUP:
pVScrollbar.SetScrollPos(pVScrollbar.GetScrollPos()-5);
break;
case SB_LINEDOWN:
pVScrollbar.SetScrollPos(pVScrollbar.GetScrollPos()+5);
break;
case SB_PAGEDOWN:
pVScrollbar.SetScrollPos(pVScrollbar.GetScrollPos()+40);
break;
case SB_PAGEUP:
pVScrollbar.SetScrollPos(pVScrollbar.GetScrollPos()-40);
break;
}
UpDatePage();
}
CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}
BOOL CRepTabDlg::DestroyWindow()
{
// TODO: Add your specialized code here and/or call the base class
strTitle="";
arrTxt.RemoveAll();
nColCount=0;
nRowCount=0;
return CDialog::DestroyWindow();
}
void CRepTabDlg::DrawBK(CDC* pDC)
{
CRect rect;
GetClientRect(&rect);
rect.top=27;
rect.right-=16;
rect.bottom-=32;
pDC->SelectStockObject(2);
pDC->Rectangle(rect);
pDC->SelectStockObject(0);
}
//更新页
void CRepTabDlg::UpDatePage()
{
CDC* pDC=GetDC();
// CalPageCount();
// CalBeginAndEndIndex();
UpdateStatusBar();
DrawBK(pDC);
DrawPage(pDC);
DrawCell(pDC);
ReleaseDC(pDC);
}
void CRepTabDlg::CalPageCount()
{
nPageCount=((nRowCount+1)*nRowHeight%(nPageHeight-2*nPageInTop))>0?(nRowCount+1)*nRowHeight/(nPageHeight-2*nPageInTop)+1:(nRowCount+1)*nRowHeight/(nPageHeight-2*nPageInTop);
// nPageCount=1+(nRowHeight*nRowCount+nRowHeight)/(nPageHeight-2*nPageInTop);
}
//计算各页结束的行数
void CRepTabDlg::CalBeginAndEndIndex()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -