📄 invoicedlg.cpp
字号:
// invoiceDlg.cpp : implementation file
//
#include "stdafx.h"
#include "invoice.h"
#include "invoiceDlg.h"
#include "AddCommodityDlg.h"
#include "CustomerNameDlg.h"
#include "DecCommodityDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CInvoiceDlg dialog
CInvoiceDlg::CInvoiceDlg(CWnd* pParent /*=NULL*/)
: CDialog(CInvoiceDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CInvoiceDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CInvoiceDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CInvoiceDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CInvoiceDlg, CDialog)
//{{AFX_MSG_MAP(CInvoiceDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_ADD_COMMODITY_BUTTON, OnAddCommodityButton)
ON_BN_CLICKED(IDC_REWORK_BUTTON, OnReworkButton)
ON_BN_CLICKED(IDC_DEC_COMMODITY_BUTTON, OnDecCommodityButton)
ON_BN_CLICKED(IDC_PRINT_BUTTON, OnPrintButton)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CInvoiceDlg message handlers
BOOL CInvoiceDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
InvoiceData.sn=0;
InvoiceData.m_SumMoney =0;
strcpy(InvoiceData.m_CustomerName ,"清华大学");
strcpy(InvoiceData.m_BossName ,"机械工业出版社");
CRect rect;
GetClientRect(&rect);//获得客户区大小
ScreenToClient(&rect);//将屏幕坐标转化为客户坐标
m_bitmapRect.left =rect.left+6 ;
m_bitmapRect.right =rect.right ;
m_bitmapRect.top =rect.top ;
GetInfo();
return TRUE; // return TRUE unless you set the focus to a control
}
void CInvoiceDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CInvoiceDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
CDC* pDC;
pDC=GetDC();
rato=float(m_bitmapRect.right-m_bitmapRect.left)/Orient.Size .x;
m_bitmapRect.bottom =m_bitmapRect.top+int(Orient.Size .y *rato);
Draw(pDC,&m_bitmapRect);
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CInvoiceDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CInvoiceDlg::OnAddCommodityButton()
{
// TODO: Add your control notification handler code here
CAddCommodityDlg AddCommodity;
int i;
if(InvoiceData.sn>2)
{
MessageBox("发票最多开三项");
return ;
}
if(AddCommodity.DoModal()==IDOK)
{
strcpy(InvoiceData.m_Commodity[InvoiceData.sn].m_CommodityName,AddCommodity.m_CommodityName);
strcpy(InvoiceData.m_Commodity[InvoiceData.sn].m_Specification,AddCommodity.m_Specification);
strcpy(InvoiceData.m_Commodity[InvoiceData.sn].m_Unit,AddCommodity.m_Unit);
InvoiceData.m_Commodity[InvoiceData.sn].m_Number=AddCommodity.m_Number;
InvoiceData.m_Commodity[InvoiceData.sn].m_UnitPrice=AddCommodity.m_UnitPrice;
InvoiceData.m_Commodity[InvoiceData.sn].m_Sum=int(AddCommodity.m_Sum*100);
}
//由单价和数量得出总金额
if(InvoiceData.m_Commodity[InvoiceData.sn].m_UnitPrice&&
InvoiceData.m_Commodity[InvoiceData.sn].m_Number&&
!InvoiceData.m_Commodity[InvoiceData.sn].m_Sum)
{
InvoiceData.m_Commodity[InvoiceData.sn].m_Sum=
int(InvoiceData.m_Commodity[InvoiceData.sn].m_UnitPrice*
InvoiceData.m_Commodity[InvoiceData.sn].m_Number*
100);
}
//如果总金额不等于由单价和数量计算出的总金额,则报错
else if(InvoiceData.m_Commodity[InvoiceData.sn].m_UnitPrice&&
InvoiceData.m_Commodity[InvoiceData.sn].m_Number&&
abs(InvoiceData.m_Commodity[InvoiceData.sn].m_Sum-
int(InvoiceData.m_Commodity[InvoiceData.sn].m_UnitPrice*
InvoiceData.m_Commodity[InvoiceData.sn].m_Number*
100))>2)
{
MessageBox("总金额计算错误,本次输入无效");
return ;
}
else if(!InvoiceData.m_Commodity[InvoiceData.sn].m_UnitPrice&&
!InvoiceData.m_Commodity[InvoiceData.sn].m_Number&&
!InvoiceData.m_Commodity[InvoiceData.sn].m_Sum)
{
MessageBox("输入错误");
return ;
}
if(InvoiceData.m_Commodity[InvoiceData.sn].m_Sum>=100000)
{
MessageBox("本发票金额不能大于100000元");
return ;
}
InvoiceData.m_SumMoney=0;
for(i=0;i<=InvoiceData.sn ;i++)
{
InvoiceData.m_SumMoney+=InvoiceData.m_Commodity[i].m_Sum;
}
if(InvoiceData.m_SumMoney>=100000)
{
MessageBox("本发票金额不能大于100000元");
return ;
}
InvoiceData.sn ++;
Invalidate(TRUE);
}
void CInvoiceDlg::OnReworkButton()
{
// TODO: Add your control notification handler code here
CCustomerNameDlg CustomerName;
if(CustomerName.DoModal()==IDOK)
{
strcpy(InvoiceData.m_CustomerName ,CustomerName.m_CustomerName);
strcpy(InvoiceData.m_BossName ,CustomerName.m_BossName);
}
Invalidate();
}
void CInvoiceDlg::OnDecCommodityButton()
{
// TODO: Add your control notification handler code here
int i,sn;
CDecCommodityDlg DecCommodity;
for(i=0;i<InvoiceData.sn;i++)
{
DecCommodity.GetString(InvoiceData.m_Commodity[i].m_CommodityName);
}
if(DecCommodity.DoModal()==IDOK)
{
if((sn=DecCommodity.i)!=CB_ERR)
{
if(sn<=InvoiceData.sn-1)
{
for(i=sn;i<InvoiceData.sn-1;i++)
{
strcpy(InvoiceData.m_Commodity[sn].m_CommodityName,
InvoiceData.m_Commodity[sn+1].m_CommodityName);
strcpy(InvoiceData.m_Commodity[sn].m_Specification,
InvoiceData.m_Commodity[sn+1].m_Specification);
strcpy(InvoiceData.m_Commodity[sn].m_Unit,
InvoiceData.m_Commodity[sn+1].m_Unit);
InvoiceData.m_Commodity[sn].m_Number=
InvoiceData.m_Commodity[sn+1].m_Number;
InvoiceData.m_Commodity[sn].m_UnitPrice=
InvoiceData.m_Commodity[sn+1].m_UnitPrice;
InvoiceData.m_Commodity[sn].m_Sum=
InvoiceData.m_Commodity[sn+1].m_Sum;
}
}
InvoiceData.sn-=1;
}
}
Invalidate();
}
BOOL CInvoiceDlg::Draw(CDC *pDC,CRect *bitmapRect)
{
CFont font120,font140,font90, *pOldFont;
CPen pen1,pen2,*pOldPen;
CRect rect;
int i,j;
int DxWidths[22]={0,30,0,30,0,30,0,30,0
,30,0,30,0,30,0,30,0,30,0,30,0,30};
int DxWidths140[6]={0,70,0,70,0,70};
char Buffer[20],TempBuffer[40];
if(!pDC->IsPrinting ())
{
pDC->SetWindowOrg(0,0);
pDC->SetViewportOrg(bitmapRect->left ,bitmapRect->top);
//设置位图背景模式为不透明
pDC->SetBkMode(OPAQUE);
//设置位图背景颜色为白色
pDC->SetBkColor(RGB(255,255,255));
//填充位图
pDC->FillSolidRect(0,0,bitmapRect->Width(),
bitmapRect->Height(),RGB(255,255,255));
}
//设置文字显示颜色
pDC->SetTextColor(RGB(0,0,0));
//创建点阵字体
font120.CreatePointFont(120,_T("楷体_GB2312"),pDC);
//将字体选入
pOldFont=pDC->SelectObject(&font120);
//创建画笔
pen2.CreatePen (PS_SOLID,2,RGB(0,0,0));
//将画笔选入
pOldPen=pDC->SelectObject (&pen2);
if(!pDC->IsPrinting ())
{
rect.left =int((Orient.Caption .x)*rato);
rect.top =int((Orient.Caption .y)*rato);
rect.right =int((Orient.Caption .x+80)*rato);
rect.bottom =int((Orient.Caption .y+5)*rato);
pDC->ExtTextOut(int(Orient.Caption .x*rato),
int(Orient.Caption .y*rato),
ETO_CLIPPED,&rect,"北京市商业企业专用发票",22,DxWidths);
//画横线
pDC->MoveTo (int(Orient.Line .x*rato) ,int(Orient.Line .y*rato));
pDC->LineTo (int((Orient.Line .x+88)*rato) ,int(Orient.Line .y*rato));
//显示存根联
font140.CreatePointFont(140,_T("楷体_GB2312"),pDC);
pOldFont=pDC->SelectObject(&font140);
rect.left =int((Orient.InvoicePage.x)*rato);
rect.top =int((Orient.InvoicePage.y)*rato);
rect.right =int((Orient.InvoicePage.x+42)*rato);
rect.bottom =int((Orient.InvoicePage.y+6)*rato);
pDC->ExtTextOut(int(Orient.InvoicePage.x*rato),
int(Orient.InvoicePage.y*rato),
ETO_CLIPPED,&rect,"存根联",6,DxWidths140);
//显示客户名称标题
font90.CreatePointFont(90,_T("楷体_GB2312"),pDC);
pOldFont=pDC->SelectObject(&font90);
pDC->TextOut (int(Orient.CustomerCaption .x *rato),int(Orient.CustomerCaption .y *rato),"客户名称:");
}
//显示客户名称
pOldFont=pDC->SelectObject(&font120);
pDC->TextOut (int(Orient.CustomerName .x *rato),
int(Orient.CustomerName .y *rato),InvoiceData.m_CustomerName );
//画发票表格
if(!pDC->IsPrinting ())
{
//画表格外边框
pDC->Rectangle (int(Orient.form.left *rato),int(Orient.form .top *rato),
int(Orient.form.right *rato),int(Orient.form .bottom *rato));
//创建画笔
pen1.CreatePen (PS_SOLID,1,RGB(0,0,0));
//将画笔选入
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -