📄 kcsidebannerwnd.cpp
字号:
}
else
{
vert[0].x = 0;
vert[0].y = rect.top;
vert[0].Red = GetRValue(m_colBkg)<<8;
vert[0].Green = GetGValue(m_colBkg)<<8;
vert[0].Blue = GetBValue(m_colBkg)<<8;
vert[0].Alpha = 0;
vert[1].x = rect.right;
vert[1].y = rect.bottom;
vert[1].Red = GetRValue(m_colBkg2)<<8;
vert[1].Green = GetGValue(m_colBkg2)<<8;
vert[1].Blue = GetBValue(m_colBkg2)<<8;
vert[1].Alpha = 0;
uGFlag = GRADIENT_FILL_RECT_H;
}
gRect.UpperLeft = 0;
gRect.LowerRight = 1;
// do the fill :)
m_pGradFill( pDC->m_hDC, vert, 2, &gRect, 1, uGFlag );
}
else
{
// added 2003-Oct-29
bool bFlip = false, bHorz = false;
if ( (m_uPosFlag & KCSB_ATTACH_TOP) || (m_uPosFlag & KCSB_ATTACH_BOTTOM) )
{
bFlip = true;
bHorz = true;
}
else if ( m_uPosFlag & KCSB_ATTACH_RIGHT )
{
bFlip = true;
}
GradientFill(pDC, m_colBkg, m_colBkg2, rect, bHorz, bFlip);
}
DrawEdge(pDC, rect);
}
// Gradient fill
else if ( m_uFillFlag & KCSB_FILL_TEXTURE )
{
CBitmap bmp;
bmp.Attach(m_hBkgBitmap);
nBrush.CreatePatternBrush(&bmp);
pOldBrush = pDC->SelectObject(&nBrush);
pDC->SelectStockObject(NULL_PEN);
rect.InflateRect(1,1,1,1);
pDC->Rectangle( &rect );
rect.DeflateRect(1,1,1,1);
DrawEdge(pDC, rect);
bmp.Detach();
}
}
/////////////////////////////////////////////////////////////////////////////
void CKCSideBannerWnd::DrawEdge(CDC* pDC, CRect rect)
{
CPen nPen, *pOldPen = NULL;
nPen.CreatePen( PS_SOLID, 0, m_colEdge );
pOldPen = pDC->SelectObject(&nPen);
if ( m_uPosFlag & KCSB_ATTACH_LEFT )
{
pDC->MoveTo(rect.right-1, rect.top);
pDC->LineTo(rect.right-1, rect.bottom);
}
else if ( m_uPosFlag & KCSB_ATTACH_RIGHT )
{
pDC->MoveTo(rect.left, rect.top);
pDC->LineTo(rect.left, rect.bottom);
}
else if ( m_uPosFlag & KCSB_ATTACH_TOP )
{
pDC->MoveTo(rect.left, rect.bottom-1);
pDC->LineTo(rect.right, rect.bottom-1);
}
else if ( m_uPosFlag & KCSB_ATTACH_BOTTOM )
{
pDC->MoveTo(rect.left, rect.top);
pDC->LineTo(rect.right, rect.top);
}
pDC->SelectObject(pOldPen);
nPen.DeleteObject();
}
/////////////////////////////////////////////////////////////////////////////
void CKCSideBannerWnd::DrawTextFields(CDC* pDC, CRect rect)
{
CPoint pt, pt2;
if ( m_hIcon )
DrawBannerIcon(pDC, rect);
// configure the font
if ( m_uPosFlag & KCSB_ATTACH_LEFT )
{
m_lfTitle.lfEscapement = m_lfTitle.lfOrientation =
m_lfCaption.lfEscapement = m_lfCaption.lfOrientation = 900;
pt.x = rect.left + m_szEdgeOffset.cx;
pt.y = rect.bottom - m_szEdgeOffset.cy;
pt2.x = pt.x - m_lfTitle.lfHeight + m_szCaptionOffset.cx;
pt2.y = pt.y - m_szCaptionOffset.cy;
}
else if ( m_uPosFlag & KCSB_ATTACH_RIGHT )
{
m_lfTitle.lfEscapement = m_lfTitle.lfOrientation =
m_lfCaption.lfEscapement = m_lfCaption.lfOrientation = -900;
pt.x = rect.right - m_szEdgeOffset.cx;
pt.y = rect.top + m_szEdgeOffset.cy;
pt2.x = pt.x + m_lfTitle.lfHeight - m_szCaptionOffset.cx;
pt2.y = pt.y + m_szCaptionOffset.cy;
}
else if ( ( m_uPosFlag & KCSB_ATTACH_TOP ) || ( m_uPosFlag & KCSB_ATTACH_BOTTOM ) )
{
m_lfTitle.lfEscapement = m_lfTitle.lfOrientation =
m_lfCaption.lfEscapement = m_lfCaption.lfOrientation = 0;
pt.x = rect.left + m_szEdgeOffset.cx;
pt.y = rect.top + m_szEdgeOffset.cy;
pt2.x = pt.x + m_szCaptionOffset.cx;
pt2.y = pt.y - m_lfTitle.lfHeight + m_szCaptionOffset.cy;
}
int nOldBkMode = pDC->SetBkMode(TRANSPARENT);
CFont nFont, *pOldFont = NULL;
COLORREF oldTxtCol = pDC->SetTextColor(m_colTxtTitle);
//
// draw the title
nFont.CreateFontIndirect(&m_lfTitle);
pOldFont = pDC->SelectObject(&nFont);
pDC->TextOut(pt.x, pt.y, m_strTitle);
pDC->SelectObject(pOldFont);
nFont.DeleteObject();
//
// draw the caption
pDC->SetTextColor(m_colTxtCaption);
nFont.CreateFontIndirect(&m_lfCaption);
pOldFont = pDC->SelectObject(&nFont);
int arrWidths[256];
pDC->GetCharWidth(0, 255, arrWidths);
int nCount = m_strCaption.GetLength(), i, nHeight = 0;
CPoint ptDraw = pt2;
TCHAR ch;
for ( i = 0; i < nCount; i++ )
{
ch = m_strCaption.GetAt(i);
if ( ch == '\r' )
continue;
if ( ch == '\n' )
{
if ( m_uPosFlag & KCSB_ATTACH_LEFT )
{
ptDraw = pt2;
ptDraw.x -= m_lfCaption.lfHeight * (++nHeight);
}
else if ( (m_uPosFlag & KCSB_ATTACH_TOP) || (m_uPosFlag & KCSB_ATTACH_BOTTOM) )
{
ptDraw = pt2;
ptDraw.y -= m_lfCaption.lfHeight * (++nHeight);
}
else if ( (m_uPosFlag & KCSB_ATTACH_RIGHT) )
{
ptDraw = pt2;
ptDraw.x += m_lfCaption.lfHeight * (++nHeight);
}
continue;
}
pDC->TextOut( ptDraw.x, ptDraw.y, CString((char)ch) );
if ( m_uPosFlag & KCSB_ATTACH_LEFT )
{
ptDraw.y -= arrWidths[ch];
if ( (i < nCount-1) &&
ptDraw.y - arrWidths[m_strCaption.GetAt(i+1)] < rect.top )
{
ptDraw = pt2;
ptDraw.x -= m_lfCaption.lfHeight * (++nHeight);
}
}
else if ( (m_uPosFlag & KCSB_ATTACH_TOP) || (m_uPosFlag & KCSB_ATTACH_BOTTOM) )
{
ptDraw.x += arrWidths[ch];
if ( (i < nCount-1) &&
ptDraw.x + arrWidths[m_strCaption.GetAt(i+1)] > rect.right )
{
ptDraw = pt2;
ptDraw.y -= m_lfCaption.lfHeight * (++nHeight);
}
}
else if ( (m_uPosFlag & KCSB_ATTACH_RIGHT) )
{
ptDraw.y += arrWidths[ch];
if ( (i < nCount-1) &&
ptDraw.y + arrWidths[m_strCaption.GetAt(i+1)] > rect.bottom )
{
ptDraw = pt2;
ptDraw.x += m_lfCaption.lfHeight * (++nHeight);
}
}
}
pDC->SelectObject(pOldFont);
nFont.DeleteObject();
pDC->SetBkMode(nOldBkMode);
pDC->SetTextColor(oldTxtCol);
}
/////////////////////////////////////////////////////////////////////////////
void CKCSideBannerWnd::DrawBannerIcon(CDC* pDC, CRect& rect)
{
if ( !m_hIcon )
return;
CPoint pt;
// Banner on LEFT
if ( m_uPosFlag & KCSB_ATTACH_LEFT )
{
// ICON to LEFT
if ( m_uIconPos & KCSB_ICON_LEFT )
{
rect.bottom -= (m_szEdgeOffset.cy + m_bmpInfo.bmHeight);
pt.y = rect.bottom;
}
// ICON to RIGHT
else if ( m_uIconPos & KCSB_ICON_RIGHT )
{
rect.top += (m_szEdgeOffset.cy);
pt = rect.TopLeft();
}
// VTOP
if ( m_uIconPos & KCSB_ICON_TOP )
pt.x = rect.left;
// VCENTER
else if ( m_uIconPos & KCSB_ICON_VCENTER )
pt.x = rect.CenterPoint().x - (m_bmpInfo.bmWidth/2);
// VBOTTOM
else if ( m_uIconPos & KCSB_ICON_BOTTOM )
pt.x = rect.right - m_bmpInfo.bmWidth - 1;
}
// Banner on RIGHT
else if ( m_uPosFlag & KCSB_ATTACH_RIGHT )
{
// ICON to LEFT
if ( m_uIconPos & KCSB_ICON_LEFT )
{
rect.top += ( m_szEdgeOffset.cy );
pt.y = rect.top;
rect.top += m_bmpInfo.bmHeight;
}
// ICON to RIGHT
else if ( m_uIconPos & KCSB_ICON_RIGHT )
{
rect.bottom -= (m_szEdgeOffset.cy + m_bmpInfo.bmHeight);
pt.x = rect.left;
pt.y = rect.bottom;
}
// VTOP
if ( m_uIconPos & KCSB_ICON_TOP )
pt.x = rect.right - m_bmpInfo.bmWidth;
// VCENTER
else if ( m_uIconPos & KCSB_ICON_VCENTER )
pt.x = rect.CenterPoint().x - (m_bmpInfo.bmWidth/2);
// VBOTTOM
else if ( m_uIconPos & KCSB_ICON_BOTTOM )
pt.x = rect.left + 1;
}
// Banner on TOP OR BOTTOM
else if ( (m_uPosFlag & KCSB_ATTACH_TOP) ||
(m_uPosFlag & KCSB_ATTACH_BOTTOM) )
{
// ICON to LEFT
if ( m_uIconPos & KCSB_ICON_LEFT )
{
rect.left += m_szEdgeOffset.cx;
pt = rect.TopLeft();
rect.left += m_bmpInfo.bmWidth;
}
// ICON to RIGHT
else if ( m_uIconPos & KCSB_ICON_RIGHT )
{
rect.right -= ( m_szEdgeOffset.cx + m_bmpInfo.bmWidth);
pt.x = rect.right;
pt.y = rect.top;
}
// VTOP
if ( m_uIconPos & KCSB_ICON_TOP )
pt.y = rect.top+1;
// VCENTER
else if ( m_uIconPos & KCSB_ICON_VCENTER )
pt.y = rect.CenterPoint().y - (m_bmpInfo.bmHeight/2);
// VBOTTOM
else if ( m_uIconPos & KCSB_ICON_BOTTOM )
pt.y = rect.bottom - m_bmpInfo.bmHeight-1;
}
pDC->DrawIcon( pt.x, pt.y, m_hIcon );
}
/////////////////////////////////////////////////////////////////////////////
void CKCSideBannerWnd::SetCaptionFont(CFont* pFont)
{
if ( !pFont )
return;
pFont->GetLogFont(&m_lfCaption);
Invalidate();
}
/////////////////////////////////////////////////////////////////////////////
void CKCSideBannerWnd::GetCaptionFont(LOGFONT* pFont)
{
if ( !pFont )
return;
memcpy(pFont, &m_lfCaption, sizeof(LOGFONT));
}
/////////////////////////////////////////////////////////////////////////////
void CKCSideBannerWnd::SetTitleFont(CFont* pFont)
{
if ( !pFont )
return;
pFont->GetLogFont(&m_lfTitle);
Invalidate();
}
/////////////////////////////////////////////////////////////////////////////
void CKCSideBannerWnd::GetTitleFont(LOGFONT* pFont)
{
if ( !pFont )
return;
memcpy(pFont, &m_lfTitle, sizeof(LOGFONT));
}
/////////////////////////////////////////////////////////////////////////////
bool CKCSideBannerWnd::SetIcon(HICON hIcon, UINT uiIconPos, bool bSelfDelete)
{
bool bResult = true;
if ( m_bIconDelete && m_hIcon )
::DeleteObject(m_hIcon);
m_bIconDelete = bSelfDelete;
m_uIconPos = uiIconPos;
m_hIcon = hIcon;
if ( m_hIcon )
{
// calculate the size of the icon
ICONINFO ii;
if ( !GetIconInfo( (HICON)m_hIcon, &ii ) )
bResult = false;
if ( !GetObject( ii.hbmColor, sizeof(BITMAP), &m_bmpInfo ) )
bResult = false;
else
{
DeleteObject(ii.hbmColor);
DeleteObject(ii.hbmMask);
}
}
if ( IsWindow(m_hWnd) && m_hIcon )
Invalidate();
return bResult;
}
/////////////////////////////////////////////////////////////////////////////
void CKCSideBannerWnd::SetTexture(HBITMAP hBitmap, bool bSelfDelete)
{
if ( m_hBkgBitmap && m_bBmpDelete )
::DeleteObject(m_hBkgBitmap);
m_bBmpDelete = bSelfDelete;
m_hBkgBitmap = hBitmap;
}
/////////////////////////////////////////////////////////////////////////////
// added 2003-Oct-29
void CKCSideBannerWnd::GradientFill(CDC* pDC, COLORREF col1, COLORREF col2, CRect rect, bool bHor, bool bFlip)
{
if (rect == CRect(0,0,0,0)) // no rectangle?
{
// get the clip area of the device context!
pDC->GetClipBox(rect);
}
if (bFlip)
{
// exhange the 2 colors
COLORREF clr = col1;
col1 = col2;
col2 = clr;
}
if (pDC->GetDeviceCaps(BITSPIXEL) > 8) // gradient only for true color displays
{
// draw the gradient
int nLenght = (bHor ? rect.Width() : rect.Height()) - 1;
for (int i=0; i<=nLenght; i++)
{
CRect rcl = rect;
if (bHor)
{
rcl.left += i;
rcl.right += (i + 1);
}
else
{
rcl.top += i;
rcl.bottom += (i + 1);
}
double dfL = (double)i / (double)nLenght;
pDC->FillSolidRect(rcl, RGB(dfL * GetRValue(col1) + (1.0 - dfL) * GetRValue(col2),
dfL * GetGValue(col1) + (1.0 - dfL) * GetGValue(col2),
dfL * GetBValue(col1) + (1.0 - dfL) * GetBValue(col2) ));
}
}
else
{
// a solid rectangle
pDC->FillSolidRect(rect, col1);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -