⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 creditsctrl.cpp

📁 完整的汽配查询软件
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			sCurElement += sData[i]; // append non-formatting-significant character to curent element
		}

	}
	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 + -