// StockQuoteDlg.cpp // // (c)1998-2025 Codejock Software, All Rights Reserved. // // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN // CONSENT OF CODEJOCK SOFTWARE. // // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A // SINGLE COMPUTER. // // CONTACT INFORMATION: // support@codejock.com // http://www.codejock.com // ///////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "stocksample.h" #include "StockQuoteAPI.h" #include "StockQuoteDlg.h" #include "StockSampleDoc.h" #include "StockSampleView.h" #ifdef _DEBUG # define new DEBUG_NEW # undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CStockQuoteDlg dialog CStockQuoteDlg::CStockQuoteDlg(CWnd* pParent /*=NULL*/) : CDialog(CStockQuoteDlg::IDD, pParent) { //{{AFX_DATA_INIT(CStockQuoteDlg) m_strCompany = _T(""); m_strOpen = _T(""); m_strVolume = _T(""); m_strDate = _T(""); m_strClose = _T(""); m_strHigh = _T(""); m_strLow = _T(""); m_nStyle = 0; m_strSector = _T(""); m_strIndustry = _T(""); m_bThickLines = FALSE; m_nTicker = 3; m_nDays = 2; //}}AFX_DATA_INIT m_crRed = RGB(204, 51, 0); m_crGreen = RGB(0, 153, 0); m_pChart = NULL; } void CStockQuoteDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CStockQuoteDlg) DDX_Control(pDX, IDC_STR_LOW, m_txtLow); DDX_Control(pDX, IDC_STR_HIGH, m_txtHigh); DDX_Control(pDX, IDC_STR_CLOSE, m_txtClose); DDX_Control(pDX, IDC_STR_DATE, m_txtDate); DDX_Control(pDX, IDC_STR_VOLUME, m_txtVolume); DDX_Control(pDX, IDC_STR_OPEN, m_txtOpen); DDX_Control(pDX, IDC_STR_COMPANY, m_txtCompany); DDX_Text(pDX, IDC_STR_COMPANY, m_strCompany); DDX_Text(pDX, IDC_STR_OPEN, m_strOpen); DDX_Text(pDX, IDC_STR_VOLUME, m_strVolume); DDX_Text(pDX, IDC_STR_DATE, m_strDate); DDX_Text(pDX, IDC_STR_CLOSE, m_strClose); DDX_Text(pDX, IDC_STR_HIGH, m_strHigh); DDX_Text(pDX, IDC_STR_LOW, m_strLow); DDX_CBIndex(pDX, IDC_COMBO_STYLE, m_nStyle); DDX_Text(pDX, IDC_STR_SECTOR, m_strSector); DDX_Text(pDX, IDC_STR_INDUSTRY, m_strIndustry); DDX_Check(pDX, IDC_CHK_THICKLINES, m_bThickLines); DDX_CBIndex(pDX, IDC_COMBO_TICKER, m_nTicker); DDX_CBIndex(pDX, IDC_COMBO_DAYS, m_nDays); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CStockQuoteDlg, CDialog) //{{AFX_MSG_MAP(CStockQuoteDlg) ON_WM_CTLCOLOR() ON_CBN_SELENDOK(IDC_COMBO_STYLE, OnSelendOkComboStyle) ON_BN_CLICKED(IDC_CHK_THICKLINES, OnChkThickLines) ON_CBN_SELENDOK(IDC_COMBO_TICKER, OnSelEndOkComboTicker) ON_CBN_SELENDOK(IDC_COMBO_DAYS, OnSelEndOkComboDays) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CStockQuoteDlg message handlers BOOL CStockQuoteDlg::OnInitDialog() { CDialog::OnInitDialog(); // Set the default font for all dialog controls. SendMessageToDescendants(WM_SETFONT, (WPARAM)(HFONT)XTPFontManager()->GetFont()); // TODO: Add extra initialization here CXTPNonClientMetrics ncm; ncm.lfMenuFont.lfWeight = FW_BOLD; m_fontBold.CreateFontIndirect(&ncm.lfMenuFont); m_txtDate.SetFont(&m_fontBold); m_txtOpen.SetFont(&m_fontBold); m_txtClose.SetFont(&m_fontBold); m_txtHigh.SetFont(&m_fontBold); m_txtLow.SetFont(&m_fontBold); m_txtVolume.SetFont(&m_fontBold); m_txtCompany.SetFont(&m_fontBold); UpdateQuote(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } CString CStockQuoteDlg::GetSymbol() { LPCTSTR lpszTicker[] = { _T("AAPL"), _T("MSFT"), _T("PYPL"), _T("PZZA"), _T("TSLA") }; return lpszTicker[m_nTicker]; } int CStockQuoteDlg::GetResID() { int nTicker[] = { IDR_CSV_AAPL, IDR_CSV_MSFT, IDR_CSV_PYPL, IDR_CSV_PZZA, IDR_CSV_TSLA }; return nTicker[m_nTicker]; } int CStockQuoteDlg::GetDays() { int nDays[] = { 30, 60, 90, 180 }; return nDays[m_nDays]; } void CStockQuoteDlg::UpdateQuote() { UpdateData(); m_quote.GetTickerInfo(GetSymbol(), m_strCompany, m_strSector, m_strIndustry); m_strCompany.MakeUpper(); CString strQuote = m_quote.GetQuote(GetResID()); m_strDate = m_quote.GetDate(strQuote); m_strOpen.Format(_T("%.2f"), m_quote.GetOpen(strQuote)); m_strHigh.Format(_T("%.2f"), m_quote.GetHigh(strQuote)); m_strLow.Format(_T("%.2f"), m_quote.GetLow(strQuote)); m_strClose.Format(_T("%.2f"), m_quote.GetClose(strQuote)); m_strVolume = FormatNumber(m_quote.GetVolume(strQuote)); UpdateData(FALSE); if (m_pChart) { m_pChart->UpdateHistory(m_nStyle == 0, GetDays()); } } CString CStockQuoteDlg::FormatNumber(LONGLONG ulNumber) { TCHAR szLeadingZero[30]; if (::GetLocaleInfo(XTPResourceManager()->GetActiveLCID(), LOCALE_ILZERO, szLeadingZero, 2) == 0) { TRACE0("Error obtaining leading zero locale information.\n"); return _T(""); } TCHAR szDecimalSep[5]; if (::GetLocaleInfo(XTPResourceManager()->GetActiveLCID(), LOCALE_SDECIMAL, szDecimalSep, 4) == 0) { TRACE0("Error obtaining decimal separator locale information.\n"); return _T(""); } TCHAR szThousandSep[5]; if (::GetLocaleInfo(XTPResourceManager()->GetActiveLCID(), LOCALE_STHOUSAND, szThousandSep, 4) == 0) { TRACE0("Error obtaining thousand separator locale information.\n"); return _T(""); } TCHAR szNegativeOrder[30]; if (::GetLocaleInfo(XTPResourceManager()->GetActiveLCID(), LOCALE_INEGNUMBER, szNegativeOrder, 2) == 0) { TRACE0("Error obtaining negative order locale information.\n"); return _T(""); } NUMBERFMT fmt; fmt.NumDigits = 0; fmt.LeadingZero = _ttoi(szLeadingZero); fmt.Grouping = 3; fmt.lpDecimalSep = szDecimalSep; fmt.lpThousandSep = szThousandSep; fmt.NegativeOrder = _ttoi(szNegativeOrder); CString strValue; strValue.Format(_T("%I64d"), ulNumber); TCHAR szBuffer[256]; if (::GetNumberFormat(XTPResourceManager()->GetActiveLCID(), 0, strValue, &fmt, szBuffer, 256) == 0) { TRACE0("Error obtaining number format for default locale.\n"); return _T(""); } return szBuffer; } HBRUSH CStockQuoteDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); if (pWnd->GetDlgCtrlID() == IDC_STR_CLOSE) { TCHAR* szStopString; if (_tcstod(m_strClose, &szStopString) > _tcstod(m_strOpen, &szStopString)) { pDC->SetTextColor(m_crGreen); } else { pDC->SetTextColor(m_crRed); } } return hbr; } BOOL CStockQuoteDlg::Create(UINT nIDTemplate, CStockSampleView* pParentWnd) { m_pChart = pParentWnd; return CDialog::Create(nIDTemplate, pParentWnd); } void CStockQuoteDlg::OnSelendOkComboStyle() { UpdateData(); if (m_pChart) { m_pChart->UpdateHistory(m_nStyle == 0, GetDays()); } } void CStockQuoteDlg::OnChkThickLines() { UpdateData(); if (m_pChart) { m_pChart->SetThickStyle(m_bThickLines); } } void CStockQuoteDlg::OnSelEndOkComboTicker() { UpdateQuote(); } void CStockQuoteDlg::OnSelEndOkComboDays() { UpdateQuote(); }