📄 hexeditbase.cpp
字号:
EmptyClipboard();
UINT nLength = m_nSelectionEnd - m_nSelectionBegin + 1;
HGLOBAL hMemb = ::GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE|GMEM_ZEROINIT, nLength+sizeof(UINT));
HGLOBAL hMema = ::GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE|GMEM_ZEROINIT, cStr.GetLength() + 1);
if( (hMema == NULL) || (hMemb == NULL)) {
return;
}
// copy binary
UINT *pData = (UINT*)::GlobalLock(hMemb);
*pData = nLength;
memcpy(&pData[1], m_pData+m_nSelectionBegin, nLength);
::GlobalUnlock(hMemb);
// copy ascii
char *pPtr = (char*)::GlobalLock(hMema);
memcpy(pPtr, (LPCSTR)cStr, cStr.GetLength());
::GlobalUnlock(hMema);
pSource->CacheGlobalData((CLIPFORMAT)m_nBinDataClipboardFormat, hMemb);
pSource->CacheGlobalData(CF_TEXT, hMema);
pSource->SetClipboard();
} catch(...) {
delete pSource;
delete []pBuf;
throw;
}
delete []pBuf;
}
}
void CHexEditBase::OnEditPaste()
{
ASSERT(m_nCurrentAddress < m_nLength);
if(m_bReadOnly || (m_pData == NULL)) {
return;
}
COleDataObject cSource;
if(!cSource.AttachClipboard()) {
TRACE("CHexEditBase::OnEditPaste: ERROR: AttachClipboard failed\n");
return;
}
if(cSource.IsDataAvailable((CLIPFORMAT)m_nBinDataClipboardFormat)) {
// okay, data available
HGLOBAL hData = cSource.GetGlobalData((CLIPFORMAT)m_nBinDataClipboardFormat);
if(hData == NULL) {
TRACE("CHexEditBase::OnEditPaste: ERROR: GetGlobalData failed\n");
return;
}
UINT nPasteAdr = m_nCurrentAddress;
if(IsSelection()) {
nPasteAdr = m_nSelectionBegin;
}
UINT *pData = (UINT*)::GlobalLock(hData);
UINT nLength = *pData;
if( (nPasteAdr + nLength >= m_nLength) || (nLength >= m_nLength) ) {
nLength = m_nLength - nPasteAdr;
}
memcpy(m_pData+nPasteAdr, &pData[1], nLength);
::GlobalUnlock(hData);
SetSelection(nPasteAdr, nPasteAdr+nLength-1, true, false);
SetEditCaretPos(nPasteAdr+nLength-1, false);
Invalidate();
if(nLength>0) {
NotifyParent(HEN_CHANGE);
}
}
}
void CHexEditBase::OnEditSelectAll()
{
if(m_nLength > 0) {
SetSelection(0, m_nLength-1, false, true);
}
}
void CHexEditBase::SetData(const BYTE *pData, UINT nLen, bool bUpdate)
{
ASSERT(pData != NULL || nLen == 0);
ASSERT(nLen > 0 || pData == NULL);
ASSERT(nLen < 0x7ffff000); // about what we can manage without overflow
m_nSelectingBeg = NOSECTION_VAL;
m_nSelectingEnd = NOSECTION_VAL;
m_nSelectionBegin = NOSECTION_VAL;
m_nSelectionEnd = NOSECTION_VAL;
m_nHighlightedBegin = NOSECTION_VAL;
m_nHighlightedEnd = NOSECTION_VAL;
if(m_bDeleteData) {
delete []m_pData;
}
if(pData != NULL) {
m_bDeleteData = true;
m_nLength = nLen;
m_pData = new BYTE[nLen];
memcpy(m_pData, pData, nLen);
} else {
m_bDeleteData = false;
m_nLength = 0;
m_pData = NULL;
}
m_bRecalc = true;
if(bUpdate && ::IsWindow(m_hWnd)) {
Invalidate();
}
SetEditCaretPos(0, true);
}
void CHexEditBase::SetDirectDataPtr(BYTE *pData, UINT nLen, bool bUpdate)
{
ASSERT(pData != NULL || nLen == 0);
ASSERT(nLen > 0 || pData == NULL);
ASSERT(nLen < 0x7ffff000); // about what we can manage without overflow
m_nSelectingBeg = NOSECTION_VAL;
m_nSelectingEnd = NOSECTION_VAL;
m_nSelectionBegin = NOSECTION_VAL;
m_nSelectionEnd = NOSECTION_VAL;
m_nHighlightedBegin = NOSECTION_VAL;
m_nHighlightedEnd = NOSECTION_VAL;
if(m_bDeleteData) {
delete []m_pData;
}
m_bDeleteData = false;
m_nLength = nLen;
m_pData = pData;
m_bRecalc = true;
if(bUpdate && ::IsWindow(m_hWnd)) {
Invalidate();
}
SetEditCaretPos(0, true);
}
UINT CHexEditBase::GetData(BYTE *pByte, UINT nLength)
{
if(m_pData != NULL) {
memcpy(pByte, m_pData, min(nLength, m_nLength));
return m_nLength;
} else {
return 0;
}
}
bool CHexEditBase::IsSelection() const
{
return (m_nSelectionEnd != NOSECTION_VAL) && (m_nSelectionBegin != NOSECTION_VAL);
}
bool CHexEditBase::IsHighlighted() const
{
return (m_nHighlightedEnd != NOSECTION_VAL) && (m_nHighlightedBegin != NOSECTION_VAL);
}
bool CHexEditBase::GetSelection(UINT& nBegin, UINT& nEnd) const
{
if(IsSelection()) {
nBegin = m_nSelectionBegin;
nEnd = m_nSelectionEnd;
return true;
}
nBegin = NOSECTION_VAL;
nEnd = NOSECTION_VAL;
return false;
}
bool CHexEditBase::GetHighlighted(UINT& nBegin, UINT& nEnd) const
{
if(IsHighlighted()) {
nBegin = m_nHighlightedBegin;
nEnd = m_nHighlightedEnd;
return true;
}
nBegin = NOSECTION_VAL;
nEnd = NOSECTION_VAL;
return false;
}
void CHexEditBase::SetBytesPerRow(UINT nBytesPerRow, bool bAuto, bool bUpdate)
{
if( (m_bAutoBytesPerRow != bAuto) || (m_nBytesPerRow != nBytesPerRow) ) {
m_bAutoBytesPerRow = bAuto;
m_nBytesPerRow = nBytesPerRow;
m_bRecalc = true;
if(::IsWindow(m_hWnd)) {
SetEditCaretPos(m_nCurrentAddress, m_bHighBits);
if(bUpdate) {
Invalidate();
}
}
}
}
void CHexEditBase::SetShowAddress(bool bShow, bool bUpdate)
{
if(m_bShowAddress != bShow) {
m_bShowAddress = bShow;
m_bRecalc = true;
if(::IsWindow(m_hWnd)) {
SetEditCaretPos(m_nCurrentAddress, m_bHighBits);
if(bUpdate) {
Invalidate();
}
}
}
}
void CHexEditBase::SetShowAscii(bool bShow, bool bUpdate)
{
if(m_bShowAscii != bShow) {
m_bShowAscii = bShow;
m_bRecalc = true;
if(::IsWindow(m_hWnd)) {
SetEditCaretPos(m_nCurrentAddress, m_bHighBits);
if(bUpdate) {
Invalidate();
}
}
}
}
void CHexEditBase::SetInputAscii(bool bInputAscii, bool bUpdate)
{
if(m_bInputAscii != bInputAscii) {
m_bInputAscii = bInputAscii;
m_bRecalc = true;
if(::IsWindow(m_hWnd)) {
SetEditCaretPos(m_nCurrentAddress, m_bHighBits);
if(bUpdate) {
Invalidate();
}
}
}
}
void CHexEditBase::SetSelection(UINT nBegin, UINT nEnd, bool bMakeVisible, bool bUpdate)
{
ASSERT(m_nLength > 0);
ASSERT( (nEnd < m_nLength) || (nEnd == NOSECTION_VAL) );
ASSERT( (nBegin < m_nLength) || (nBegin == NOSECTION_VAL) );
if( (m_nSelectionEnd != nEnd) || (m_nSelectionBegin != nBegin) ) {
if( (nEnd >= m_nLength) && (nEnd != NOSECTION_VAL) ) {
nEnd = m_nLength-1;
}
if( (nBegin >= m_nLength) && (nBegin != NOSECTION_VAL) ) {
nBegin = m_nLength-1;
}
m_nSelectionEnd = nEnd;
m_nSelectionBegin = nBegin;
if(bMakeVisible && nEnd != NOSECTION_VAL && nBegin != NOSECTION_VAL) {
MakeVisible(m_nSelectionBegin, m_nSelectionEnd, false);
}
if(bUpdate && ::IsWindow(m_hWnd)) {
Invalidate();
}
}
}
void CHexEditBase::SetHighlighted(UINT nBegin, UINT nEnd, bool bMakeVisible, bool bUpdate)
{
ASSERT(m_nLength > 0);
if( (m_nHighlightedEnd != nEnd) || (m_nHighlightedBegin != nBegin) ) {
if( (nEnd >= m_nLength) && (nEnd != NOSECTION_VAL) ) {
nEnd = m_nLength-1;
}
if( (nBegin >= m_nLength) && (nBegin != NOSECTION_VAL) ) {
nBegin = m_nLength-1;
}
m_nHighlightedBegin = nBegin;
m_nHighlightedEnd = nEnd;
if(bMakeVisible) {
MakeVisible(m_nHighlightedBegin, m_nHighlightedEnd, false);
}
if(bUpdate && ::IsWindow(m_hWnd)) {
Invalidate();
}
}
}
void CHexEditBase::SetReadonly(bool bReadOnly, bool bUpdate)
{
m_bReadOnly = bReadOnly;
if(bUpdate && ::IsWindow(m_hWnd)) {
Invalidate();
}
}
void CHexEditBase::SetAddressSize(BYTE nAdrSize, bool bUpdate)
{
m_nAdrSize = nAdrSize;
m_bRecalc = true;
if(::IsWindow(m_hWnd)) {
SetEditCaretPos(m_nCurrentAddress, m_bHighBits);
if(bUpdate) {
Invalidate();
}
}
}
void CHexEditBase::SetAdrCol(COLORREF tAdrBkgCol, COLORREF tAdrTxtCol, bool bUpdate)
{
m_tAdrBkgCol = tAdrBkgCol;
m_tAdrTxtCol = tAdrTxtCol;
if(bUpdate && ::IsWindow(m_hWnd)) {
Invalidate();
}
}
void CHexEditBase::SetAsciiCol(COLORREF tAsciiBkgCol, COLORREF tAsciiTxtCol, bool bUpdate)
{
m_tAsciiBkgCol = tAsciiBkgCol;
m_tAsciiTxtCol = tAsciiTxtCol;
if(bUpdate && ::IsWindow(m_hWnd)) {
Invalidate();
}
}
void CHexEditBase::SetHighlightCol(COLORREF tHighlightFrameCol, COLORREF tHighlightBkgCol, COLORREF tHighlightTxtCol, bool bUpdate)
{
m_tHighlightFrameCol = tHighlightFrameCol;
m_tHighlightBkgCol = tHighlightBkgCol;
m_tHighlightTxtCol = tHighlightTxtCol;
if(bUpdate && ::IsWindow(m_hWnd)) {
Invalidate();
}
}
void CHexEditBase::SetHexCol(COLORREF tHexBkgCol, COLORREF tHexTxtCol, bool bUpdate)
{
m_tHexBkgCol = tHexBkgCol;
m_tHexTxtCol = tHexTxtCol;
if(bUpdate && ::IsWindow(m_hWnd)) {
Invalidate();
}
}
void CHexEditBase::SetSelectedNoFocusCol(COLORREF tSelectedNoFocusBkgCol, COLORREF tSelectedNoFocusTxtCol, bool bUpdate)
{
m_tSelectedNoFocusBkgCol = tSelectedNoFocusBkgCol;
m_tSelectedNoFocusTxtCol = tSelectedNoFocusTxtCol;
if(bUpdate && ::IsWindow(m_hWnd)) {
Invalidate();
}
}
void CHexEditBase::SetSelectedFocusCol(COLORREF tSelectedFousTxtCol, COLORREF tSelectedFousBkgCol, bool bUpdate)
{
m_tSelectedFousTxtCol = tSelectedFousTxtCol;
m_tSelectedFousBkgCol = tSelectedFousBkgCol;
if(bUpdate && ::IsWindow(m_hWnd)) {
Invalidate();
}
}
void CHexEditBase::SetNotUsedCol(COLORREF tNotUsedBkCol, bool bUpdate)
{
m_tNotUsedBkCol = tNotUsedBkCol;
if(bUpdate && ::IsWindow(m_hWnd)) {
Invalidate();
}
}
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
// class CHexEditBaseView
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNCREATE(CHexEditBaseView, CView)
BEGIN_MESSAGE_MAP(CHexEditBaseView, CView)
//{{AFX_MSG_MAP(CHexEditBaseView)
ON_WM_CREATE()
ON_WM_ERASEBKGND()
ON_WM_SIZE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
CHexEditBaseView::CHexEditBaseView() : CView()
{
}
CHexEditBaseView::~CHexEditBaseView()
{
}
int CHexEditBaseView::OnCreate(LPCREATESTRUCT pCreateStruc)
{
if(CView::OnCreate(pCreateStruc) != 0) {
return -1;
}
if(!m_cHexEdit.Create(NULL, WS_CHILD|WS_VISIBLE|ES_MULTILINE, CRect(0, 0, pCreateStruc->cx, pCreateStruc->cy),
this, IDC_HEXEDITBASEVIEW_HEXCONTROL, NULL)) {
return -1;
}
return 0;
}
void CHexEditBaseView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
if(::IsWindow(m_hWnd)) {
m_cHexEdit.MoveWindow(0, 0, cx, cy, TRUE);
}
}
void CHexEditBaseView::OnDraw(CDC*)
{ // do nothing
}
BOOL CHexEditBaseView::OnEraseBkgnd(CDC*)
{ // don't erase background: avoids flickering
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -