// CPPHexCtrl_demoDlg.cpp : implementation file
//
#include "stdafx.h"
#include "CPPHexCtrl_demo.h"
#include "CPPHexCtrl_demoDlg.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()
/////////////////////////////////////////////////////////////////////////////
// CCPPHexCtrlDlg dialog
CCPPHexCtrlDlg::CCPPHexCtrlDlg(CWnd* pParent /*=NULL*/)
: CDialog(CCPPHexCtrlDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CCPPHexCtrlDlg)
m_enable = TRUE;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CCPPHexCtrlDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCPPHexCtrlDlg)
DDX_Control(pDX, IDC_EDIT2, m_offset_addr);
DDX_Control(pDX, IDC_BUTTON12, m_error_data_bk);
DDX_Control(pDX, IDC_BUTTON11, m_edit_bk);
DDX_Control(pDX, IDC_BUTTON10, m_caret_bk);
DDX_Control(pDX, IDC_BUTTON9, m_data_bk);
DDX_Control(pDX, IDC_BUTTON8, m_track_mouse);
DDX_Control(pDX, IDC_BUTTON7, m_address_data_fg);
DDX_Control(pDX, IDC_BUTTON6, m_separators);
DDX_Control(pDX, IDC_BUTTON5, m_edit_data_fg);
DDX_Control(pDX, IDC_BUTTON4, m_header_text);
DDX_Control(pDX, IDC_BUTTON3, m_error_data_fg);
DDX_Control(pDX, IDC_BUTTON2, m_change_data_fg);
DDX_Control(pDX, IDC_BUTTON1, m_const_data_fg);
DDX_Check(pDX, IDC_ENABLE, m_enable);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCPPHexCtrlDlg, CDialog)
//{{AFX_MSG_MAP(CCPPHexCtrlDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_CHECK1, OnChangeStyles)
ON_BN_CLICKED(IDC_ENABLE, OnEnableControl)
ON_COMMAND(ID_BEGIN_SELECTION, OnBeginSelection)
ON_COMMAND(ID_END_SELECTION, OnEndSelection)
ON_BN_CLICKED(IDC_BUTTON13, OnSetNewTooltipFormat)
ON_BN_CLICKED(IDC_CHECK2, OnChangeStyles)
ON_BN_CLICKED(IDC_CHECK3, OnChangeStyles)
ON_BN_CLICKED(IDC_CHECK4, OnChangeStyles)
ON_BN_CLICKED(IDC_CHECK5, OnChangeStyles)
ON_BN_CLICKED(IDC_CHECK6, OnChangeStyles)
ON_BN_CLICKED(IDC_CHECK7, OnChangeStyles)
ON_BN_CLICKED(IDC_CHECK8, OnChangeStyles)
ON_BN_CLICKED(IDC_CHECK9, OnChangeStyles)
ON_BN_CLICKED(IDC_CHECK10, OnChangeStyles)
ON_BN_CLICKED(IDC_CHECK11, OnChangeStyles)
ON_BN_CLICKED(IDC_CHECK12, OnChangeStyles)
ON_BN_CLICKED(IDC_CHECK13, OnChangeStyles)
ON_BN_CLICKED(IDC_CHECK14, OnChangeStyles)
ON_BN_CLICKED(IDC_CHECK15, OnChangeStyles)
ON_BN_CLICKED(IDC_CHECK16, OnChangeStyles)
ON_BN_CLICKED(IDC_CHECK17, OnChangeStyles)
ON_BN_CLICKED(IDC_CHECK18, OnChangeStyles)
ON_BN_CLICKED(IDC_CHECK19, OnChangeStyles)
ON_BN_CLICKED(IDC_BUTTON14, OnSetSpecialCharView)
//}}AFX_MSG_MAP
ON_MESSAGE(CPN_SELENDOK, OnChangeColor)
ON_NOTIFY (UDM_PPDUMPCTRL_CHANGE_DATA, 2, NotifyEditData)
ON_NOTIFY (UDM_PPNUMEDIT_ENTER, IDC_EDIT2, NotifyNewOffset)
ON_NOTIFY (UDM_PPDUMPCTRL_MENU_CALLBACK, 2, NotifyMenuCallback)
ON_NOTIFY (UDM_PPDUMPCTRL_SELECTION, 2, NotifyNewSelection)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCPPHexCtrlDlg message handlers
BOOL CCPPHexCtrlDlg::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
m_offset_addr.SetValue(0, CPPNumEdit::PPNUM_VALUE_HEX, CPPNumEdit::PPNUM_VALUE_CUSTOM, 0, 0xFFFF);
CRect rect;
CEdit * pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);
pEdit->GetWindowRect(&rect);
ScreenToClient(&rect);
pEdit->ShowWindow(FALSE);
m_hex_ctrl = new CPPDumpCtrl;
m_hex_ctrl->Create(rect, this, 2);
// TODO: Add extra initialization here
BOOL bCheck [] = {
TRUE, TRUE, TRUE, TRUE, FALSE, TRUE,
TRUE, TRUE, FALSE, FALSE, FALSE, TRUE,
TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE};
CButton * pButton;
for (int i = 0; i < 19; i++)
{
pButton = (CButton*)GetDlgItem(IDC_CHECK1 + i);
pButton->SetCheck(bCheck [i]);
}
OnChangeStyles();
for (i = 0; i < 256; i++)
{
nNewData [i] = i;
nOldData [i] = 0;
}
m_hex_ctrl->SetPointerData(256, nNewData, nOldData, FALSE);
SetOffsetAddress();
//customize colors
m_error_data_bk.SetColour(m_hex_ctrl->GetColor(CPPDumpCtrl::PPDUMP_COLOR_EDIT_ERR_BK));
m_edit_bk.SetColour(m_hex_ctrl->GetColor(CPPDumpCtrl::PPDUMP_COLOR_EDIT_BK));
m_caret_bk.SetColour(m_hex_ctrl->GetColor(CPPDumpCtrl::PPDUMP_COLOR_CARET_BK));
m_data_bk.SetColour(m_hex_ctrl->GetColor(CPPDumpCtrl::PPDUMP_COLOR_DATA_BK));
m_track_mouse.SetColour(m_hex_ctrl->GetColor(CPPDumpCtrl::PPDUMP_COLOR_MOUSE_TRACK));
m_address_data_fg.SetColour(m_hex_ctrl->GetColor(CPPDumpCtrl::PPDUMP_COLOR_ADDRESS_FG));
m_separators.SetColour(m_hex_ctrl->GetColor(CPPDumpCtrl::PPDUMP_COLOR_SEPARATORS));
m_edit_data_fg.SetColour(m_hex_ctrl->GetColor(CPPDumpCtrl::PPDUMP_COLOR_EDIT_FG));
m_header_text.SetColour(m_hex_ctrl->GetColor(CPPDumpCtrl::PPDUMP_COLOR_TEXT_HEADER));
m_error_data_fg.SetColour(m_hex_ctrl->GetColor(CPPDumpCtrl::PPDUMP_COLOR_EDIT_ERR_FG));
m_change_data_fg.SetColour(m_hex_ctrl->GetColor(CPPDumpCtrl::PPDUMP_COLOR_DATA_CHANGE_FG));
m_const_data_fg.SetColour(m_hex_ctrl->GetColor(CPPDumpCtrl::PPDUMP_COLOR_DATA_FG));
m_hex_ctrl->SetMenu(IDR_MENU1, FALSE);
m_hex_ctrl->SetNotify();
//Customize the tooltip
CString str = _T("Address: %R Hex%n------ Data -------%nHex:%t%H%nDec:%t%D%nOct:%t%O%nBin:%t%B%nAscii:%t%A");
SetDlgItemText(IDC_EDIT3, str);
m_hex_ctrl->SetTooltipText(str);
CToolTipCtrl * m_Tooltip = m_hex_ctrl->GetTooltip();
font.CreateFont(-11, 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FIXED_PITCH, "Courier");
m_Tooltip->SetFont(&font);
//Customize the drawing char for special characters
TCHAR chSymbol = (TCHAR)'.';
str = chSymbol;
SetDlgItemText(IDC_EDIT4, str);
m_hex_ctrl->SetSpecialCharView(chSymbol);
return TRUE; // return TRUE unless you set the focus to a control
}
void CCPPHexCtrlDlg::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 CCPPHexCtrlDlg::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 CCPPHexCtrlDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CCPPHexCtrlDlg::OnChangeStyles()
{
// TODO: Add your control notification handler code here
UINT nStyle[] = {
PPDUMP_BAR_ADDRESS,
PPDUMP_BAR_HEX,
PPDUMP_BAR_DEC,
PPDUMP_BAR_BIN,
PPDUMP_BAR_OCT,
PPDUMP_BAR_ASCII,
PPDUMP_FIELD_ADDRESS,
PPDUMP_FIELD_HEX,
PPDUMP_FIELD_DEC,
PPDUMP_FIELD_BIN,
PPDUMP_FIELD_OCT,
PPDUMP_FIELD_ASCII,
PPDUMP_NAMED_FIELDS,
PPDUMP_WORD_DATA,
PPDUMP_SEPARATOR_LINES,
PPDUMP_READ_ONLY,
PPDUMP_SELECTING_DATA,
PPDUMP_DATA_LOW_HIGH,
PPDUMP_TRACK_MOUSE_MOVE
};
DWORD nNewStyle = 0;
CButton * pButton;
for (int i = 0; i < 19; i++)
{
pButton = (CButton*)GetDlgItem(IDC_CHECK1 + i);
if (pButton->GetCheck())
nNewStyle |= nStyle [i];
}
m_hex_ctrl->SetStyles(nNewStyle);
}
void CCPPHexCtrlDlg::OnEnableControl()
{
// TODO: Add your control notification handler code here
UpdateData();
m_hex_ctrl->EnableWindow(m_enable);
}
void CCPPHexCtrlDlg::SetNewValueData(UINT nAddr, UINT nValue)
{
CButton * pButton = (CButton*)GetDlgItem(IDC_CHECK14);
if (pButton->GetCheck())
{
//Word Data
nAddr *= 2;
nOldData [nAddr] = nNewData [nAddr];
nOldData [nAddr + 1] = nNewData [nAddr + 1];
nNewData [nAddr] = HIBYTE (nValue);
nNewData [nAddr + 1] = LOBYTE (nValue);
}
else
{
//Byte Data
nOldData [nAddr] = nNewData [nAddr];
nNewData [nAddr] = LOBYTE (nValue);
}
m_hex_ctrl->RedrawWindow();
}
void CCPPHexCtrlDlg::NotifyEditData(NMHDR * pNMHDR, LRESULT * result)
{
//User was changed data
*result = 0;
NM_PPDUMP_CTRL * pNotify = (NM_PPDUMP_CTRL*)pNMHDR;
SetNewValueData(pNotify->iAddress, pNotify->iValue);
}
LONG CCPPHexCtrlDlg::OnChangeColor(UINT lParam, LONG wParam)
{
UINT nID = (UINT)wParam;
switch (nID)
{
case IDC_BUTTON12:
m_hex_ctrl->SetColor(CPPDumpCtrl::PPDUMP_COLOR_EDIT_ERR_BK, m_error_data_bk.GetColour());
break;
case IDC_BUTTON11:
m_hex_ctrl->SetColor(CPPDumpCtrl::PPDUMP_COLOR_EDIT_BK, m_edit_bk.GetColour());
break;
case IDC_BUTTON10:
m_hex_ctrl->SetColor(CPPDumpCtrl::PPDUMP_COLOR_CARET_BK, m_caret_bk.GetColour());
break;
case IDC_BUTTON9:
m_hex_ctrl->SetColor(CPPDumpCtrl::PPDUMP_COLOR_DATA_BK, m_data_bk.GetColour());
break;
case IDC_BUTTON8:
m_hex_ctrl->SetColor(CPPDumpCtrl::PPDUMP_COLOR_MOUSE_TRACK, m_track_mouse.GetColour());
break;
case IDC_BUTTON7:
m_hex_ctrl->SetColor(CPPDumpCtrl::PPDUMP_COLOR_ADDRESS_FG, m_address_data_fg.GetColour());
break;
case IDC_BUTTON6:
m_hex_ctrl->SetColor(CPPDumpCtrl::PPDUMP_COLOR_SEPARATORS, m_separators.GetColour());
break;
case IDC_BUTTON5:
m_hex_ctrl->SetColor(CPPDumpCtrl::PPDUMP_COLOR_EDIT_FG, m_edit_data_fg.GetColour());
break;
case IDC_BUTTON4:
m_hex_ctrl->SetColor(CPPDumpCtrl::PPDUMP_COLOR_TEXT_HEADER, m_header_text.GetColour());
break;
case IDC_BUTTON3:
m_hex_ctrl->SetColor(CPPDumpCtrl::PPDUMP_COLOR_EDIT_ERR_FG, m_error_data_fg.GetColour());
break;
case IDC_BUTTON2:
m_hex_ctrl->SetColor(CPPDumpCtrl::PPDUMP_COLOR_DATA_CHANGE_FG, m_change_data_fg.GetColour());
break;
case IDC_BUTTON1:
m_hex_ctrl->SetColor(CPPDumpCtrl::PPDUMP_COLOR_DATA_FG, m_const_data_fg.GetColour());
break;
}
return 0L;
}
void CCPPHexCtrlDlg::SetOffsetAddress()
{
if (m_offset_addr.IsValidate() && m_offset_addr.IsChanged())
m_hex_ctrl->SetOffsetViewAddress(m_offset_addr.GetValue());
}
void CCPPHexCtrlDlg::NotifyNewOffset(NMHDR * pNMHDR, LRESULT * result)
{
*result = 0;
SetOffsetAddress();
}
void CCPPHexCtrlDlg::NotifyMenuCallback(NMHDR * pNMHDR, LRESULT * result)
{
*result = 0;
NM_PPDUMP_MENU * pNotify = (NM_PPDUMP_MENU*)pNMHDR;
int nBegin, nEnd;
m_hex_ctrl->GetSelectRange(&nBegin, &nEnd);
nMenuAddr = pNotify->iAddress;
::CheckMenuItem(pNotify->hMenu, ID_BEGIN_SELECTION, ((pNotify->iAddress == nBegin) ? MF_CHECKED : MF_UNCHECKED) | MF_BYCOMMAND);
::CheckMenuItem(pNotify->hMenu, ID_END_SELECTION, ((pNotify->iAddress == nEnd) ? MF_CHECKED : MF_UNCHECKED) | MF_BYCOMMAND);
}
void CCPPHexCtrlDlg::OnBeginSelection()
{
int nBegin, nEnd;
m_hex_ctrl->GetSelectRange(&nBegin, &nEnd);
if (nMenuAddr <= nEnd)
m_hex_ctrl->SetSelectRange(nMenuAddr, nEnd);
else
m_hex_ctrl->SetSelectRange(nMenuAddr);
}
void CCPPHexCtrlDlg::OnEndSelection()
{
int nBegin, nEnd;
m_hex_ctrl->GetSelectRange(&nBegin, &nEnd);
if (nMenuAddr >= nBegin)
m_hex_ctrl->SetSelectRange(nBegin, nMenuAddr);
else
m_hex_ctrl->SetSelectRange(nMenuAddr);
}
void CCPPHexCtrlDlg::NotifyNewSelection(NMHDR * pNMHDR, LRESULT * result)
{
*result = 0;
NM_PPDUMP_SEL * pNotify = (NM_PPDUMP_SEL*)pNMHDR;
CString str;
str.Format(_T("%04X - %04X"), pNotify->iFirstAddr, pNotify->iLastAddr);
SetDlgItemText(IDC_STATIC1, str);
}
void CCPPHexCtrlDlg::OnSetNewTooltipFormat()
{
// TODO: Add your control notification handler code here
CString str;
GetDlgItemText(IDC_EDIT3, str);
m_hex_ctrl->SetTooltipText(str);
}
void CCPPHexCtrlDlg::OnSetSpecialCharView()
{
// TODO: Add your control notification handler code here
CString str;
GetDlgItemText(IDC_EDIT4, str);
if (str.IsEmpty())
m_hex_ctrl->SetSpecialCharView(NULL);
else
m_hex_ctrl->SetSpecialCharView(str.GetAt(0));
}
BOOL CCPPHexCtrlDlg::DestroyWindow()
{
// TODO: Add your specialized code here and/or call the base class
if (m_hex_ctrl)
delete m_hex_ctrl;
return CDialog::DestroyWindow();
}