📄 6502view.cpp
字号:
buf[len+2] = 0;
buf[0] = 0xD;
buf[1] = 0xA;
ret = (*m_pfnOldProc)(hWnd,EM_REPLACESEL,TRUE,(LPARAM)(buf+2)); // wci阠ie tekstu
}
else
;
// ret = (*m_pfnOldProc)(hWnd,msg,wParam,lParam); // CR i rozsuni阠ie wierszy
}
if (m_bAutoSyntax && stat)
pView->disp_warning(line,strmsg);
}
else
{
ret = (*m_pfnOldProc)(hWnd,msg,wParam,lParam);
pView->set_position_info(hWnd);
}
pView->RedrawMarks();
/*
pView->draw_breakpoints();
if (pView->m_nActualPointerLine != -1)
pView->DrawMark(pView->m_nActualPointerLine,MT_POINTER);
if (pView->m_nActualErrMarkLine != -1)
pView->DrawMark(pView->m_nActualErrMarkLine,MT_ERROR);
*/
return ret;
}
case WM_MOUSEMOVE:
case WM_KEYDOWN:
{
LRESULT ret= (*m_pfnOldProc)(hWnd,msg,wParam,lParam);
pView->set_position_info(hWnd);
return ret;
}
case WM_PAINT:
{
LRESULT ret= (*m_pfnOldProc)(hWnd,msg,wParam,lParam);
if (ret == 0)
pView->RedrawMarks();
/* {
pView->draw_breakpoints((HDC)wParam);
if (pView->m_nActualPointerLine != -1)
pView->DrawMark(pView->m_nActualPointerLine,MT_POINTER,FALSE,(HDC)wParam);
if (pView->m_nActualErrMarkLine != -1)
pView->DrawMark(pView->m_nActualErrMarkLine,MT_ERROR,FALSE,(HDC)wParam);
} */
return ret;
}
default:
return (*m_pfnOldProc)(hWnd,msg,wParam,lParam);
}
}
//=============================================================================
/*
void CSrc6502View::drawMark(CDC &dc, int line, MarkType type, bool scroll)
{
int h, y= ScrollToLine(line,h,scroll);
if (y < 0)
return;
y++;
switch (type)
{
case MT_ERASE: // zmazanie znacznika
{
dc.GetWindow()->RedrawWindow(CRect(1, y, 1 + h, y + h));
break;
}
case MT_POINTER: // narysowanie strza砶i wskazuj筩ej inst. do wykonania
draw_pointer(dc,1,y,h);
break;
case MT_BREAKPOINT: // narysowanie aktywnego miejsca przerwania
draw_breakpoint(dc,1,y,h,TRUE);
break;
case MT_DISBRKP: // narysowanie wy彻czonego miejsca przerwania
draw_breakpoint(dc,1,y,h,FALSE);
break;
case MT_ERROR: // narysowanie strza砶i wskazuj筩ej b彻d
draw_mark(dc,4,y,h);
break;
default:
ASSERT(FALSE); // b酬dna warto滄 typu
break;
}
}
*/
int CSrc6502View::ScrollToLine(int line, int &height, bool scroll)
{
ASSERT(line >= 0);
#ifdef USE_CRYSTAL_EDIT
GoToLine(line);
return 0;
#else
CEdit &edit= GetEditCtrl();
if (line > edit.GetLineCount()-1)
{
ASSERT(FALSE); // za du縴 numer wiersza
return -1;
}
int top_line= edit.GetFirstVisibleLine();
if (line < top_line)
{
if (!scroll)
return -2;
edit.LineScroll(line-top_line); // wiersz nie jest widoczny - przesuni阠ie zawarto渃i okna
top_line = edit.GetFirstVisibleLine();
int top_char= edit.LineIndex(top_line);
edit.SendMessage(EM_SETSEL,top_char,top_char); // przesuni阠ie karetki do wiersza 'top_line'
}
CClientDC dc(&edit);
CFont* pOld= dc.SelectObject(&m_Font);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
dc.SelectObject(pOld);
int h= (int)tm.tmHeight + (int)tm.tmExternalLeading;
int y= (line - top_line) * h; // po硂縠nie wiersza w pionie
CRect rect;
edit.GetClientRect(rect);
if (y+h-1 >= rect.bottom)
{
if (!scroll)
return -2;
edit.LineScroll(1 + (y+h-1 - rect.bottom) / h); // ilo滄 wierszy do przesuni阠ia
// edit.SendMessage(EM_SCROLLCARET,0,0);
top_line = edit.GetFirstVisibleLine();
int bottom_char= edit.LineIndex(line);
edit.SendMessage(EM_SETSEL,bottom_char,bottom_char);// przesuni阠ie karetki do wiersza 'line'
}
y = (line - top_line) * h; // po硂縠nie wiersza w pionie
if (y+h-1 >= rect.bottom)
{
ASSERT(FALSE); // b酬dne przesuni阠ia albo obliczenia w tej funkcji
return -1;
}
height = h;
return y;
#endif
}
// edit view info
//
void CSrc6502View::GetDispInfo(int& nTopLine, int& nLineCount, int& nLineHeight)
{
#ifdef USE_CRYSTAL_EDIT
nLineHeight = GetLineHeight();
return;
#else
CEdit& edit= GetEditCtrl();
nLineCount = edit.GetLineCount();
nTopLine = edit.GetFirstVisibleLine();
CClientDC dc(&edit);
CFont* pOld= dc.SelectObject(&m_Font);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
nLineHeight = (int)tm.tmHeight + (int)tm.tmExternalLeading;
dc.SelectObject(pOld);
#endif
}
/*
void CSrc6502View::DrawMark(int line, MarkType type, bool scroll, HDC hDC)
{
if (m_wndLeftBar.m_hWnd == 0)
return;
CClientDC dc(&m_wndLeftBar);
drawMark(dc, line, type, scroll);
#if 0
if (hDC == NULL)
{
CClientDC dc(&GetEditCtrl());
drawMark(dc,line,type,scroll);
}
else
drawMark(*CDC::FromHandle(hDC),line,type,scroll);
#endif
} */
/*
void CSrc6502View::draw_breakpoints(HDC hDC)
{
if (m_mapBreakpoints.IsEmpty())
return;
POSITION pos= m_mapBreakpoints.GetStartPosition();
int line;
BYTE bp;
do
{
m_mapBreakpoints.GetNextAssoc(pos,line,bp);
DrawMark(line,bp & CAsm::BPT_DISABLED ? MT_DISBRKP : MT_BREAKPOINT,FALSE,hDC);
} while (pos);
}
*/
//-----------------------------------------------------------------------------
void CSrc6502View::SetPointer(int line, bool scroll) // narysowanie/zmazanie strza砶i w wierszu{ if (m_nActualPointerLine != -1)
{
int tmp_line= m_nActualPointerLine;
m_nActualPointerLine = -1; EraseMark(tmp_line); // zmazanie starej strza砶i
}
m_nActualPointerLine = line;
if (line != -1)
{
int h;
ScrollToLine(line,h,TRUE);
RedrawMarks(line);
}
}
void CSrc6502View::SetErrMark(int line) // narysowanie/zmazanie strza砶i wsk. b彻d
{
if (m_nActualErrMarkLine != -1)
{
int tmp= m_nActualErrMarkLine;
m_nActualErrMarkLine = -1;
EraseMark(tmp); // zmazanie starej strza砶i
}
m_nActualErrMarkLine = line;
if (line != -1)
{
int h;
ScrollToLine(line,h,TRUE);
RedrawMarks(line);
#ifdef USE_CRYSTAL_EDIT
GoToLine(line);
#else
CEdit &edit= GetEditCtrl();
int char_index= edit.LineIndex(line);
edit.SendMessage(EM_SETSEL,char_index,char_index); // przesuni阠ie karetki do wiersza 'line'
#endif
}
}
void CSrc6502View::OnEnUpdate() // po zmianie tekstu
{
if (m_nActualErrMarkLine != -1)
{
SetErrMark(-1); // zmazujemy wsk. b酬dnego wiersza
CMainFrame *pMain = (CMainFrame*) AfxGetApp()->m_pMainWnd;
pMain->m_wndStatusBar.SetPaneText(0,NULL); // i komunikat b酬du
}
}
void CSrc6502View::SelectEditFont(){
#ifdef USE_CRYSTAL_EDIT
SetFont(m_LogFont);
// m_wndLeftBar.SetWidth(0);
SetTabSize(m_nTabStep);
#else
SetFont(&m_Font);
CEdit &edit= GetEditCtrl();
CClientDC dc(&edit);
dc.SelectObject(&m_Font);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
int h= (int)tm.tmHeight + (int)tm.tmExternalLeading;
// DWORD margins= edit.GetMargins();
// edit.SetMargins(h+1,UINT(HIWORD(margins))); // ustawienie lewego marginesu
m_wndLeftBar.SetWidth(h + 1);
dynamic_cast<CFrameWnd*>(GetParent())->RecalcLayout();
#endif
}
int CSrc6502View::GetCurrLineNo() // aktualny wiersz{
#ifdef USE_CRYSTAL_EDIT
return GetCursorPos().y;
#else
CEdit &edit= GetEditCtrl(); int idx= edit.LineIndex();
ASSERT(idx != -1);
return edit.LineFromChar(idx);
#endif
}
void CSrc6502View::AddBreakpoint(int line, CAsm::Breakpoint bp, bool draw){
m_mapBreakpoints[line] = (BYTE)bp;
if (draw)
RedrawMarks(line);
}
void CSrc6502View::RemoveBreakpoint(int line, bool draw){ m_mapBreakpoints.RemoveKey(line); if (draw)
RedrawMarks(line);
}
void CSrc6502View::RedrawMarks(int line/*= -1*/)
{
#ifdef USE_CRYSTAL_EDIT
if (line >= 0)
InvalidateLines(line, line, true);
#else
if (line == -1) // przerysowa
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -