www.pudn.com > Calculator12.rar > CalculatorDlg.cpp


// CalculatorDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "Calculator.h" 
#include "CalculatorDlg.h" 
#include "CNUM.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CCalculatorDlg dialog 
 
CCalculatorDlg::CCalculatorDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CCalculatorDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CCalculatorDlg) 
	m_strExp = _T(""); 
	m_strRes = _T(""); 
	//}}AFX_DATA_INIT 
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
	m_bitmap.LoadBitmap(IDB_BITMAP_CONVERT2); 
} 
 
void CCalculatorDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CCalculatorDlg) 
	DDX_Control(pDX, IDC_BTN_CONVERT, m_btn_convert); 
	DDX_Control(pDX, IDC_RADIO_RADIAN, m_radio_radian); 
	DDX_Control(pDX, IDC_RADIO_DEGREE, m_radio_degree); 
	DDX_Control(pDX, IDC_EDIT_INPUT, m_strExpc); 
	DDX_Text(pDX, IDC_EDIT_INPUT, m_strExp); 
	DDX_Text(pDX, IDC_EDIT_RESULT, m_strRes); 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CCalculatorDlg, CDialog) 
	//{{AFX_MSG_MAP(CCalculatorDlg) 
	ON_WM_PAINT() 
	ON_WM_QUERYDRAGICON() 
	ON_BN_CLICKED(IDC_BUTTON_NUM, OnButtonNum) 
	ON_WM_TIMER() 
	ON_BN_CLICKED(IDC_BUTTON_OP, OnButtonOp) 
	ON_BN_CLICKED(IDC_BUTTON_FUNC, OnButtonFunc) 
	ON_BN_CLICKED(IDC_BTN_CONST, OnBtnConst) 
	ON_BN_CLICKED(IDC_BTN_HISTREXP, OnBtnHistrexp) 
	ON_COMMAND(ID_M_PI, OnMPi) 
	ON_COMMAND(ID_M_C, OnMC) 
	ON_COMMAND(ID_M_NA, OnMNa) 
	ON_COMMAND(ID_M_G, OnMG) 
	ON_COMMAND(ID_M_R, OnMR) 
	ON_COMMAND(ID_M_K, OnMK) 
	ON_COMMAND(ID_M_VM, OnMVm) 
	ON_COMMAND(ID_M_KE, OnMKe) 
	ON_COMMAND(ID_M_E0, OnME0) 
	ON_COMMAND(ID_M_E, OnME) 
	ON_BN_CLICKED(IDC_BTN_CONVERT, OnBtnConvert) 
	ON_COMMAND(ID_M_HEX, OnMHex) 
	ON_COMMAND(ID_M_OCT, OnMOct) 
	ON_COMMAND(ID_M_BIN, OnMBin) 
	ON_COMMAND(ID_M_DEC, OnMDec) 
	//}}AFX_MSG_MAP 
	ON_COMMAND_RANGE(IMENU_ITEM_ID,IMENU_ITEM_ID+100,OnMenuSelect) 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CCalculatorDlg message handlers 
 
BOOL CCalculatorDlg::OnInitDialog() 
{ 
	CDialog::OnInitDialog(); 
 
	// 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 
	m_menu2.CreatePopupMenu(); 
	pNUMDlg=new CCNUM; 
	pNUMDlg->Create(IDD_DIALOG_NUM); 
	pOPDlg=new CCOP; 
	pOPDlg->Create(IDD_DIALOG_OP); 
	pFUNCDlg=new CCFUNC; 
	pFUNCDlg->Create(IDD_DIALOG_FUNC); 
	bIsNumBoardOpen=0; 
	bIsOpBoardOpen=0; 
	bIsFuncBoardOpen=0; 
	bIsOk=0; 
	m_radio_radian.SetCheck(1); 
	m_btn_convert.SetBitmap(m_bitmap); 
	return TRUE;  // return TRUE  unless you set the focus to a control 
} 
 
// 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 CCalculatorDlg::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(); 
	} 
} 
 
// The system calls this to obtain the cursor to display while the user drags 
//  the minimized window. 
HCURSOR CCalculatorDlg::OnQueryDragIcon() 
{ 
	return (HCURSOR) m_hIcon; 
} 
 
void CCalculatorDlg::OnOK()  
{ 
	UpdateData(1); 
	if(m_radio_degree.GetCheck()==1) calcu.m_bDegree=1; 
//	calcu.Dec2Hex(&m_strExp); 
	CString strRes=calcu.MainPro(m_strExp); 
//	m_combo_histrexp.AddString(m_strExp); 
//	m_combo_histrresult.AddString(strRes); 
	m_strRes=strRes; 
	m_strResTmp=strRes; 
	AddToHistr(m_strExp+"= "+strRes); 
	UpdateData(0); 
//	CDialog::OnOK(); 
} 
 
void CCalculatorDlg::OnTimer(UINT nIDEvent)  
{ 
	UpdateData(1); 
	if(pNUMDlg->m_strN=="OVER") 
	{ 
		bIsNumBoardOpen=0; 
		KillTimer(0); 
	} 
	else if(pNUMDlg->m_strN=="BACK") 
	{ 
		UpdateData(1); 
		Paster("",0); 
		m_strExpc.GetSel(m_nStart,m_nEnd); 
		m_strExp.Delete(m_nStart-1); 
		UpdateData(0); 
		m_strExpc.SetFocus(); 
		m_strExpc.SetSel(m_nStart-1,m_nStart-1); 
		pNUMDlg->m_strN=""; 
	} 
	else if(!pNUMDlg->m_strN.IsEmpty()) 
	{ 
		Paster(pNUMDlg->m_strN,0); 
		pNUMDlg->m_strN=""; 
	} 
 
	if(pOPDlg->m_strN=="OVER") 
	{ 
		bIsOpBoardOpen=0; 
		KillTimer(1); 
	} 
	else if(!pOPDlg->m_strN.IsEmpty()) 
	{ 
		Paster(pOPDlg->m_strN,0); 
		pOPDlg->m_strN=""; 
	} 
 
	if(pFUNCDlg->m_strN=="OVER") 
	{ 
		bIsFuncBoardOpen=0; 
		KillTimer(2); 
	} 
	else if(!pFUNCDlg->m_strN.IsEmpty()) 
	{ 
		Paster(pFUNCDlg->m_strN,1); 
		pFUNCDlg->m_strN=""; 
	} 
	if(nIDEvent==3)  
	{ 
		GetWindowRect(m_rect); 
		pNUMDlg->SetWindowPos(NULL,m_rect.left+375,m_rect.top,-1,-1,SWP_NOSIZE); 
		pFUNCDlg->SetWindowPos(NULL,m_rect.left,m_rect.top-165,-1,-1,SWP_NOSIZE); 
		pOPDlg->SetWindowPos(NULL,m_rect.left+256,m_rect.top-118,-1,-1,SWP_NOSIZE); 
	} 
	UpdateData(0);	 
	CDialog::OnTimer(nIDEvent); 
} 
 
void CCalculatorDlg::OnButtonNum()  
{ 
	if(!bIsNumBoardOpen) 
	{ 
		GetWindowRect(m_rect); 
		pNUMDlg->SetWindowPos(NULL,m_rect.left+375,m_rect.top,-1,-1,SWP_NOSIZE); 
		pNUMDlg->ShowWindow(SW_SHOW); 
		SetTimer(0,200,NULL); 
		bIsNumBoardOpen=1; 
	} 
	else 
	{ 
		pNUMDlg->ShowWindow(SW_HIDE); 
		bIsNumBoardOpen=0; 
		KillTimer(0); 
	} 
} 
 
void CCalculatorDlg::OnButtonOp()  
{ 
	if(!bIsOpBoardOpen) 
	{ 
		GetWindowRect(m_rect); 
		pOPDlg->SetWindowPos(NULL,m_rect.left+256,m_rect.top-118,-1,-1,SWP_NOSIZE); 
		pOPDlg->ShowWindow(SW_SHOW); 
		SetTimer(1,200,NULL); 
		bIsOpBoardOpen=1; 
	} 
	else 
	{ 
		pOPDlg->ShowWindow(SW_HIDE); 
		bIsOpBoardOpen=0; 
		KillTimer(1); 
	} 
} 
 
void CCalculatorDlg::OnButtonFunc()  
{ 
	if(!bIsFuncBoardOpen) 
	{ 
		GetWindowRect(m_rect); 
		pFUNCDlg->SetWindowPos(NULL,m_rect.left,m_rect.top-167,-1,-1,SWP_NOSIZE); 
		pFUNCDlg->ShowWindow(SW_SHOW); 
		SetTimer(2,200,NULL); 
		bIsFuncBoardOpen=1; 
	} 
	else 
	{ 
		pFUNCDlg->ShowWindow(SW_HIDE); 
		bIsFuncBoardOpen=0; 
		KillTimer(2); 
	} 
} 
 
