?? dlglineinput.cpp
字號:
// DlgLineInput.cpp : implementation file
//
#include "stdafx.h"
#include "..\DogMgt.h"
#include "DlgLineInput.h"
#include "..\\DogMgt_Core\\DogMgt_Base.h"
#include "..\\DogMgt_Core\\GlobalFunc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDlgLineInput dialog
CDlgLineInput::CDlgLineInput(CWnd* pParent /*=NULL*/)
: CDialog(CDlgLineInput::IDD, pParent)
{
//{{AFX_DATA_INIT(CDlgLineInput)
m_strInput = _T("");
m_strPrompt = _T("");
//}}AFX_DATA_INIT
m_InputFlag = INPUT_STR;
m_strMaxLength = 40;
}
void CDlgLineInput::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgLineInput)
DDX_Control(pDX, IDCANCEL, m_btnCancel);
DDX_Control(pDX, IDOK, m_btnOK);
DDX_Control(pDX, IDC_EDIT_INPUT, m_ctrlInput);
DDX_Text(pDX, IDC_EDIT_INPUT, m_strInput);
DDX_Text(pDX, IDC_STATIC_PROMPT, m_strPrompt);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDlgLineInput, CDialog)
//{{AFX_MSG_MAP(CDlgLineInput)
ON_WM_SHOWWINDOW()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDlgLineInput message handlers
///設置對話框標題
/**
* pTitle : 對話框標題 \n
*/
void CDlgLineInput::SetTitle(const char *pTitle)
{
m_strTitle = pTitle;
}
///設置輸入提示
/**
* pPrompt : 輸入提示信息 \n
*/
void CDlgLineInput::SetPrompt(const char *pPrompt)
{
m_strPrompt = pPrompt;
}
///設置金額輸入格式
void CDlgLineInput::SetAmountFormat()
{
m_InputFlag = INPUT_AMOUNT;
}
///設置BCD輸入格式
/**
* BcdLength : 待輸入的BCD串的長度 \n
*/
void CDlgLineInput::SetBcdFormat(unsigned int BcdLength)
{
m_InputFlag = INPUT_BCD;
m_bcdLength = BcdLength;
}
///設置總參數量輸入格式
void CDlgLineInput::SetFltNumFormat()
{
m_InputFlag = INPUT_FLTNUM;
}
///設置字符串輸入格式
/**
* MaxLength : 允許輸入的最大長度 \n
*/
void CDlgLineInput::SetStrFormat(unsigned int MaxLength)
{
m_InputFlag = INPUT_STR;
m_strMaxLength = MaxLength;
}
///設置時間輸入格式
void CDlgLineInput::SetTimeFormat()
{
m_InputFlag = INPUT_TIME;
}
///設置日期輸入格式
void CDlgLineInput::SetDateFormat()
{
m_InputFlag = INPUT_DATE;
memset(m_dateMin, 0, 4);
memset(m_dateMax, 0xFF, 4);
}
///設置日期最小輸入值
/**
* MinDate : 最小日期, BCD \n
*/
void CDlgLineInput::SetMinDate(const unsigned char *MinDate)
{
if(MinDate==NULL){
memset(m_dateMin, 0, 4);
}
else{
memcpy(m_dateMin, MinDate, 4);
}
}
///設置日期最大輸入值
/**
* MaxDate : 最大日期, BCD \n
*/
void CDlgLineInput::SetMaxDate(const unsigned char *MaxDate)
{
if(MaxDate==NULL){
memset(m_dateMax, 0xFF, 4);
}
else{
memcpy(m_dateMax, MaxDate, 4);
}
}
///輸入十六進制輸入格式
/**
* HexLength : 待輸入的HEX串的長度 \n
*/
void CDlgLineInput::SetHexFormat(unsigned int HexLength)
{
m_InputFlag = INPUT_HEX;
m_hexLength = HexLength;
}
///設置整數輸入格式
/**
* MinInt : 待輸入整數的最小值 \n
* MaxInt : 待輸入整數的最大值 \n
*/
void CDlgLineInput::SetIntFormat(unsigned int MinInt, unsigned int MaxInt)
{
m_InputFlag = INPUT_INT;
m_intMinInt = MinInt;
m_intMaxInt = MaxInt;
}
///獲取字符串輸入結果
/**
* StrBuf : 返回輸入的字符串 \n
* 返回 : SUCC/FAIL
*/
int CDlgLineInput::GetStrResult(char *StrBuf)
{
if(m_InputFlag!=INPUT_STR){
return FAIL;
}
memset(StrBuf, 0, m_strMaxLength+1);
memcpy(StrBuf, m_strInput.GetBuffer(m_strInput.GetLength()), m_strInput.GetLength());
return SUCC;
}
///獲取整數輸入結果
/**
* Result : 返回輸入的整數 \n
* 返回 : SUCC/FAIL
*/
int CDlgLineInput::GetIntResult(unsigned int &Result)
{
if(m_InputFlag!=INPUT_INT){
return FAIL;
}
Result = m_intResult;
return SUCC;
}
///獲取BCD輸入結果
/**
* BcdBuf : 返回BCD輸入結果 \n
* BcdLength : 返回輸入的BCD串的字節數 \n
* 返回 : SUCC/FAIL
*/
int CDlgLineInput::GetBcdResult(unsigned char *BcdBuf, unsigned int &BcdLength)
{
if(m_InputFlag!=INPUT_BCD){
return FAIL;
}
BcdLength = m_bcdLength;
memcpy(BcdBuf, m_bcdResult, BcdLength);
return SUCC;
}
///獲取十六進制輸入結果
/**
* HexBuf : 返回輸入的十六進制串 \n
* HexLength : 返回輸入的HEX串的字節數 \n
* 返回 : SUCC/FAIL
*/
int CDlgLineInput::GetHexResult(unsigned char *HexBuf, unsigned int &HexLength)
{
if(m_InputFlag!=INPUT_HEX){
return FAIL;
}
HexLength = m_hexLength;
memcpy(HexBuf, m_hexResult, HexLength);
return SUCC;
}
///獲取金額輸入結果
/**
* Amount : 返回輸入的金額,以分為單位 \n
* 返回 : SUCC/FAIL
*/
int CDlgLineInput::GetAmountResult(unsigned int &Amount)
{
if(m_InputFlag!=INPUT_AMOUNT){
return FAIL;
}
Amount = m_amountResult;
return SUCC;
}
///獲取總參數量輸入結果
/**
* NumWithoutDot : 返回去除小數點后的數量值 \n
* FloatPartOfLength : 返回小數部分的長度 \n
* 返回 : SUCC/FAIL
*/
int CDlgLineInput::GetFltNumResult(unsigned int &NumWithoutDot, unsigned char &FloatPartOfLength)
{
if(m_InputFlag!=INPUT_FLTNUM){
return FAIL;
}
NumWithoutDot = m_numWithoutDot;
FloatPartOfLength = m_floatPartLength;
return SUCC;
}
///獲取日期輸入結果
/**
* Year, Month, Day : 返回年,月,日 \n
* 返回 : SUCC/FAIL
*/
int CDlgLineInput::GetDateResult(unsigned int &Year, unsigned char &Month, unsigned char &Day)
{
if(m_InputFlag!=INPUT_DATE){
return FAIL;
}
Year = m_Year;
Month = m_Month;
Day = m_Day;
return SUCC;
}
///獲取日期輸入結果
/**
* DateBuf : 返回日期,BCD格式 \n
* 返回 : SUCC/FAIL
*/
int CDlgLineInput::GetDateResult(unsigned char *DateBuf)
{
if(m_InputFlag!=INPUT_DATE){
return FAIL;
}
memcpy(DateBuf, m_dateResult, 4);
return SUCC;
}
///獲取時間輸入格式
/**
* Hour, Minute, Second : 返回時間輸入結果,時、分、秒 \n
* 返回 : SUCC/FAIL
*/
int CDlgLineInput::GetTimeResult(unsigned char &Hour, unsigned char &Minute, unsigned char &Second)
{
if(m_InputFlag!=INPUT_TIME){
return FAIL;
}
Hour = m_Hour;
Minute = m_Minute;
Second = m_Second;
return SUCC;
}
///初始化對話框
BOOL CDlgLineInput::OnInitDialog()
{
CDialog::OnInitDialog();
m_btnOK.SetIcon(IDI_OK);
m_btnCancel.SetIcon(IDI_CANCEL);
char buf[100], buf1[100], buf2[100];
// unsigned int MaxInt;
// int length;
SetWindowText(m_strTitle);
switch(m_InputFlag){
case INPUT_BCD:
sprintf(buf, "%s%d%s", "(", m_bcdLength, "字節)");
m_strPrompt += buf;
break;
case INPUT_HEX:
sprintf(buf, "%s%d%s", "(", m_hexLength, "字節)");
m_strPrompt += buf;
break;
case INPUT_INT:
if(m_intMinInt>0){//最小值大于0
if(m_intMaxInt<0xFFFFFFFF){//最大值未到最大值
sprintf(buf, "%s%d%s%d%s", "(范圍:", m_intMinInt, "--", m_intMaxInt, ")");
m_strPrompt += buf;
}
else{
sprintf(buf, "%s%d%s", "(范圍:>=", m_intMinInt, ")");
m_strPrompt += buf;
}
}
else if(m_intMaxInt<0xFFFFFFFF){//最小為0
sprintf(buf, "%s%d%s", "(范圍:<=", m_intMaxInt, ")");
m_strPrompt += buf;
}
break;
case INPUT_DATE:
memset(buf, 0, 4);
if(memcmp(m_dateMin, buf, 4)){//有最小值
Bcd2Str(m_dateMin, buf1, 4);
memset(buf, 0xFF, 4);
if(memcmp(m_dateMax, buf, 4)){//有最大值
Bcd2Str(m_dateMax, buf2, 4);
sprintf(buf, "%s%s%s%s%s", "(范圍:", buf1, "--", buf2, ")");
m_strPrompt += buf;
}
else{//無最大值
sprintf(buf, "%s%s%s", "(范圍:>=", buf1, ")");
m_strPrompt += buf;
}
}
else{//無最小值
memset(buf, 0xFF, 4);
if(memcmp(m_dateMax, buf, 4)){//有最大值
Bcd2Str(m_dateMax, buf2, 4);
sprintf(buf, "%s%s%s", "(范圍:<=", buf2, ")");
m_strPrompt += buf;
}
}
break;
default:
break;
}
switch(m_InputFlag){
case INPUT_AMOUNT:
//m_ctrlInput.SetLimitText(11);
m_ctrlInput.SetAmountFormat();
break;
case INPUT_BCD:
//m_ctrlInput.SetLimitText(m_bcdLength * 2);
m_ctrlInput.SetBcdFormat(m_bcdLength);
break;
case INPUT_FLTNUM:
//m_ctrlInput.SetLimitText(10);
m_ctrlInput.SetFltNumFormat();
break;
case INPUT_INT:
/*
length = 0;
MaxInt = m_intMaxInt;
while(MaxInt>0){
MaxInt /= 10;
length ++;
}
m_ctrlInput.LimitText(length);
*/
m_ctrlInput.SetIntFormat(m_intMinInt, m_intMaxInt);
break;
case INPUT_HEX:
//m_ctrlInput.SetLimitText(m_hexLength * 2);
m_ctrlInput.SetHexFormat(m_hexLength);
break;
case INPUT_STR:
//m_ctrlInput.SetLimitText(m_strMaxLength);
m_ctrlInput.SetStrFormat(m_strMaxLength);
break;
case INPUT_TIME:
m_ctrlInput.SetTimeFormat();
break;
case INPUT_DATE:
m_ctrlInput.SetDateFormat();
//m_ctrlInput.SetLimitText(8);
break;
default:
break;
}
m_strInput.Empty();
UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CDlgLineInput::OnOK()
{
UpdateData(TRUE);
char buf[500];
memset(buf, 0, sizeof(buf));
memcpy(buf, m_strInput.GetBuffer(m_strInput.GetLength()), m_strInput.GetLength());
switch(m_InputFlag){
case INPUT_INT:
if(CheckIntInput(buf, m_intResult)!=SUCC){
ShowMsg("輸入格式錯誤.");
return;
}
if(m_intResult>m_intMaxInt || m_intResult<m_intMinInt){
ShowMsg("輸入格式錯誤.");
return;
}
break;
case INPUT_BCD:
if(CheckBcdInput(buf, m_bcdLength, m_bcdResult)!=SUCC){
ShowMsg("輸入格式錯誤.");
return;
}
break;
case INPUT_HEX:
if(CheckHexInput(buf, m_hexLength, m_hexResult)!=SUCC){
ShowMsg("輸入格式錯誤.");
return;
}
break;
case INPUT_STR:
break;
case INPUT_AMOUNT:
if(CheckAmountInput(buf, m_amountResult)!=SUCC){
ShowMsg("輸入格式錯誤.");
return;
}
break;
case INPUT_DATE:
if(CheckStrDateFormat((unsigned char*)buf)!=SUCC){
ShowMsg("輸入格式錯誤.");
return;
}
Str2Bcd(buf, m_dateResult, 8);
if(CmpBcdDate(m_dateResult, m_dateMin)<0 ||
CmpBcdDate(m_dateResult, m_dateMax)>0){
ShowMsg("輸入格式錯誤.");
return;
}
bcd2greg(m_dateResult, (int&)m_Year, (int&)m_Month, (int&)m_Day);
break;
case INPUT_TIME:
if(!(isdigit(buf[0]) &&
isdigit(buf[1]) &&
buf[2]==':' &&
isdigit(buf[3]) &&
isdigit(buf[4]) &&
buf[5]==':' &&
isdigit(buf[6]) &&
isdigit(buf[7])) ){
ShowMsg("輸入格式錯誤.");
return;
}
m_Hour = (buf[0]-'0') * 10 + (buf[1]-'0');
m_Minute = (buf[3]-'0') * 10 + (buf[4]-'0');
m_Second = (buf[6]-'0') * 10 + (buf[7]-'0');
if(m_Hour>23 || m_Minute>59 || m_Second>59){
ShowMsg("輸入格式錯誤.");
return;
}
break;
case INPUT_FLTNUM:
if(CheckFltNumInput(buf, m_numWithoutDot, m_floatPartLength)!=SUCC){
ShowMsg("輸入格式錯誤.");
return;
}
break;
default:
break;
}
CDialog::OnOK();
}
void CDlgLineInput::OnShowWindow(BOOL bShow, UINT nStatus)
{
CDialog::OnShowWindow(bShow, nStatus);
m_ctrlInput.SetFocus();
}
CDlgLineInput g_DlgLineInput;
void TestDlgLineInput()
{
// int ret;
//輸入測試
//輸入字符串
char PayUnit[41];
g_DlgLineInput.SetTitle("輸入付款單位");
g_DlgLineInput.SetPrompt("請輸入付款單位:");
g_DlgLineInput.SetStrFormat(40);
g_DlgLineInput.DoModal();
g_DlgLineInput.GetStrResult(PayUnit);
/*
//輸入日期
unsigned char Date[5];
unsigned int y;
unsigned char m, d;
unsigned char MinDate[5] = {0x20, 0x06, 0x01, 0x01};
unsigned char MaxDate[5] = {0x20, 0x06, 0x12, 0x31};
g_DlgLineInput.SetTitle("稅控申報");
g_DlgLineInput.SetPrompt("請輸入申報數據截止日期:");
g_DlgLineInput.SetDateFormat();
g_DlgLineInput.SetMinDate(MinDate);
g_DlgLineInput.SetMaxDate(MaxDate);
ret = g_DlgLineInput.DoModal();
g_DlgLineInput.GetDateResult(Date);
g_DlgLineInput.GetDateResult(y, m, d);
//輸入整數
unsigned int Num;
g_DlgLineInput.SetTitle("查詢單張發票");
g_DlgLineInput.SetPrompt("請輸入發票號:");
g_DlgLineInput.SetIntFormat(0, 100);
g_DlgLineInput.DoModal();
g_DlgLineInput.GetIntResult(Num);
//輸入金額
unsigned int Amount;
g_DlgLineInput.SetTitle("付款");
g_DlgLineInput.SetPrompt("請輸入付款金額:");
g_DlgLineInput.SetAmountFormat();
g_DlgLineInput.DoModal();
g_DlgLineInput.GetAmountResult(Amount);
//輸入數量
unsigned int NumWithoutDot;
unsigned char FloatPartLength;
g_DlgLineInput.SetTitle("開票");
g_DlgLineInput.SetPrompt("請輸入項目數量:");
g_DlgLineInput.SetFltNumFormat();
g_DlgLineInput.DoModal();
g_DlgLineInput.GetFltNumResult(NumWithoutDot, FloatPartLength);
//輸入BCD
unsigned char BcdBuf[200];
unsigned int BcdLength;
g_DlgLineInput.SetTitle("BCD輸入");
g_DlgLineInput.SetPrompt("請輸入BCD數:");
g_DlgLineInput.SetBcdFormat(10);
g_DlgLineInput.DoModal();
g_DlgLineInput.GetBcdResult(BcdBuf, BcdLength);
//輸入十六進制數
unsigned char HexBuf[200];
unsigned int HexLength;
g_DlgLineInput.SetTitle("HEX輸入");
g_DlgLineInput.SetPrompt("請輸入十六進制數:");
g_DlgLineInput.SetHexFormat(10);
g_DlgLineInput.DoModal();
g_DlgLineInput.GetHexResult(HexBuf, HexLength);
//輸入時間
unsigned char Hour, Minute, Second;
g_DlgLineInput.SetTitle("時間設置");
g_DlgLineInput.SetPrompt("請輸入時間:");
g_DlgLineInput.SetTimeFormat();
g_DlgLineInput.DoModal();
g_DlgLineInput.GetTimeResult(Hour, Minute, Second);
*/
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -