【VC开源代码栏目提醒】:网学会员VC开源代码为您提供FBCoolBar.cpp参考,解决您在FBCoolBar.cpp学习中工作中的难题,参考学习。
/*
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
文件:FBCoolBar.cpp 类CFBCoolBar的执行文件
版权:Firebird Software Workroom
声明:本源程序的版权受《中华人民共和国著作权法》以及其
它相关法律和条约的保护。任何有机会得到本源程序的
个人和机构,未经作者明确授权,不得将本源程序用于
任何商业目的(直接的或间接的)。对于非商业目的的使
用 (包括复制、传播、编译和修改), 原则上没有特别
的限制条款,但请在相关文档中说明其来源,并尊重原
作者的署名权。
编写:秦传安(chings) 1999.12 - 2000.5
联络:Tel:(0792)6323086 E_mail:
FBCoolBar.cpp为[网学网-网友上传,谢谢支持]。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
#include "fclstd.h"
#include "FBCtrlBar.h"
//#######################################################################
//
// class CFBCoolBar
//
//#########################################################################
//////////////////////////////////////////////////////////////////////
CFBCoolBar::CFBCoolBar()
{
m_nBandCount = 0;
m_nLineCount = 0;
m_nBkFlag = 0;
m_hBkBmpDC = NULL;
}
CFBCoolBar::~CFBCoolBar()
{
if(m_hBkBmpDC)
DeleteDC(m_hBkBmpDC);
if(m_nBandCount)
{
for(int i=0;i<m_nBandCount;i++)
{
delete m_pBandInfo[i];
}
}
if(m_nLineCount)
{
for(int i=0;i<m_nLineCount;i++)
{
delete m_pLineInfo[i];
}
}
}
//////////////////////////////////////////////////////////////////////
void CFBCoolBar::GetChildWndRect(LPRECT pRect)
{
if(m_nBandCount == 0)return;
int i,j,k,n;
k = 0;
for(j=0;j<m_nLineCount;j++)
{
n = m_pLineInfo[j]->nBandCount;
for(i=0;i<n;i++)
{
m_pBandInfo[k+i]->rcBand.top = pRect->top;
m_pBandInfo[k+i]->rcBand.bottom = pRect->top + m_pLineInfo[j]->nHeight;
if(i==0)
m_pBandInfo[k+i]->rcBand.left = pRect->left;
else
m_pBandInfo[k+i]->rcBand.left = m_pBandInfo[k+i-1]->rcBand.right;
m_pBandInfo[k+i]->rcBand.right = m_pBandInfo[k+i]->rcBand.left + m_pBandInfo[i]->cxMinSize;
if(j)
{
m_pBandInfo[k+i]->rcBand.top -= 1;
m_pBandInfo[k+i]->rcBand.bottom -= 1;
}
}
int space = pRect->right - m_pBandInfo[k+i-1]->rcBand.right;
if(space>0)
{
for(i=0;i<n;i++)
{
m_pBandInfo[k+i]->rcBand.right += space;
if(m_pBandInfo[k+i]->nIndex)
m_pBandInfo[k+i]->rcBand.left += space;
}
}
m_pBandInfo[k+i-1]->rcBand.right -= 3;
pRect->top += m_pLineInfo[j]->nHeight;
k += n;
}
}
//////////////////////////////////////////////////////////////////////////
void CFBCoolBar::SetBkBitmap(HBITMAP hBmp,int type)
{
if(!hBmp)return;
BITMAP bmp;
GetObject(hBmp, sizeof(bmp), &bmp);
m_nBkBmpWidth = bmp.bmWidth;
m_nBkBmpHeight = bmp.bmHeight;
if(m_hBkBmpDC)
{
HBITMAP hb = (HBITMAP)GetCurrentObject(m_hBkBmpDC,OBJ_BITMAP);
if(hb)
DeleteObject(hb);
DeleteDC(m_hBkBmpDC);
}
m_hBkBmpDC = CreateCompatibleDC(GetDC(m_hWnd));
SelectObject(m_hBkBmpDC,hBmp);
DeleteObject(hBmp);
m_nBkFlag = type;
Invalidate();
}
//////////////////////////////////////////////////////////////////////////
void CFBCoolBar::UseGradientBk(COLORREF clr1,COLORREF clr2,int style)
{
int cx = GetSystemMetrics(SM_CXSCREEN);
HBITMAP hBmp = CreateGradientBMP(GetDC(m_hWnd),clr1,
clr2,cx,m_nHeight,style);
SetBkBitmap(hBmp);
}
///////////////////////////////////////////////////////////////////////////
LRESULT CFBCoolBar::WindowProc(UINT msg,WPARAM wParam,LPARAM lParam)
{
LRESULT lResult = 0;
switch(msg)
{
case WM_ERASEBKGND:
OnEraseBkgnd((HDC)wParam,lResult);
break;
default:
lResult = CFBCtrlBar::WindowProc(msg,wParam,lParam);
break;
}
return lResult;
}
//////////////////////////////////////////////////////////////////////////
void CFBCoolBar::AddBand(LPCB_BANDINFO pbi)
{
if(m_nBandCount>=_BAND_MAXNUM)return;
LPCB_BANDINFO pcbif = new CB_BANDINFO;
pcbif->bShow = pbi->bShow;
pcbif->cxMinSize = pbi->cxMinSize;
pcbif->cyMinSize = pbi->cyMinSize;
pcbif->hWnd = pbi->hWnd;
pcbif->cchText = pbi->cchText;
pcbif->pText = pbi->pText;
pcbif->uID = pbi->uID;
pcbif->nLines = pbi->nLines;
if(pcbif->nLines>_LINE_MAXNUM -1)//不能超过最大行数
pcbif->nLines = _LINE_MAXNUM -1;
if(pcbif->nLines > m_nLineCount)//不能跳行
pcbif->nLines = m_nLineCount;
//如果Band有文本标题, 计算当前设备场境下文本字符串的逻辑尺寸, 以便挪出位置.
if(pbi->cchText)
{
SIZE sz;
HDC hDC = GetDC(m_hWnd);
HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
SelectObject(hDC,hFont);
GetTextExtentPoint(hDC,pbi->pText,pbi->cchText,&sz);
pcbif->cxText = sz.cx;
pcbif->cyText = sz.cy;
}
LPCB_LINEINFO pcli;
if(m_nBandCount == 0 || pcbif->nLines > m_nLineCount-1)
{
pcli = new CB_LINEINFO;//新起一行
pcli->nBandCount = 0;
pcli->nHeight = 0;
pcli->nVisibleCount = 0;
m_pLineInfo[m_nLineCount] = pcli;
m_nLineCount++;
pcbif->nIndex = 0;
if(m_nBandCount == 0)//第一个加上去的Band必须在第0行
pcbif->nLines = 0;
}
else//不是新行
pcbif->nIndex = m_pLineInfo[pcbif->nLines]->nBandCount;
//在同一行中, 以最高的Band为基准
//将行高加4是为了留出边框
if(pcbif->cyMinSize+4 > m_pLineInfo[pcbif->nLines]->nHeight)
m_pLineInfo[pcbif->nLines]->nHeight = pcbif->cyMinSize+4;
int i;
SetParent(pbi->hWnd,m_hWnd);//重置Band的父窗口
m_pBandInfo[m_nBandCount] = pcbif;
m_nBandCount++;
m_pLineInfo[pcbif->nLines]->nBandCount++;
if(pcbif->bShow)
m_pLineInfo[pcbif->nLines]->nVisibleCount++;
//CoolBar的高度等于各行高度相加
m_nHeight = 0;
for(i=0;i<m_nLineCount;i++)
{
if(m_pLineInfo[i]->nVisibleCount)
m_nHeight += m_pLineInfo[i]->nHeight;
}
for(i=m_nBandCount-1;i>0;i--)
{
if(m_pBandInfo[i]->nLines < m_pBandInfo[i-1]->nLines)
{
pcbif = m_pBandInfo[i-1];
m_pBandInfo[i-1] = m_pBandInfo[i];
m_pBandInfo[i] = pcbif;
}
else
break;
}
}
//////////////////////////////////////////////////////////////////////////
void CFBCoolBar::OnSize()
{
if(!m_nBandCount)return;
RECT rc;
GetClientRect(m_hWnd,&rc);
GetChildWndRect(&rc);
for(int i = m_nBandCount; i>0 ;i--)
MoveChildWnd(i-1,TRUE);
}
//////////////////////////////////////////////////////////////////////////
void CFBCoolBar::MoveChildWnd(int nIndex,BOOL bRedraw)
{
RECT rc;
rc.left = m_pBandInfo[nIndex]->rcBand.left + 2;
rc.top = m_pBandInfo[nIndex]->rcBand.top + 2;
rc.right = m_pBandInfo[nIndex]->rcBand.right - 2;
rc.bottom = m_pBandInfo[nIndex]->rcBand.bottom - 2;
if(m_nStyle&CBS_GRIPPER)
rc.left += 12;
if(m_pBandInfo[nIndex]->bShow)
{
if(m_pBandInfo[nIndex]->cyMinSize < (rc.bottom - rc.top))
rc.top +=
上一篇:
FBCommDlg.cpp
下一篇:
法律专业开题报告范文