void CCalculatorDlg::Paster(CString strSign,BOOL bIsSingle) 
{ 
	UpdateData(1); 
	CString str; 
	m_nlen=m_strExp.GetLength(); 
	m_strExpc.GetSel(m_nStart,m_nEnd); 
	str=m_strExp.Mid(m_nEnd,m_nlen-m_nEnd); 
	m_strExp=m_strExp.Left(m_nStart)+strSign; 
	m_nlen=m_strExp.GetLength(); 
	if(bIsSingle) m_nlen-=2; 
	m_strExp+=str; 
	UpdateData(0); 
	m_strExpc.SetFocus(); 
	m_strExpc.SetSel(m_nlen,m_nlen); 
} 
 
 
BOOL CCalculatorDlg::PreTranslateMessage(MSG* pMsg)  
{ 
	if(pMsg->wParam==HTCAPTION && pMsg->message==WM_NCLBUTTONDOWN && pMsg->hwnd==this->m_hWnd) 
	{ 
		if(!bIsOk) 
		{ 
			SetTimer(3,20,NULL); 
	//		MessageBox("set"); 
			bIsOk=1; 
		} 
	} 
	else 
	{ 
		if(bIsOk) 
		{ 
			KillTimer(3); 
	//		MessageBox("kill"); 
			bIsOk=0; 
		}	 
	} 
	return CDialog::PreTranslateMessage(pMsg); 
} 
 
void CCalculatorDlg::OnBtnConst()  
{ 
	UpdateData(1); 
	CWnd * pFrame;					 
	pFrame=AfxGetApp()->GetMainWnd(); 
	CWnd* pWndPopupOwner = this; 
	VERIFY(m_menu.LoadMenu(IDR_MENU1)); 
	CPoint point; 
	GetCursorPos(&point); 
	::SetForegroundWindow(m_hWnd);  
	CMenu* pPopup = m_menu.GetSubMenu(0); 
	pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,pWndPopupOwner,NULL); 
	m_menu.DestroyMenu();	 
} 
 
void CCalculatorDlg::AddToHistr(CString strExp) 
{ 
	if(m_menu2.m_hMenu) 
	{ 
		int b=m_menu2.GetMenuItemCount(); 
		BOOL bRet=m_menu2.AppendMenu(MF_STRING,IMENU_ITEM_ID+b,strExp); 
		if(bRet) m_menuItem.Add(strExp); 
	} 
} 
 
void CCalculatorDlg::OnMenuSelect(UINT nID) 
{ 
	int i=nID-IMENU_ITEM_ID; 
	CString str=m_menuItem.GetAt(i); 
	Paster(str,0); 
} 
 
void CCalculatorDlg::OnBtnHistrexp()  
{ 
	CPoint point; 
	GetCursorPos(&point); 
	m_menu2.TrackPopupMenu(TPM_CENTERALIGN,point.x,point.y,this);	 
} 
 
void CCalculatorDlg::OnMPi()  
{ 
	Paster("PI",0); 
} 
 
void CCalculatorDlg::OnMC()  
{ 
	Paster("LS",0); 
} 
 
void CCalculatorDlg::OnMNa()  
{ 
	Paster("NA",0);	 
} 
 
void CCalculatorDlg::OnMG()  
{ 
	Paster("GR",0);	 
} 
 
void CCalculatorDlg::OnMR()  
{ 
	Paster("MG",0);	 
} 
 
void CCalculatorDlg::OnMK()  
{ 
	Paster("BC",0);	 
} 
 
void CCalculatorDlg::OnMVm()  
{ 
	Paster("VM",0);	 
} 
 
void CCalculatorDlg::OnMKe()  
{ 
	Paster("EF",0);	 
} 
 
void CCalculatorDlg::OnME0()  
{ 
	Paster("DC",0);	 
} 
 
void CCalculatorDlg::OnME()  
{ 
	Paster("E",0);	 
} 
 
void CCalculatorDlg::OnBtnConvert()  
{ 
	UpdateData(1); 
	CWnd * pFrame;					 
	pFrame=AfxGetApp()->GetMainWnd(); 
	CWnd* pWndPopupOwner = this; 
	VERIFY(m_menu.LoadMenu(IDR_MENU1)); 
	CPoint point; 
	GetCursorPos(&point); 
	::SetForegroundWindow(m_hWnd);  
	CMenu* pPopup = m_menu.GetSubMenu(1); 
	pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,pWndPopupOwner,NULL); 
	m_menu.DestroyMenu();		 
} 
 
void CCalculatorDlg::OnMHex()  
{ 
	m_strRes=m_strResTmp; 
	calcu.Dec2Hex(&m_strRes); 
	if(m_strRes.Compare(".")==0) m_strRes=m_strResTmp; 
	UpdateData(0); 
} 
 
void CCalculatorDlg::OnMOct()  
{ 
	m_strRes=m_strResTmp; 
	calcu.Dec2Oct(&m_strRes); 
	if(m_strRes.Compare(".")==0) m_strRes=m_strResTmp; 
	UpdateData(0); 
} 
 
void CCalculatorDlg::OnMBin()  
{ 
	m_strRes=m_strResTmp; 
	calcu.Dec2Bin(&m_strRes); 
	if(m_strRes.Compare(".")==0) m_strRes=m_strResTmp; 
	UpdateData(0); 
} 
 
void CCalculatorDlg::OnMDec()  
{ 
	m_strRes=m_strResTmp; 
	UpdateData(0);                                                                           
}