📄 hypertextctrl.cpp
字号:
else
flag = false;
}
else
flag = false;
}
len = m_sText.GetLength();
CHyperLink <est = m_Links.front();
int litest = ltest.Begin() - shift;
CKeyWord &wtest = m_KeyWords.front();
int witest = wtest.Begin() - shift;
flag = true;
while( flag == true && !m_Links.empty() ){
CHyperLink &temp = m_Links.front();
CHyperLink backup( temp);
backup.SetBegin( backup.Begin() - shift );
backup.SetEnd( backup.End() - shift );
m_Links.pop_front();
m_Links.push_back( backup );
if( ((CHyperLink)m_Links.front()).Begin() == litest )
flag = false;
}
flag = true;
while( flag == true && !m_KeyWords.empty() ){
CKeyWord &temp = m_KeyWords.front();
CKeyWord backup( temp.Begin()-shift, temp.End()-shift, temp.Color());
m_KeyWords.pop_front();
m_KeyWords.push_back( backup );
if( ((CKeyWord)m_KeyWords.front()).Begin() == witest )
flag = false;
}
}
////////////////////////////////////////////////
//Bottom: May not be the nicest code but it works.
////////////////////////////////////////////////
CPreparedHyperText ht(sText);
m_sText+=sText;
for(std::list<CHyperLink>::iterator it = ht.m_Links.begin(); it != ht.m_Links.end(); it++)
{
CHyperLink hl = *it;
hl.m_iBegin += len;
hl.m_iEnd += len;
m_Links.push_back(hl);
}
}
void CPreparedHyperText::AppendHyperLink(const CString& sText, const CString& sTitle, const CString& sCommand, const CString& sDirectory){
if (!(sText.GetLength() && sCommand.GetLength()))
return;
int len = m_sText.GetLength();
////////////////////////////////////////////////
//Top:The Original code didn't check to see if the buffer was full..
////////////////////////////////////////////////
bool flag = true;
if( len > 60000 ){
m_sText = m_sText.Right(50000);
int shift = len - m_sText.GetLength();
while( flag == true ){
CHyperLink &test = m_Links.front();
if( !m_Links.empty() ){
if( test.Begin() < shift )
m_Links.pop_front();
else
flag = false;
}
else
flag = false;
}
flag = true;
while( flag == true ){
CKeyWord &test = m_KeyWords.front();
if( !m_KeyWords.empty() ){
if( test.Begin() < shift )
m_KeyWords.pop_front();
else
flag = false;
}
else
flag = false;
}
len = m_sText.GetLength();
CHyperLink <est = m_Links.front();
int litest = ltest.Begin() - shift;
CKeyWord &wtest = m_KeyWords.front();
int witest = wtest.Begin() - shift;
flag = true;
while( flag == true && !m_Links.empty() ){
CHyperLink &temp = m_Links.front();
CHyperLink backup( temp);
backup.SetBegin( backup.Begin() - shift );
backup.SetEnd( backup.End() - shift );
m_Links.pop_front();
m_Links.push_back( backup );
if( ((CHyperLink)m_Links.front()).Begin() == litest )
flag = false;
}
flag = true;
while( flag == true && !m_KeyWords.empty() ){
CKeyWord &temp = m_KeyWords.front();
CKeyWord backup( temp.Begin()-shift, temp.End()-shift, temp.Color());
m_KeyWords.pop_front();
m_KeyWords.push_back( backup );
if( ((CKeyWord)m_KeyWords.front()).Begin() == witest )
flag = false;
}
}
////////////////////////////////////////////////
//Bottom: May not be the nicest code but it works.
////////////////////////////////////////////////
m_sText+=sText;
m_Links.push_back(CHyperLink(len, len + sText.GetLength() - 1, sTitle, sCommand, sDirectory));
}
void CPreparedHyperText::AppendHyperLink(const CString& sText, const CString& sTitle, HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
if (!sText.GetLength())
return;
int len = m_sText.GetLength();
////////////////////////////////////////////////
//Top:The Original code didn't check to see if the buffer was full..
////////////////////////////////////////////////
bool flag = true;
if( len > 60000 ){
m_sText = m_sText.Right(50000);
int shift = len - m_sText.GetLength();
while( flag == true ){
CHyperLink &test = m_Links.front();
if( !m_Links.empty() ){
if( test.Begin() < shift )
m_Links.pop_front();
else
flag = false;
}
else
flag = false;
}
flag = true;
while( flag == true ){
CKeyWord &test = m_KeyWords.front();
if( !m_KeyWords.empty() ){
if( test.Begin() < shift )
m_KeyWords.pop_front();
else
flag = false;
}
else
flag = false;
}
len = m_sText.GetLength();
CHyperLink <est = m_Links.front();
int litest = ltest.Begin() - shift;
CKeyWord &wtest = m_KeyWords.front();
int witest = wtest.Begin() - shift;
flag = true;
while( flag == true && !m_Links.empty() ){
CHyperLink &temp = m_Links.front();
CHyperLink backup( temp);
backup.SetBegin( backup.Begin() - shift );
backup.SetEnd( backup.End() - shift );
m_Links.pop_front();
m_Links.push_back( backup );
if( ((CHyperLink)m_Links.front()).Begin() == litest )
flag = false;
}
flag = true;
while( flag == true && !m_KeyWords.empty() ){
CKeyWord &temp = m_KeyWords.front();
CKeyWord backup( temp.Begin()-shift, temp.End()-shift, temp.Color());
m_KeyWords.pop_front();
m_KeyWords.push_back( backup );
if( ((CKeyWord)m_KeyWords.front()).Begin() == witest )
flag = false;
}
}
////////////////////////////////////////////////
//Bottom: May not be the nicest code but it works.
////////////////////////////////////////////////
m_sText+=sText;
m_Links.push_back(CHyperLink(len, len + sText.GetLength() - 1, sTitle, hWnd, uMsg, wParam, lParam));
}
void CPreparedHyperText::AppendKeyWord(const CString& sText, COLORREF iColor){
if (!sText.GetLength())
return;
int len = m_sText.GetLength();
////////////////////////////////////////////////
//Top:The Original code didn't check to see if the buffer was full..
////////////////////////////////////////////////
bool flag = true;
if( len > 60000 ){
m_sText = m_sText.Right(50000);
int shift = len - m_sText.GetLength();
while( flag == true ){
CHyperLink &test = m_Links.front();
if( !m_Links.empty() ){
if( test.Begin() < shift )
m_Links.pop_front();
else
flag = false;
}
else
flag = false;
}
flag = true;
while( flag == true ){
CKeyWord &test = m_KeyWords.front();
if( !m_KeyWords.empty() ){
if( test.Begin() < shift )
m_KeyWords.pop_front();
else
flag = false;
}
else
flag = false;
}
len = m_sText.GetLength();
CHyperLink <est = m_Links.front();
int litest = ltest.Begin() - shift;
CKeyWord &wtest = m_KeyWords.front();
int witest = wtest.Begin() - shift;
flag = true;
while( flag == true && !m_Links.empty() ){
CHyperLink &temp = m_Links.front();
CHyperLink backup( temp);
backup.SetBegin( backup.Begin() - shift );
backup.SetEnd( backup.End() - shift );
m_Links.pop_front();
m_Links.push_back( backup );
if( ((CHyperLink)m_Links.front()).Begin() == litest )
flag = false;
}
flag = true;
while( flag == true && !m_KeyWords.empty() ){
CKeyWord &temp = m_KeyWords.front();
CKeyWord backup( temp.Begin()-shift, temp.End()-shift, temp.Color());
m_KeyWords.pop_front();
m_KeyWords.push_back( backup );
if( ((CKeyWord)m_KeyWords.front()).Begin() == witest )
flag = false;
}
}
////////////////////////////////////////////////
//Bottom: May not be the nicest code but it works.
////////////////////////////////////////////////
m_sText+=sText;
m_KeyWords.push_back(CKeyWord(len, len + sText.GetLength() - 1, iColor));
}
//CLinePartInfo
CLinePartInfo::CLinePartInfo(int iBegin, uint16 iEnd, CHyperLink* pHyperLink, CKeyWord* pKeyWord){
m_xBegin = iBegin;
m_xEnd = iEnd;
m_pHyperLink = pHyperLink;
m_pKeyWord = pKeyWord;
}
CLinePartInfo::CLinePartInfo(const CLinePartInfo& Src){
m_xBegin = Src.m_xBegin;
m_xEnd = Src.m_xEnd;
m_pHyperLink = Src.m_pHyperLink;
m_pKeyWord = Src.m_pKeyWord;
}
//CLineInfo
CLineInfo::CLineInfo(int iBegin, uint16 iEnd){
m_iBegin = iBegin;
m_iEnd = iEnd;
}
CLineInfo::CLineInfo(const CLineInfo& Src){
m_iBegin = Src.m_iBegin;
m_iEnd = Src.m_iEnd;
assign(Src.begin(), Src.end());
}
//CVisPart
CVisPart::CVisPart(const CLinePartInfo& LinePartInfo, const CRect& rcBounds, int iRealBegin, uint16 iRealLen,CVisPart* pPrev,CVisPart* pNext) : CLinePartInfo(LinePartInfo)
{
m_rcBounds = rcBounds;
m_iRealBegin = iRealBegin;
m_iRealLen = iRealLen;
m_pPrev = pPrev;
m_pNext = pNext;
}
CVisPart::CVisPart(const CVisPart& Src) : CLinePartInfo(Src){
m_rcBounds = Src.m_rcBounds;
m_iRealBegin = Src.m_iRealBegin;
m_iRealLen = Src.m_iRealLen;
m_pPrev = Src.m_pPrev;
m_pNext = Src.m_pNext;
}
// --------------------------------------------------------------
// CHyperTextCtrl
IMPLEMENT_DYNAMIC(CHyperTextCtrl, CWnd)
BEGIN_MESSAGE_MAP(CHyperTextCtrl, CWnd)
ON_MESSAGE(WM_PAINT,OnPaint)
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEWHEEL()
ON_MESSAGE(WM_SIZE, OnSize)
ON_MESSAGE(WM_SHOWWINDOW, OnShowWindow)
ON_MESSAGE(WM_CREATE, OnCreate)
ON_MESSAGE(WM_DESTROY, OnDestroy)
ON_MESSAGE(WM_SETTEXT, OnSetText)
ON_MESSAGE(WM_GETTEXT, OnGetText)
ON_MESSAGE(WM_SETFONT, OnSetFont)
ON_MESSAGE(WM_GETFONT, OnGetFont)
ON_WM_ERASEBKGND()
ON_MESSAGE(WM_HSCROLL, OnHScroll)
ON_MESSAGE(WM_VSCROLL, OnVScroll)
ON_MESSAGE(WM_CAPTURECHANGED, OnCaptureChanged)
ON_WM_SYSCOLORCHANGE()
//REFLECT_NOTIFICATIONS()
END_MESSAGE_MAP()
CHyperTextCtrl::CHyperTextCtrl()
{
m_Text = &standart_Text;
vscrollon = false;
m_Font = NULL;
m_BkColor = RGB(0,0,0);
m_TextColor = RGB(0,0,0);
m_LinkColor = RGB(0,0,0);
m_HoverColor = RGB(0,0,0);
m_LinkCursor = NULL;
m_DefaultCursor = NULL;
vscrollon = false;
m_iMaxWidth = 0;
m_iLineHeight = 0;
m_iLinesHeight = 0;
m_bDontUpdateSizeInfo = false;
m_iVertPos = 0;
m_iHorzPos = 0;
m_pActivePart = NULL;
m_iWheelDelta = 0;
}
//message handlers
LRESULT CHyperTextCtrl::OnDestroy(WPARAM wParam, LPARAM lParam){
if (m_LinkCursor){
SetCursor(m_DefaultCursor);
VERIFY( DestroyCursor(m_LinkCursor) );
}
m_LinkCursor = NULL;
return 0;
}
LRESULT CHyperTextCtrl::OnCreate(WPARAM wParam, LPARAM lParam){
//LPCREATESTRUCT lpCreateStruct = (LPCREATESTRUCT)lParam;
m_iMaxWidth = 0;
m_iLinesHeight = 0;
m_bDontUpdateSizeInfo = false;
m_iHorzPos = 0;
m_iVertPos = 0;
m_Font = &theApp.emuledlg->m_fontHyperText;
SetColors();
LoadHandCursor();
m_DefaultCursor = LoadCursor(NULL,IDC_ARROW);
m_pActivePart = NULL;
m_iWheelDelta = 0;
// create a tool tip
m_tip.Create(this);
if(m_tip)
m_tip.Activate(TRUE);
UpdateFonts();
return 0;
}
LRESULT CHyperTextCtrl::OnPaint(WPARAM wParam, LPARAM lParam){
CPaintDC dc(this); // device context for painting
CFont* hOldFont = dc.SelectObject(m_Font);
dc.SetBkColor(m_BkColor);
int ypos = 0;
LPCTSTR s = m_Text->GetText();
CRect rc;
CRect rcClient;
GetClientRect(rcClient);
rc.left = dc.m_ps.rcPaint.left;
rc.right = 2;
rc.top = dc.m_ps.rcPaint.top;
rc.bottom = dc.m_ps.rcPaint.bottom;
CBrush brBk;
brBk.CreateSolidBrush(m_BkColor);
dc.FillRect(rc, &brBk);
for(std::vector<CVisLine>::iterator it = m_VisLines.begin(); it != m_VisLines.end(); it++){
int iLastX = dc.m_ps.rcPaint.left;
for(CVisLine::iterator jt = it->begin(); jt != it->end(); jt++){
if (jt->m_pKeyWord)
dc.SetTextColor(jt->m_pKeyWord->Color());
else if(jt->m_pHyperLink == NULL)
dc.SetTextColor(m_TextColor);
else{
if(m_pActivePart != NULL && m_pActivePart->m_pHyperLink == jt->m_pHyperLink){
dc.SetTextColor(m_HoverColor);
dc.SelectObject(m_HoverFont);
}
else{
dc.SetTextColor(m_LinkColor);
dc.SelectObject(m_LinksFont);
}
}
TextOut(dc, jt->m_rcBounds.left, jt->m_rcBounds.top, s + jt->m_iRealBegin, jt->m_iRealLen);
if(jt->m_pHyperLink != NULL)
dc.SelectObject(m_Font);
iLastX = jt->m_rcBounds.right;
}
rc.left = iLastX;
rc.right = dc.m_ps.rcPaint.right;
rc.top = ypos;
rc.bottom = ypos + m_iLineHeight;
dc.FillRect(rc, &brBk);
ypos+=m_iLineHeight;
}
rc.left = dc.m_ps.rcPaint.left;
rc.right = dc.m_ps.rcPaint.right;
rc.top = ypos;
rc.bottom = dc.m_ps.rcPaint.bottom;
dc.FillRect(rc, &brBk);
dc.SelectObject(hOldFont);
return 0;
}
LRESULT CHyperTextCtrl::OnSize(WPARAM wParam, LPARAM lParam){
WORD cx, cy;
cx = LOWORD(lParam);
cy = HIWORD(lParam);
UpdateSize(IsWindowVisible() == TRUE);
return 0;
}
LRESULT CHyperTextCtrl::OnShowWindow(WPARAM wParam, LPARAM lParam){
if(TRUE == (BOOL)wParam)
UpdateSize(false);
return 0;
}
LRESULT CHyperTextCtrl::OnSetText(WPARAM wParam, LPARAM lParam){
m_Text->SetText((LPTSTR)lParam);
UpdateSize(IsWindowVisible() == TRUE);
return TRUE;
}
LRESULT CHyperTextCtrl::OnGetText(WPARAM wParam, LPARAM lParam){
int bufsize = wParam;
LPTSTR buf = (LPTSTR)lParam;
if(lParam == NULL || bufsize == 0 || m_Text->GetText().IsEmpty())
return 0;
int cpy = m_Text->GetText().GetLength() > (bufsize-1) ? (bufsize-1) : m_Text->GetText().GetLength();
_tcsncpy(buf, m_Text->GetText(), cpy);
return cpy;
}
LRESULT CHyperTextCtrl::OnSetFont(WPARAM wParam, LPARAM lParam){
m_Font = CFont::FromHandle((HFONT)wParam);
UpdateFonts();
UpdateSize(LOWORD(lParam) != 0);
return 0;
}
LRESULT CHyperTextCtrl::OnGetFont(WPARAM wParam, LPARAM lParam){
return (LRESULT)m_Font->m_hObject;
}
LRESULT CHyperTextCtrl::OnHScroll(WPARAM wParam, LPARAM lParam){
SCROLLINFO si;
si.cbSize = sizeof(si);
si.fMask = SIF_ALL;
GetScrollInfo(SB_HORZ, &si);
switch(LOWORD(wParam))
{
case SB_LEFT:
si.nPos=si.nMin;
break;
case SB_RIGHT:
si.nPos=si.nMax;
break;
case SB_LINELEFT:
if(si.nPos > si.nMin)
si.nPos-=1;
break;
case SB_LINERIGHT:
if(si.nPos < si.nMax)
si.nPos+=1;
break;
case SB_PAGELEFT:
if(si.nPos > si.nMin)
si.nPos-=si.nPage;
if(si.nPos < si.nMin)
si.nPos = si.nMin;
break;
case SB_PAGERIGHT:
if(si.nPos < si.nMax)
si.nPos+=si.nPage;
if(si.nPos > si.nMax)
si.nPos = si.nMax;
break;
case SB_THUMBTRACK:
si.nPos=si.nTrackPos;
break;
}
if(si.nMax != si.nMin)
m_iHorzPos = si.nPos * 100 / (si.nMax - si.nMin);
SetScrollInfo(SB_HORZ, &si);
UpdateVisLines();
InvalidateRect(NULL,FALSE);
return TRUE;
}
LRESULT CHyperTextCtrl::OnVScroll(WPARAM wParam, LPARAM lParam){
SCROLLINFO si;
si.cbSize = sizeof(si);
si.fMask = SIF_ALL;
GetScrollInfo(SB_VERT, &si);
switch(LOWORD(wParam))
{
case SB_TOP:
si.nPos=si.nMin;
break;
case SB_BOTTOM:
si.nPos=si.nMax;
break;
case SB_LINEUP:
if(si.nPos > si.nMin)
si.nPos-=1;
break;
case SB_LINEDOWN:
if(si.nPos < si.nMax)
si.nPos+=1;
break;
case SB_PAGEUP:
if(si.nPos > si.nMin)
si.nPos-=si.nPage;
if(si.nPos < si.nMin)
si.nPos = si.nMin;
break;
case SB_PAGEDOWN:
if(si.nPos < si.nMax)
si.nPos+=si.nPage;
if(si.nPos > si.nMax)
si.nPos = si.nMax;
break;
case SB_THUMBTRACK:
si.nPos=si.nTrackPos;
break;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -