You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

629 lines
27 KiB
C++

// XTPHexEdit.h interface for the CXTPHexEdit class.
//
// This file is a part of the XTREME CONTROLS MFC class library.
// (c)1998-2012 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
//
/////////////////////////////////////////////////////////////////////////////
//{{AFX_CODEJOCK_PRIVATE
#if !defined(__XTPHEXEDIT_H__)
#define __XTPHEXEDIT_H__
//}}AFX_CODEJOCK_PRIVATE
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000j
#ifdef _XTP_ACTIVEX
#define CXTPHexEditBase CXTPOleControl
#else
#define CXTPHexEditBase CEdit
#endif
//===========================================================================
// Summary:
// CXTPHexEdit is a CEdit derived class. It is used to create an edit control
// which will allow editing in hex display format.
//===========================================================================
class _XTP_EXT_CLASS CXTPHexEdit : public CXTPHexEditBase
{
DECLARE_DYNAMIC(CXTPHexEdit)
protected:
// --------------------------------------------------------------------
// Summary:
// Enumeration used to determine current editing mode.
// Remarks:
// EditMode type defines the constants used by the CXTPHexEdit
// class to determine the current editing mode.
// See Also:
// CXTPHexEdit
//
// <KEYWORDS editNone, editAscii, editHigh, editLow>
// --------------------------------------------------------------------
enum EditMode
{
editNone, // No editing mode specified.
editAscii, // ASCII editing mode.
editHigh, // High editing mode.
editLow // Low editing mode.
};
public:
//-----------------------------------------------------------------------
// Summary:
// Constructs a CXTPHexEdit object
//-----------------------------------------------------------------------
CXTPHexEdit();
//-----------------------------------------------------------------------
// Summary:
// Destroys a CXTPHexEdit object, handles cleanup and deallocation
//-----------------------------------------------------------------------
virtual ~CXTPHexEdit();
public:
//-----------------------------------------------------------------------
// Summary:
// This method creates the HexEdit control.
// Parameters:
// dwStyle - Style for the HexEdit.
// rect - Specifies the size and position of the HexEdit control.
// pParentWnd - Specifies the parent window of the HexEdit control.
// nID - Specifies the HexEdit control ID.
// Returns:
// TRUE if successful, otherwise returns FALSE.
//-----------------------------------------------------------------------
virtual BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);
//-----------------------------------------------------------------------
// Summary:
// This method creates the HexEdit control.
// Parameters:
// dwStyle - Style for the HexEdit.
// rect - Specifies the size and position of the HexEdit control.
// pParentWnd - Specifies the parent window of the HexEdit control.
// nID - Specifies the HexEdit control ID.
// lpszClassName - Class Name ("EDIT" by default)
// lpszWindowName - Window Name
// pContext - Pointer to the CCreateContext
// Returns:
// TRUE if successful, otherwise returns FALSE.
//-----------------------------------------------------------------------
virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);
//-----------------------------------------------------------------------
// Summary:
// Call this member function to return the current background color for
// the hex edit control. The current background color depends on the
// enabled, disabled, or read-only state of the control.
// Returns:
// An RGB value that represents the current background color for the control.
//-----------------------------------------------------------------------
COLORREF GetActualBackColor();
//-----------------------------------------------------------------------
// Summary:
// Call this member function to return the current text color for the hex
// edit control. The current text color depends on the enabled, disabled,
// or read-only state of the control.
// Returns:
// An RGB value that represents the current text color for the control.
//-----------------------------------------------------------------------
COLORREF GetActualTextColor();
//-----------------------------------------------------------------------
// Summary:
// Call this member function to return the current highlight background
// color for the hex edit control. The current highlight background color
// depends on the enabled, disabled, or read-only state of the control.
// Returns:
// An RGB value that represents the current highlight background
// color for the control.
//-----------------------------------------------------------------------
COLORREF GetActualHighlightBackColor();
//-----------------------------------------------------------------------
// Summary:
// Call this member function to return the current highlight text color
// for the hex edit control. The current highlight text color depends
// on the enabled, disabled, or read-only state of the control.
// Returns:
// An RGB value that represents the current highlight text color for the
// control.
//-----------------------------------------------------------------------
COLORREF GetActualHighlightTextColor();
//-----------------------------------------------------------------------
// Summary:
// Call this member function to set the background color for the hex edit
// control.
// Parameters:
// crBack - An RGB value that represents the background color of the hex edit
// control.
//-----------------------------------------------------------------------
void SetBackColor(COLORREF crBack);
//-----------------------------------------------------------------------
// Summary:
// Call this member function to retrieve the current background color
// for the hex edit control.
// Returns:
// An RGB value that represents the current background color for
// the hex edit control.
//-----------------------------------------------------------------------
COLORREF GetBackColor();
//-----------------------------------------------------------------------
// Summary:
// Call this member function to set the text color for the hex
// edit control.
// Parameters:
// crText - An RGB value that represents the text color of the
// hex edit control.
//-----------------------------------------------------------------------
void SetTextColor(COLORREF crText);
//-----------------------------------------------------------------------
// Summary:
// Call this member function to retrieve the current text color for the
// hex edit control.
// Returns:
// An RGB value that represents the current text color for the hex
// edit control.
//-----------------------------------------------------------------------
COLORREF GetTextColor();
//-----------------------------------------------------------------------
// Summary:
// Call this member function to set the disabled background color for
// the hex edit control.
// Parameters:
// crDisabledBack - An RGB value that represents the disabled background
// color of the hex edit control.
//-----------------------------------------------------------------------
void SetDisabledBackColor(COLORREF crDisabledBack);
//-----------------------------------------------------------------------
// Summary:
// Call this member function to retrieve the current disabled background
// color for the hex edit control.
// Returns:
// An RGB value that represents the current disabled background
// color for the hex edit control.
//-----------------------------------------------------------------------
COLORREF GetDisabledBackColor();
//-----------------------------------------------------------------------
// Summary:
// Call this member function to set the disabled text color for the hex
// edit control.
// Parameters:
// crDisabledText - An RGB value that represents the disabled text
// color of the hex edit control.
//-----------------------------------------------------------------------
void SetDisabledTextColor(COLORREF crDisabledText);
//-----------------------------------------------------------------------
// Summary:
// Call this member function to retrieve the current disabled text color
// for the hex edit control.
// Returns:
// An RGB value that represents the current disabled text color
// for the hex edit control.
//-----------------------------------------------------------------------
COLORREF GetDisabledTextColor();
//-----------------------------------------------------------------------
// Summary:
// Call this member function to set the highlighted text color for the
// hex edit control.
// Parameters:
// crHighlightText - An RGB value that represents the highlighted
// text color of the hex edit control.
//-----------------------------------------------------------------------
void SetHighlightTextColor(COLORREF crHighlightText);
//-----------------------------------------------------------------------
// Summary:
// Call this member function to retrieve the current highlighted text
// color for the hex edit control.
// Returns:
// An RGB value that represents the current highlighted text color
// for the hex edit control.
//-----------------------------------------------------------------------
COLORREF GetHighlightTextColor();
//-----------------------------------------------------------------------
// Summary:
// Call this member function to set the highlight background color for
// the hex edit control.
// Parameters:
// crHighlight - An RGB value that represents the highlight background
// color of the hex edit control.
//-----------------------------------------------------------------------
void SetHighlightBackColor(COLORREF crHighlight);
//-----------------------------------------------------------------------
// Summary:
// Call this member function to retrieve the current highlight background
// color for the hex edit control.
// Returns:
// An RGB value that represents the current highlight background
// color for the hex edit control.
//-----------------------------------------------------------------------
COLORREF GetHighlightBackColor();
//-----------------------------------------------------------------------
// Summary:
// Call this member function to set the disabled highlight text color for
// the hex edit control.
// Parameters:
// crDisabledHighlightText - An RGB value that represents the disabled
// highlight text color of the hex edit control.
//-----------------------------------------------------------------------
void SetDisabledHighlightTextColor(COLORREF crDisabledHighlightText);
//-----------------------------------------------------------------------
// Summary:
// Call this member function to retrieve the current disabled highlight
// text color for the hex edit control.
// Returns:
// An RGB value that represents the current disabled highlight text color
// for the hex edit control.
//-----------------------------------------------------------------------
COLORREF GetDisabledHighlightTextColor();
//-----------------------------------------------------------------------
// Summary:
// Call this member function to set the disabled highlight background
// color for the hex edit control.
// Parameters:
// crDisabledHighlight - An RGB value that represents the disabled
// highlight background color of the hex edit
// control.
//-----------------------------------------------------------------------
void SetDisabledHighlightBackColor(COLORREF crDisabledHighlight);
//-----------------------------------------------------------------------
// Summary:
// Call this member function to retrieve the current disabled highlight
// background color for the hex edit control.
// Returns:
// An RGB value that represents the current disabled highlight background color
// for the hex edit control.
//-----------------------------------------------------------------------
COLORREF GetDisabledHighlightBackColor();
//-----------------------------------------------------------------------
// Summary:
// This member function sets the font for the hex edit control to the
// default "Courier New" font.
//-----------------------------------------------------------------------
void RestoreDefaultFont();
//-----------------------------------------------------------------------
// Summary:
// This member function sets the font used by the hex edit control.
// Parameters:
// pFont - Points to a valid CFont object.
// pLogFont - Points to a valid LOGFONT structure.
//-----------------------------------------------------------------------
void SetHexFont(CFont* pFont);
void SetHexFont(LOGFONT* pLogFont); // <combine CXTPHexEdit::SetHexFont@CFont*>
//-----------------------------------------------------------------------
// Summary:
// This member function enables or disables a flashing screen caret.
// Parameters:
// bEnable - true to enable caret, false to disable.
//-----------------------------------------------------------------------
void EnableCaret(bool bEnable);
//-----------------------------------------------------------------------
// Summary:
// This member function enables or disables a vertical and horizontal scroll
// bar display.
// Parameters:
// bVertical - true to display vertical scroll bar.
// bHorizontal - true to display horizontal scroll bar.
//-----------------------------------------------------------------------
void EnableScrollBars(bool bVertical, bool bHorizontal);
//-----------------------------------------------------------------------
// Summary:
// Call this member function to set the base address for the hex edit
// control.
// Parameters:
// dwBase - DWORD value that represents the base address.
// Returns:
// A DWORD value.
//-----------------------------------------------------------------------
DWORD SetAddressBase(DWORD dwBase);
//-----------------------------------------------------------------------
// Summary:
// Call this method to extract the data in the hex edit control.
// Parameters:
// pData - Pointer to the buffer that will be receiving the data.
// nBufferLength - Length of the target data buffer.
// Returns:
// The length of the data.
//-----------------------------------------------------------------------
int GetData(LPBYTE pData, int nBufferLength);
//-----------------------------------------------------------------------
// Summary:
// Call this member function to initialize the hex edit control with data
// specified by 'pData'.
// Parameters:
// pData - Pointer to a buffer that contains the initial data for the control.
// nLength - Length of the data buffer.
// nMaxLength - Optional maximum length that the buffer can grow, or -1 if you
// want to allow the buffer to grow indefinitely.
//-----------------------------------------------------------------------
void SetData(LPBYTE pData, int nLength, int nMaxLength = 0);
//-----------------------------------------------------------------------
// Summary:
// Call this method to allow or disallow the deletion of characters
// within the control. For instance, calling SetAllowDeletes(false) will
// disable the delete, backspace, and other such keys.
// Parameters:
// bVal - The new value for this setting.
// Returns:
// The previous value.
//-----------------------------------------------------------------------
bool SetAllowDeletes(bool bVal = true);
//-----------------------------------------------------------------------
// Summary:
// This member function retrieves the current value of the Allow Deletes
// setting.
// See Also: SetAllowDeletes
// Returns:
// true if the Allow Deletes setting is enabled, or false if it is disabled.
//-----------------------------------------------------------------------
bool GetAllowDeletes() const;
//-----------------------------------------------------------------------
// Summary:
// Call this member function to get the size of the current selection.
// Input:
// nSelStart - Reference to an integer that will receive the position of the first character in the current selection.
// nSelEnd - Reference to an integer that will receive the position of the first nonselected character past the end of the current selection
// Returns:
// A CSize object.
//-----------------------------------------------------------------------
CSize GetSel();
void GetSel(int& nSelStart, int& nSelEnd); // <combine CXTPHexEdit::GetSel>
//-----------------------------------------------------------------------
// Summary:
// Call this member function to set the current selection.
// Parameters:
// nSelStart - Represents the position of the first character in the selection.
// nSelEnd - Represents the position of the last character in the selection.
//-----------------------------------------------------------------------
void SetSel(int nSelStart, int nSelEnd);
//-----------------------------------------------------------------------
// Summary:
// Call this member function to set the number of bytes per row.
// Parameters:
// nBytePerRow - Represents the number of bytes to display.
//-----------------------------------------------------------------------
void SetBPR(int nBytePerRow);
//-----------------------------------------------------------------------
// Summary:
// Call this member function to set the display options for the hex edit
// control.
// Parameters:
// bShowAddress - TRUE to display the address value.
// bShowHex - TRUE to display the hex value.
// bShowAscii - TRUE to display the ASCII value.
// bAddressIsWide - TRUE if the display is 8 byte, FALSE for 4 byte display.
//-----------------------------------------------------------------------
void SetOptions(BOOL bShowAddress, BOOL bShowHex, BOOL bShowAscii, BOOL bAddressIsWide);
//-----------------------------------------------------------------------
// Summary:
// Call this member function to determine if the control in readonly state.
// Returns:
// TRUE if the control is in a ReadOnly state, FALSE otherwise.
//-----------------------------------------------------------------------
BOOL IsReadOnly() const;
//-----------------------------------------------------------------------
// Summary:
// This method is called when user change text.
//-----------------------------------------------------------------------
virtual void OnChange();
protected:
//{{AFX_CODEJOCK_PRIVATE
DECLARE_MESSAGE_MAP()
//{{AFX_VIRTUAL(CXTPHexEdit)
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
//}}AFX_VIRTUAL
//{{AFX_MSG(CXTPHexEdit)
afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnKillFocus(CWnd* pNewWnd);
afx_msg void OnPaint();
afx_msg LRESULT OnPrintClient(WPARAM wParam, LPARAM /*lParam*/);
afx_msg void OnDraw(CDC* pDC);
afx_msg void OnSetFocus(CWnd* pOldWnd);
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
afx_msg UINT OnGetDlgCode();
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnContextMenu(CWnd*, CPoint point);
afx_msg void OnEditClear();
afx_msg void OnEditCopy();
afx_msg void OnEditCut();
afx_msg void OnEditPaste();
afx_msg void OnEditSelectAll();
afx_msg void OnEditUndo();
afx_msg void OnNcPaint();
afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
//}}AFX_MSG
//}}AFX_CODEJOCK_PRIVATE
private:
void ScrollIntoView(int pData);
void RepositionCaret(int pData);
void Move(int x, int y);
BOOL IsSelected();
void UpdateScrollbars();
void CreateEditCaret();
void CreateAddressCaret();
CPoint CalcPos(int x, int y);
void SelInsert(int nSelStart, int nLength);
void SelDelete(int nSelStart, int nSelEnd);
void NormalizeSel();
void RecalcBPR();
void DoVScroll(UINT nSBCode, bool bMoveCaret);
public:
int m_nLength; // Length of data.
int m_nTopIndex; // Offset of first visible byte on the screen.
int m_nCurrentAddress; // Address under the cursor.
int m_nSelStart; // Start address of the selection.
int m_nSelEnd; // End address of the selection.
int m_nBytePerRow; // Bytes per row.
int m_nLinesPerPage; // Lines per page.
int m_nLineHeight; // Height in pixels of a single line displayed in the control.
int m_nNullWidth; // Width in pixels of a single character displayed in the control (uniform width).
int m_nOffHex; // Internally used value - X position where hex part starts.
int m_nOffAscii; // Internally used value - X position where ASCII part starts.
int m_nOffAddress; // Internally used value - X position where address part starts.
bool m_bAllowDeletes; // A boolean value indicating whether or not deletions are allowed.
BOOL m_bDynamicBPR; // Calculate bytes-per-row dynamically.
BOOL m_bShowAddress; // TRUE when showing the address part.
BOOL m_bShowAscii; // TRUE when showing the ASCII part.
BOOL m_bShowHex; // TRUE when showing the hex part.
BOOL m_bAddressIsWide; // 4/8 byte address.
BOOL m_bUpdate; // Value used internally to indicate that the font and size info need to be updated on the next paint cycle.
UINT m_nMaxLength; // Maximum size of data.
DWORD m_dwBaseAddress; // Base address for data.
CPoint m_ptEditPos; // Current caret position.
LPBYTE m_pData; // Pointer to data.
EditMode m_eEditMode; // Current editing mode: address/hex/ASCII.
protected:
BOOL m_bShowCaret; // TRUE to display a flashing caret at the current caret position.
CSize m_szCaret; // Current size of caret.
CFont m_fontHex; // Represents the default font used by the hex edit control.
COLORREF m_crBack; // RGB value that represents the background color of the hex edit control.
COLORREF m_crText; // RGB value that represents the text color of the hex edit control.
COLORREF m_crDisabledBack; // RGB value that represents the disabled background color for the hex edit control.
COLORREF m_crDisabledText; // RGB value that represents the disabled text color of the hex edit control.
COLORREF m_crHighlightText; // RGB value that represents the highlighted text color of the hex edit control.
COLORREF m_crHighlightBack; // RGB value that represents the highlighted background color of the hex edit control.
COLORREF m_crDisabledHighlightText; // RGB value that represents the disabled highlighted text color of the hex edit control.
COLORREF m_crDisabledHighlightBack; // RGB value that represents the disabled highlighted background color of the hex edit control.
};
//////////////////////////////////////////////////////////////////////
AFX_INLINE UINT CXTPHexEdit::OnGetDlgCode() {
return DLGC_WANTALLKEYS;
}
AFX_INLINE void CXTPHexEdit::SetOptions(BOOL bShowAddress, BOOL bShowHex, BOOL bShowAscii, BOOL bAddressIsWide) {
m_bShowHex = bShowHex; m_bShowAscii = bShowAscii; m_bShowAddress = bShowAddress; m_bAddressIsWide = bAddressIsWide; m_bUpdate = TRUE; RepositionCaret(m_nCurrentAddress);
}
AFX_INLINE void CXTPHexEdit::SetBPR(int nBytePerRow) {
m_nBytePerRow = nBytePerRow; m_bUpdate = TRUE; RepositionCaret(m_nCurrentAddress);
}
AFX_INLINE BOOL CXTPHexEdit::IsSelected() {
return m_nSelStart != 0xffffffff;
}
AFX_INLINE CSize CXTPHexEdit::GetSel() {
return CSize(m_nSelStart, m_nSelEnd);
}
AFX_INLINE void CXTPHexEdit::SetBackColor(COLORREF crBack) {
m_crBack = crBack;
}
AFX_INLINE void CXTPHexEdit::SetTextColor(COLORREF crText) {
m_crText = crText;
}
AFX_INLINE void CXTPHexEdit::SetDisabledBackColor(COLORREF crDisabledBack) {
m_crDisabledBack = crDisabledBack;
}
AFX_INLINE void CXTPHexEdit::SetDisabledTextColor(COLORREF crDisabledText) {
m_crDisabledText = crDisabledText;
}
AFX_INLINE void CXTPHexEdit::SetHighlightTextColor(COLORREF crHighlightText) {
m_crHighlightText = crHighlightText;
}
AFX_INLINE void CXTPHexEdit::SetHighlightBackColor(COLORREF crHighlightBack) {
m_crHighlightBack = crHighlightBack;
}
AFX_INLINE void CXTPHexEdit::SetDisabledHighlightTextColor(COLORREF crDisabledHighlightText) {
m_crDisabledHighlightText = crDisabledHighlightText;
}
AFX_INLINE void CXTPHexEdit::SetDisabledHighlightBackColor(COLORREF crDisabledHighlightBack) {
m_crDisabledHighlightBack = crDisabledHighlightBack;
}
AFX_INLINE COLORREF CXTPHexEdit::GetBackColor() {
return m_crBack;
}
AFX_INLINE COLORREF CXTPHexEdit::GetTextColor() {
return m_crText;
}
AFX_INLINE COLORREF CXTPHexEdit::GetDisabledBackColor() {
return m_crDisabledBack;
}
AFX_INLINE COLORREF CXTPHexEdit::GetDisabledTextColor() {
return m_crDisabledText;
}
AFX_INLINE COLORREF CXTPHexEdit::GetHighlightTextColor() {
return m_crHighlightText;
}
AFX_INLINE COLORREF CXTPHexEdit::GetHighlightBackColor() {
return m_crHighlightBack;
}
AFX_INLINE COLORREF CXTPHexEdit::GetDisabledHighlightTextColor() {
return m_crDisabledHighlightText;
}
AFX_INLINE COLORREF CXTPHexEdit::GetDisabledHighlightBackColor() {
return m_crDisabledHighlightBack;
}
AFX_INLINE void CXTPHexEdit::EnableCaret(bool bEnable) {
m_bShowCaret = bEnable;
}
AFX_INLINE bool CXTPHexEdit::SetAllowDeletes(bool bVal) {
const bool bOldVal = m_bAllowDeletes; m_bAllowDeletes = bVal; return bOldVal;
}
AFX_INLINE bool CXTPHexEdit::GetAllowDeletes() const {
return m_bAllowDeletes;
}
#endif // #if !defined(__XTPHEXEDIT_H__)