📄 creditsctrl.cpp
字号:
}
lineDC.SelectObject(pOldBmp);
hover_lineDC.SelectObject(pOldHoverBmp);
//... finished parsing
m_nBitmapHeight = nCurVPos;
// clean up
normalDC.RestoreDC(nSaveDCNormal);
hotDC.RestoreDC(nSaveDCHot);
}
void CCreditsCtrl::DrawBackground(CDC *pDC, RECT rect, BOOL bAnimate, DWORD lParam)
{
pDC->FillSolidRect(&rect,(COLORREF)lParam);
}
void CCreditsCtrl::SetDefaultBkColor(COLORREF crColor)
{
m_dwBackgroundPaintLParam = (DWORD)crColor; // default background color
}
void CCreditsCtrl::Parse_AppendText(CDC *pDC, CDC *pHoverDC, int *pnCurHPos, int *pnCurVPos, int *pnCurHeight, CArray<line_rect,line_rect&>* parcLineRects, general_attribs *pga, font_attribs *pfa, CString sText, CString sCurLink, font_attribs link)
{
CRect rect(0,0,pga->nMaxWidth,pga->nMaxHeight);
CDC dc,hoverDC;
CBitmap hoverBmp,bmp,*pOldHBmp;
dc.CreateCompatibleDC(pDC);
CFont font,hover_font,*pOldHFont;
font.CreateFont(-pfa->nSize,0,0,0,pfa->bBold?FW_BOLD:0,pfa->bItalic,pfa->bUnderline,pfa->bStrikeout,0,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,PROOF_QUALITY,DEFAULT_PITCH|FF_DONTCARE,pfa->szName);
CFont *pOldFont = dc.SelectObject(&font);
dc.SetTextColor(pfa->crColor == CLR_NONE ? m_crInternalTransparentColor : pfa->crColor);
dc.SetBkColor(pfa->crBkColor == CLR_NONE ? m_crInternalTransparentColor : pfa->crBkColor);
dc.SetBkMode(OPAQUE);
dc.DrawText(sText,rect,DT_CALCRECT|DT_SINGLELINE);
if(sCurLink != "")
{
if(link.bBold == -10) link.bBold = pfa->bBold;
if(link.bItalic == -10) link.bItalic = pfa->bItalic;
if(link.bUnderline == -10) link.bUnderline = pfa->bUnderline;
if(link.bStrikeout == -10) link.bStrikeout = pfa->bStrikeout;
if(link.crColor == 0xeeffffff) link.crColor = pfa->crColor;
if(link.crBkColor == 0xeeffffff) link.crBkColor = pfa->crBkColor;
if(link.nSize == 0) link.nSize = pfa->nSize;
if(link.szName[0] == '\0') strcpy(link.szName,pfa->szName);
CRect rect2(0,0,pga->nMaxWidth,pga->nMaxHeight);
hoverDC.CreateCompatibleDC(pDC);
hover_font.CreateFont(-link.nSize,0,0,0,link.bBold?FW_BOLD:0,link.bItalic,link.bUnderline,link.bStrikeout,0,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,PROOF_QUALITY,DEFAULT_PITCH|FF_DONTCARE,link.szName);
pOldHFont = hoverDC.SelectObject(&hover_font);
hoverDC.DrawText(sText,rect2,DT_CALCRECT|DT_SINGLELINE);
if(rect.Width() < rect2.Width())
rect = rect2;
hoverBmp.CreateCompatibleBitmap(pDC,rect.right,rect.bottom);
pOldHBmp = hoverDC.SelectObject(&hoverBmp);
hoverDC.FillSolidRect(rect,m_crInternalTransparentColor);
hoverDC.SetTextColor(link.crColor == CLR_NONE ? m_crInternalTransparentColor : link.crColor);
hoverDC.SetBkColor(link.crBkColor == CLR_NONE ? m_crInternalTransparentColor : link.crBkColor);
hoverDC.SetBkMode(OPAQUE);
hoverDC.DrawText(sText,rect,DT_SINGLELINE);
}
bmp.CreateCompatibleBitmap(pDC,rect.right,rect.bottom);
CBitmap *pOldBmp = dc.SelectObject(&bmp);
dc.FillSolidRect(rect,m_crInternalTransparentColor);
dc.SetBkColor(pfa->crBkColor == CLR_NONE ? m_crInternalTransparentColor : pfa->crBkColor);
dc.DrawText(sText,rect,DT_SINGLELINE);
if(sCurLink != "")
{
Parse_AppendElement(pDC,pHoverDC,pnCurHPos,pnCurVPos,pnCurHeight,parcLineRects,pga,rect.Width(),rect.Height(),&dc,&hoverDC,sCurLink);
hoverDC.SelectObject(pOldHBmp);
hoverDC.SelectObject(pOldHFont);
}
else
Parse_AppendElement(pDC,pHoverDC,pnCurHPos,pnCurVPos,pnCurHeight,parcLineRects,pga,rect.Width(),rect.Height(),&dc,&dc,sCurLink);
// clean up
dc.SelectObject(pOldBmp);
dc.SelectObject(pOldFont);
}
void CCreditsCtrl::Parse_AppendBitmap(CDC *pDC, CDC *pHoverDC, int *pnCurHPos, int *pnCurVPos, int *pnCurHeight, CArray<line_rect,line_rect&>* parcLineRects, general_attribs *pga, CBitmap *pBitmap, COLORREF crBorder, int nBorder, CString sCurLink, font_attribs link)
{
BITMAP bm;
pBitmap->GetBitmap(&bm);
CDC bmpDC;
bmpDC.CreateCompatibleDC(pDC);
CBitmap *pOldBmp1 = bmpDC.SelectObject(pBitmap);
CDC dc;
dc.CreateCompatibleDC(pDC);
CBitmap bmp;
bmp.CreateCompatibleBitmap(pDC,bm.bmWidth+nBorder*2,bm.bmHeight+nBorder*2);
CBitmap *pOldBmp2 = dc.SelectObject(&bmp);
dc.FillSolidRect(0,0,bm.bmWidth+nBorder*2,bm.bmHeight+nBorder*2,crBorder==CLR_NONE?m_crInternalTransparentColor:crBorder);
dc.BitBlt(nBorder,nBorder,bm.bmWidth,bm.bmHeight,&bmpDC,0,0,SRCCOPY);
if(sCurLink == "")
Parse_AppendElement(pDC,pHoverDC,pnCurHPos,pnCurVPos,pnCurHeight,parcLineRects,pga,bm.bmWidth+nBorder*2,bm.bmHeight+nBorder*2,&dc,&dc,sCurLink);
else
{
CDC hoverDC;
hoverDC.CreateCompatibleDC(pDC);
CBitmap bmp;
bmp.CreateCompatibleBitmap(pDC,bm.bmWidth+nBorder*2,bm.bmHeight+nBorder*2);
CBitmap *pOldBmp = hoverDC.SelectObject(&bmp);
hoverDC.FillSolidRect(0,0,bm.bmWidth+nBorder*2,bm.bmHeight+nBorder*2,link.crColor==CLR_NONE?m_crInternalTransparentColor:link.crColor==0xeeffffff?crBorder:link.crColor);
hoverDC.BitBlt(nBorder,nBorder,bm.bmWidth,bm.bmHeight,&bmpDC,0,0,SRCCOPY);
Parse_AppendElement(pDC,pHoverDC,pnCurHPos,pnCurVPos,pnCurHeight,parcLineRects,pga,bm.bmWidth+nBorder*2,bm.bmHeight+nBorder*2,&dc,&hoverDC,sCurLink);
hoverDC.SelectObject(pOldBmp);
}
// clean up
dc.SelectObject(pOldBmp2);
bmpDC.SelectObject(pOldBmp1);
}
void CCreditsCtrl::Parse_AppendElement(CDC *pDC, CDC *pHoverDC, int *pnCurHPos, int *pnCurVPos, int *pnCurHeight, CArray<line_rect,line_rect&>* parcLineRects, general_attribs *pga, int nElementWidth, int nElementHeight, CDC *pElementDC, CDC *pHoverElementDC, CString sCurLink)
{
if(*pnCurHeight < nElementHeight)
*pnCurHeight = nElementHeight;
CRect rect;
rect.left = *pnCurHPos;
rect.top = 0;
rect.right = rect.left+nElementWidth;
rect.bottom = nElementHeight;
line_rect lr;
lr.rcRect = rect;
lr.nVAlign = pga->nVAlign;
lr.sLink = sCurLink;
parcLineRects->Add(lr);
pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),pElementDC,0,0,SRCCOPY);
pHoverDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),pHoverElementDC,0,0,SRCCOPY);
*pnCurHPos += nElementWidth;
}
void CCreditsCtrl::Parse_VAlignLine(CDC *pDestDC, CDC *pHoverDestDC, CDC *pLineDC, CDC *pHoverLineDC, int nCurHPos, int nCurVPos, int nCurHeight, CArray<line_rect,line_rect&>* parcLineRects, general_attribs *pga)
{
{
CArray<line_rect,line_rect&> LinkElements;
CRect rect;
CDC memDC;
memDC.CreateCompatibleDC(pDestDC);
CBitmap memBmp;
memBmp.CreateCompatibleBitmap(pDestDC,nCurHPos,nCurHeight);
CBitmap *pOldBmp = memDC.SelectObject(&memBmp);
memDC.FillSolidRect(0,0,nCurHPos,nCurHeight,m_crInternalTransparentColor);
for(int i = 0; i < parcLineRects->GetSize(); i++)
{
rect.left = (*parcLineRects)[i].rcRect.left;
// calculate elements vertical position
if((*parcLineRects)[i].nVAlign == 0) // top align
rect.top = 0;
else if((*parcLineRects)[i].nVAlign == 1) // middle align
rect.top = nCurHeight/2-(*parcLineRects)[i].rcRect.bottom/2;
else // bottom align
rect.top = nCurHeight - (*parcLineRects)[i].rcRect.bottom;
rect.bottom = rect.top + (*parcLineRects)[i].rcRect.bottom;
// don't touch horz alignment
rect.left = (*parcLineRects)[i].rcRect.left;
rect.right = (*parcLineRects)[i].rcRect.right;
// draw element
memDC.BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),pLineDC,(*parcLineRects)[i].rcRect.left,(*parcLineRects)[i].rcRect.top,SRCCOPY);
// add link to list(if necessary)
if((*parcLineRects)[i].sLink != "")
{
line_rect lr;
lr.sLink = (*parcLineRects)[i].sLink;
lr.rcRect = rect;
LinkElements.Add(lr);
}
}
rect.top = nCurVPos;
rect.bottom = rect.top + nCurHeight;
if(pga->nAlign == 0) // left align
rect.left = 0;
else if(pga->nAlign == 1) // center align
rect.left = pga->nMaxWidth/2 - nCurHPos/2;
else // right align
rect.left = pga->nMaxWidth - nCurHPos;
rect.right = rect.left + nCurHPos;
TransparentBlt(&memDC,pDestDC,m_crInternalTransparentColor,rect,CRect(0,0,rect.Width(),rect.Height()));
memDC.SelectObject(pOldBmp);
// calculate horisontal offset of links in list and add them to global list
for(i = 0; i < LinkElements.GetSize(); i++)
{
CRect rc = LinkElements[i].rcRect;
rc.OffsetRect(rect.left,nCurVPos);
m_HotRects.Add(rc);
m_HotRectActions.Add(LinkElements[i].sLink);
}
}
// do the same, but this time for the hover CD
{
CRect rect;
CDC memDC;
memDC.CreateCompatibleDC(pHoverDestDC);
CBitmap memBmp;
memBmp.CreateCompatibleBitmap(pHoverDestDC,nCurHPos,nCurHeight);
CBitmap *pOldBmp = memDC.SelectObject(&memBmp);
memDC.FillSolidRect(0,0,nCurHPos,nCurHeight,m_crInternalTransparentColor);
for(int i = 0; i < parcLineRects->GetSize(); i++)
{
rect.left = (*parcLineRects)[i].rcRect.left;
// calculate elements vertical position
if((*parcLineRects)[i].nVAlign == 0) // top align
rect.top = 0;
else if((*parcLineRects)[i].nVAlign == 1) // middle align
rect.top = nCurHeight/2-(*parcLineRects)[i].rcRect.bottom/2;
else // bottom align
rect.top = nCurHeight - (*parcLineRects)[i].rcRect.bottom;
rect.bottom = rect.top + (*parcLineRects)[i].rcRect.bottom;
// don't touch horz alignment
rect.left = (*parcLineRects)[i].rcRect.left;
rect.right = (*parcLineRects)[i].rcRect.right;
// draw element
memDC.BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),pHoverLineDC,(*parcLineRects)[i].rcRect.left,(*parcLineRects)[i].rcRect.top,SRCCOPY);
}
rect.top = nCurVPos;
rect.bottom = rect.top + nCurHeight;
if(pga->nAlign == 0) // left align
rect.left = 0;
else if(pga->nAlign == 1) // center align
rect.left = pga->nMaxWidth/2 - nCurHPos/2;
else // right align
rect.left = pga->nMaxWidth - nCurHPos;
rect.right = rect.left + nCurHPos;
TransparentBlt(&memDC,pHoverDestDC,m_crInternalTransparentColor,rect,CRect(0,0,rect.Width(),rect.Height()));
memDC.SelectObject(pOldBmp);
}
}
BOOL CCreditsCtrl::StringToColor(CString string, COLORREF &cr)
{
int i,r,g,b;
if(string=="")
return FALSE;
else if((string=="none")||(string=="transparant"))
cr = CLR_NONE;
else if((i = string.Find(','))==-1)
return FALSE;
else
{
r = atoi(string.Left(i));
string.Delete(0,i+1);
if((i = string.Find(','))==-1)
return FALSE;
else
{
g = atoi(string.Left(i));
string.Delete(0,i+1);
b = atoi(string);
cr = RGB(r,g,b);
}
}
return TRUE;
}
void CCreditsCtrl::OnMouseMove(UINT nFlags, CPoint point)
{
if(m_bIsScrolling)
{
m_nCurBitmapOffset = m_nScrollStart-point.y;
m_nCurBitmapOffset %= m_nBitmapHeight;
if(m_nCurBitmapOffset < 0)
m_nCurBitmapOffset = m_nCurBitmapOffset+m_nBitmapHeight;
Invalidate(FALSE);
UpdateWindow();
return;
}
if(GetCapture()==this)
ReleaseCapture();
else
SetCapture();
if(m_rcClient.PtInRect(point))
{
int n;
CRect rect;
if((n = HitTest(point)) != -1)
{
rect = m_HotRects[n];
SetCursor(m_hLinkCursor);
}
else
{
rect = CRect(0,0,0,0);
SetCursor(m_hDefaultCursor);
}
if(rect != m_rcHotRect)
{
m_rcHotRect = rect;
// Invalidate(FALSE);
// UpdateWindow();
}
}
}
void CCreditsCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
int n = HitTest(point);
if(n != -1)
{
m_rcHotRect = CRect(0,0,0,0); // will be update next timer tick
CString s = m_HotRectActions[n];
if(s[0] == '#')
{
int i = s.Find('#',1);
CString arg = i==-1?"":s.Mid(1,i-1);
s = s.Mid(i==-1?1:i+1);
void(*func)(LPCTSTR) = (void(*)(LPCTSTR))atol(s);
if(func)
(*func)(i==-1?NULL:(LPCTSTR)arg);
} else
ShellExecute(NULL,NULL,s,NULL,NULL,SW_SHOW);
} else if(m_bCanScroll && (m_nBitmapHeight > m_rcClient.bottom))
{
KillTimer(CCREDITCTRL_TIMER1);
m_bIsScrolling = TRUE;
m_nScrollStart = point.y + m_nCurBitmapOffset;
Invalidate();
UpdateWindow();
SetCapture();
}
}
void CCreditsCtrl::OnLButtonUp(UINT nFlags, CPoint point)
{
if(m_bIsScrolling)
{
ReleaseCapture();
m_bIsScrolling = FALSE;
OnTimer(CCREDITCTRL_TIMER1);
}
}
int CCreditsCtrl::HitTest(CPoint pt)
{
if(m_nBitmapHeight <= m_rcClient.bottom)
{
for(int i = 0; i < m_HotRects.GetSize(); i++)
{
if(m_HotRects[i].PtInRect(pt))
return i;
}
return -1;
}
pt.y += m_nCurBitmapOffset;
CPoint pt0 = pt;
if(pt0.y > m_nBitmapHeight-m_nCurBitmapOffset)
pt0.y -= m_nBitmapHeight;
for(int i = 0; i < m_HotRects.GetSize(); i++)
{
if(m_HotRects[i].PtInRect(pt) || m_HotRects[i].PtInRect(pt0))
return i;
}
return -1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -