?? visualfx.cpp
字號(hào):
pDC->MoveTo(x+textSize.cx+TAB_SPACE+1, y+TABSEL_HEIGHT-1);
pDC->LineTo(client.right, y+TABSEL_HEIGHT-1);
// and a white double line
pDC->SelectObject(&m_PenWhite2);
if (x!=0) {
pDC->MoveTo(0, y+TABSEL_HEIGHT+1);
pDC->LineTo(x, y+TABSEL_HEIGHT+1);
}
pDC->MoveTo(x+textSize.cx+TAB_SPACE, y+TABSEL_HEIGHT+1);
pDC->LineTo(client.right, y+TABSEL_HEIGHT+1);
// gray inside
pDC->FillSolidRect(x+3, y+3,textSize.cx+TAB_SPACE-6, TABSEL_HEIGHT,
::GetSysColor(COLOR_BTNFACE));
if (pItem->m_hIcon) {
::DrawIconEx(pDC->m_hDC,x+4,y+TAB_ICON_Y,pItem->m_hIcon,16,16,0,NULL,DI_NORMAL);
}
CRect rect(CPoint(x+nDeltaWidth+TAB_SPACE/2, y+(TAB_HEIGHT-textSize.cy)/2+1),
CSize(textSize.cx-nDeltaWidth, textSize.cy));
pItem->SetFont(&m_Font);
pItem->SetRect(rect);
return textSize.cx+TAB_SPACE;
}
// Draw a selected tab at the bottom
int TTabWnd::drawSelTabBottom(CDC *pDC, int x, CRect& client, TTabItem *pItem)
{
ASSERT(pItem);
ASSERT(pDC);
CString str = pItem->GetText();
CSize textSize = pDC->GetTextExtent(str);
textSize.cx += 4;
if (textSize.cx > TAB_MAXLEN)
textSize.cx = TAB_MAXLEN;
int y = client.Height() - TABWND_HEIGHT + TAB_DEPL;
int nDeltaWidth = 0;
if (pItem->m_hIcon) {
nDeltaWidth = TAB_ICON + TAB_ICON_X;
textSize.cx += nDeltaWidth;
}
// black border, no bottom line
pDC->SelectObject(&m_PenBlack);
pDC->MoveTo(x,y);
pDC->LineTo(x,y+TABSEL_HEIGHT);
pDC->LineTo(x+textSize.cx+TAB_SPACE-1, y+TABSEL_HEIGHT);
pDC->LineTo(x+textSize.cx+TAB_SPACE-1, y);
// left border in white, double line
pDC->SelectObject(&m_PenWhite2);
pDC->MoveTo(x+2,y);
pDC->LineTo(x+2,y+TABSEL_HEIGHT-1);
// right and bottom border, dark gray, double line
pDC->SelectObject(&m_PenDGray2);
pDC->LineTo(x+textSize.cx+TAB_SPACE-4, y+TABSEL_HEIGHT-1);
pDC->MoveTo(x+textSize.cx+TAB_SPACE-2, y);
pDC->LineTo(x+textSize.cx+TAB_SPACE-2, y+TABSEL_HEIGHT-1);
// a black line to far left and right
pDC->SelectObject(&m_PenBlack);
pDC->MoveTo(0, y);
pDC->LineTo(x, y);
pDC->MoveTo(x+textSize.cx+TAB_SPACE, y);
pDC->LineTo(client.right, y);
// and a gray line to far left and right
pDC->SelectObject(&m_PenDGray);
if (x != 0) {
pDC->MoveTo(0, y-1);
pDC->LineTo(x, y-1);
}
pDC->MoveTo(x+textSize.cx+TAB_SPACE-2, y-1);
pDC->LineTo(client.right, y-1);
// gray inside
pDC->FillSolidRect(x+3,y,textSize.cx+TAB_SPACE-6, TABSEL_HEIGHT-2,
::GetSysColor(COLOR_BTNFACE));
if (pItem->m_hIcon) {
::DrawIconEx(pDC->m_hDC,x+4,y+TAB_ICON_Y,pItem->m_hIcon,16,16,0,NULL,DI_NORMAL);
}
CRect rect(CPoint(x+nDeltaWidth+TAB_SPACE/2, y+(TAB_HEIGHT-textSize.cy)/2+1),
CSize(textSize.cx-nDeltaWidth, textSize.cy));
pItem->SetFont(&m_Font);
pItem->SetRect(rect);
return textSize.cx+TAB_SPACE;
}
// Draws an unselected tab and returs its height
int TTabWnd::drawTabTop(CDC *pDC, int x, CRect& client, TTabItem *pItem)
{
ASSERT(pItem);
ASSERT(pDC);
CString str = pItem->GetText();
CSize textSize = pDC->GetTextExtent(str);
textSize.cx += 4;
if (textSize.cx > TAB_MAXLEN)
textSize.cx = TAB_MAXLEN;
int y = TABWND_HEIGHT-TAB_HEIGHT-TAB_DEPL;
int nDeltaWidth = 0;
if (pItem->m_hIcon) {
nDeltaWidth = TAB_ICON + TAB_ICON_X;
textSize.cx += nDeltaWidth;
}
// black border
pDC->FrameRect(&CRect(CPoint(x,y), CSize(textSize.cx+TAB_SPACE, TAB_HEIGHT)),
&m_BrushBlack);
pDC->SelectObject(&m_PenWhite);
pDC->MoveTo(x+1, y+1);
pDC->LineTo(x+1, y+TAB_HEIGHT-1);
pDC->MoveTo(x+1, y+1);
pDC->LineTo(x+textSize.cx+TAB_SPACE-2, y+1);
pDC->SelectObject(&m_PenDGray);
pDC->MoveTo(x+textSize.cx+TAB_SPACE-2, y+1);
pDC->LineTo(x+textSize.cx+TAB_SPACE-2, y+TAB_HEIGHT-1);
pDC->FillRect(&CRect(CPoint(x+2,y+2), CSize(textSize.cx+TAB_SPACE-4, TAB_HEIGHT-3)),
&m_BrushLGray);
// clean up
int dy = TABSEL_HEIGHT-TAB_HEIGHT;
pDC->FillSolidRect(x, y-dy, textSize.cx+TAB_SPACE, dy, GetSysColor(COLOR_BTNFACE));
if (pItem->m_hIcon) {
::DrawIconEx(pDC->m_hDC,x+4,y+TAB_ICON_Y,pItem->m_hIcon,16,16,0,NULL,DI_NORMAL);
}
CRect rect(CPoint(x+nDeltaWidth+TAB_SPACE/2, y+(TAB_HEIGHT-textSize.cy)/2+1),
CSize(textSize.cx-nDeltaWidth, textSize.cy));
pItem->SetFont(&m_Font);
pItem->SetRect(rect);
return textSize.cx+TAB_SPACE;
}
// Draw an unselected tab at the bottom
int TTabWnd::drawTabBottom(CDC *pDC, int x, CRect& client, TTabItem *pItem)
{
ASSERT(pItem);
ASSERT(pDC);
CString str = pItem->GetText();
CSize textSize = pDC->GetTextExtent(str);
textSize.cx += 4;
if (textSize.cx > TAB_MAXLEN)
textSize.cx = TAB_MAXLEN;
int y = client.Height() - TABWND_HEIGHT + TAB_DEPL;
int nDeltaWidth = 0;
if (pItem->m_hIcon) {
nDeltaWidth = TAB_ICON + TAB_ICON_X;
textSize.cx += nDeltaWidth;
}
// black border
pDC->FrameRect(&CRect(CPoint(x,y), CSize(textSize.cx+TAB_SPACE, TAB_HEIGHT+1)),
&m_BrushBlack);
// Gray border bottom and right side
pDC->SelectObject(&m_PenDGray);
pDC->MoveTo(x+1, y+TAB_HEIGHT-1);
pDC->LineTo(x+textSize.cx+TAB_SPACE-2, y+TAB_HEIGHT-1);
pDC->MoveTo(x+textSize.cx+TAB_SPACE-2, y);
pDC->LineTo(x+textSize.cx+TAB_SPACE-2, y+TAB_HEIGHT-1);
pDC->FillRect(&CRect(CPoint(x+1,y+1), CSize(textSize.cx+TAB_SPACE-4, TAB_HEIGHT-3)),
&m_BrushLGray);
if (pItem->m_hIcon) {
::DrawIconEx(pDC->m_hDC,x+4,y+TAB_ICON_Y,pItem->m_hIcon,16,16,0,NULL,DI_NORMAL);
}
CRect rect(CPoint(x+nDeltaWidth+TAB_SPACE/2, y+(TAB_HEIGHT-textSize.cy)/2+1),
CSize(textSize.cx-nDeltaWidth, textSize.cy));
pItem->SetFont(&m_Font);
pItem->SetRect(rect);
return textSize.cx+TAB_SPACE;
}
// Draw edge arround client area
void TTabWnd::drawClient(CDC *pDc, CRect& rect)
{
ASSERT(pDc);
CWnd *pParent = GetParent();
ASSERT(pParent);
switch (m_nTabPos) {
case TP_TOP:
if (pParent->IsKindOf(RUNTIME_CLASS(CFrameWnd))) {
pDc->DrawEdge(&rect, EDGE_ETCHED, BF_TOP);
}
pDc->Draw3dRect(0,TABWND_HEIGHT, rect.right, rect.bottom-TABWND_HEIGHT,
::GetSysColor(COLOR_BTNSHADOW), ::GetSysColor(COLOR_BTNHIGHLIGHT));
pDc->Draw3dRect(1,TABWND_HEIGHT+1, rect.right-2, rect.bottom-TABWND_HEIGHT-2,
0, ::GetSysColor(COLOR_3DLIGHT));
break;
case TP_BOTTOM:
if (pParent->IsKindOf(RUNTIME_CLASS(CFrameWnd))) {
pDc->DrawEdge(&rect, EDGE_ETCHED, BF_BOTTOM);
}
pDc->Draw3dRect(0,0, rect.right, rect.bottom-TABWND_HEIGHT+1,
::GetSysColor(COLOR_BTNSHADOW), ::GetSysColor(COLOR_BTNHIGHLIGHT));
pDc->Draw3dRect(1,1, rect.right-2, rect.bottom-TABWND_HEIGHT-1,
0, ::GetSysColor(COLOR_3DLIGHT));
break;
}
}
void TTabWnd::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect client;
GetClientRect(&client);
drawClient(&dc, client);
int x = 0, nIndex = 0;
TTabItemList::iterator iterator;
for (iterator = m_TabList.begin(); iterator != m_TabList.end(); iterator++) {
TTabItem *pItem = *iterator;
ASSERT(pItem != NULL);
if (pItem->m_bVisible) {
pItem->m_nMinX = x;
if (nIndex != m_nSelectedTab) {
switch (m_nTabPos) {
case TP_TOP: x += drawTabTop(&dc, x, client, pItem); break;
case TP_BOTTOM: x += drawTabBottom(&dc, x, client, pItem); break;
}
} else {
switch (m_nTabPos) {
case TP_TOP: x += drawSelTabTop(&dc, x, client, pItem); break;
case TP_BOTTOM: x += drawSelTabBottom(&dc, x, client, pItem); break;
}
}
}
pItem->m_nMaxX = x;
nIndex ++;
}
}
// Returns tab index that holds specified point
int TTabWnd::HitTest(CPoint& point)
{
return HitTest(point.x,point.y);
}
// Returns tab index that holds specified point
int TTabWnd::HitTest(int x, int y)
{
int notsel_y_min, sel_y_min, y_max;
CRect rect;
GetClientRect(&rect);
switch (m_nTabPos) {
case TP_TOP:
notsel_y_min = TABWND_HEIGHT - TAB_HEIGHT - TAB_DEPL;
sel_y_min = TABWND_HEIGHT - TABSEL_HEIGHT - TAB_DEPL;
y_max = TABWND_HEIGHT - TAB_DEPL;
break;
case TP_BOTTOM:
notsel_y_min = rect.Height() - TABWND_HEIGHT + TAB_DEPL;
sel_y_min = rect.Height() - TABWND_HEIGHT + TAB_DEPL;
y_max = rect.Height() - TABWND_HEIGHT + TAB_DEPL + TAB_HEIGHT;
break;
};
int nIndex = 0;
TTabItemList::iterator iterator;
for (iterator = m_TabList.begin(); iterator != m_TabList.end(); iterator++) {
TTabItem *pItem = (*iterator);
if (pItem->m_bEnabled && pItem->m_bVisible) {
if (nIndex != m_nSelectedTab && (y < notsel_y_min || y > y_max))
continue;
if (nIndex == m_nSelectedTab && (y < sel_y_min || y > y_max))
continue;
if (x >= pItem->m_nMinX && x <= pItem->m_nMaxX)
return nIndex;
}
nIndex++;
}
return -1;
}
// Switch focus to specified tab index
BOOL TTabWnd::SetActivePane(int nIndex, BOOL bActivate)
{
if (nIndex == -1)
return FALSE;
if (nIndex == m_nSelectedTab)
return TRUE;
TTabItem *pNewPane = findTabItem(nIndex);
if (!pNewPane->m_bEnabled || !pNewPane->m_bVisible)
return FALSE;
TTabItem *pOldPane = NULL;
if (m_nSelectedTab != -1)
pOldPane = findTabItem(m_nSelectedTab);
if (CanSetActivePane(pOldPane ? pOldPane->m_pWnd : NULL, pNewPane->m_pWnd)) {
// Deactivate old pane
if (m_nSelectedTab != -1) {
pOldPane->m_pWnd->EnableWindow(FALSE);
pOldPane->m_pWnd->ShowWindow(SW_HIDE);
}
// Activate new pane
pNewPane->m_pWnd->EnableWindow(pNewPane->m_bWndEnabled ? TRUE : FALSE);
pNewPane->m_pWnd->ShowWindow(SW_SHOW);
pNewPane->m_pWnd->SetFocus();
// Save index of new pane
m_nSelectedTab = nIndex;
// Invalidate tab
invalidateTabArea();
// Inform derived class
OnSetActivePane(pOldPane ? pOldPane->m_pWnd : NULL, pNewPane->m_pWnd);
// Update frame window
if (bActivate) {
CWnd *pParent = GetParent();
while (pParent && !pParent->IsKindOf(RUNTIME_CLASS(CFrameWnd)))
pParent = pParent->GetParent();
ASSERT(pParent != NULL);
updateFrame((CFrameWnd*)pParent, pNewPane->m_pWnd);
}
return TRUE;
}
return FALSE;
}
// Update frame window active view based on newly selected tab item
BOOL TTabWnd::updateFrame(CFrameWnd *pFrame, CWnd *pWnd)
{
ASSERT(pFrame);
ASSERT(pWnd);
if (pWnd->IsKindOf(RUNTIME_CLASS(CView))) {
// New tab item is a view
pFrame->SetActiveView((CView*)pWnd);
return TRUE;
} else if (pWnd->IsKindOf(RUNTIME_CLASS(CSplitterWnd))) {
CSplitterWnd *pSplitter = (CSplitterWnd*)pWnd;
CWnd *pView = pSplitter->GetActivePane();
if (pView == NULL) {
CWnd *pTmpView;
for (int x = 0; x < pSplitter->GetRowCount(); x ++) {
for (int y = 0; y < pSplitter->GetColumnCount(); y ++) {
pTmpView = pSplitter->GetPane(x,y);
if (pTmpView->IsWindowEnabled()) {
if (updateFrame(pFrame, pTmpView))
return TRUE;
}
}
}
}
if (pView == NULL)
pView = pSplitter->GetPane(0,0);
pFrame->SetActiveView((CView*)pView);
} else if (pWnd->IsKindOf(RUNTIME_CLASS(TTabWnd))) {
TTabWnd *pTab = (TTabWnd*)pWnd;
int nIndex = pTab->GetTabIndex();
CWnd *pTabWnd = pTab->GetTabWnd(nIndex);
if (updateFrame(pFrame, pTabWnd))
return TRUE;
}
return FALSE;
}
// Resize tab
void TTabWnd::ResizeTab(int cx, int cy)
{
CRect rect;
CWnd *pParent = (CWnd*)GetParent();
ASSERT(pParent);
pParent->GetClientRect(&rect);
if (pParent->IsKindOf(RUNTIME_CLASS(CSplitterWnd))) {
CSplitterWnd *splitter = (CSplitterWnd*)pParent;
ASSERT(pParent);
int row,col;
splitter->IsChildPane(this,row,col);
splitter->RecalcLayout();
} else if (pParent->IsKindOf(RUNTIME_CLASS(CFrameWnd))) {
m_bLockFlag = TRUE;
pParent->RepositionBars(0, 0xFFFF, AFX_IDW_PANE_FIRST, CWnd::reposQuery, &rect);
MoveWindow(rect.left,rect.top,rect.Width(),rect.Height());
m_bLockFlag = FALSE;
}
m_bLockFlag = TRUE; // reentrancy check (might get called recursivly from OnSize)
CWnd *pWnd;
TTabItemList::iterator iterator;
for (iterator = m_TabList.begin(); iterator != m_TabList.end(); iterator++) {
pWnd = (*iterator)->m_pWnd;
if (cx == -1 && cy == -1) {
switch (m_nTabPos) {
case TP_TOP:
pWnd->MoveWindow(1, TABWND_HEIGHT+1,
rect.Width()-2, rect.Height()-TABWND_HEIGHT-2);
break;
case TP_BOTTOM:
pWnd->MoveWindow(1, 0, rect.Width()-2, rect.Height()-TABWND_HEIGHT);
break;
}
} else {
switch (m_nTabPos) {
case TP_TOP:
pWnd->MoveWindow(1, TABWND_HEIGHT+1, cx, cy-TABWND_HEIGHT-2);
break;
case TP_BOTTOM:
pWnd->MoveWindow(1, 0, cx, cy-TABWND_HEIGHT);
break;
}
}
}
m_bLockFlag=FALSE;
}
// Erase area where the tabs are displayed
BOOL TTabWnd::OnEraseBkgnd(CDC* pDC)
{
ASSERT(pDC);
CRect rect;
GetClientRect(&rect);
switch (m_nTabPos) {
case TP_TOP:
pDC->FillSolidRect(&CRect(0, 0, rect.right, TABWND_HEIGHT),
::GetSysColor(COLOR_BTNFACE));
break;
case TP_BOTTOM:
pDC->FillSolidRect(&CRect(0, rect.bottom-TABWND_HEIGHT-3, rect.right, rect.bottom),
::GetSysColor(COLOR_BTNFACE));
break;
}
return TRUE;
}
// Handle couse click on tabs
void TTabWnd::OnLButtonUp(UINT nFlags, CPoint point)
{
int nNewTab = HitTest(point.x, point.y);
SetActivePane(nNewTab);
CWnd::OnLButtonUp(nFlags, point);
}
// Handle resize
LRESULT TTabWnd::OnSizeParent(WPARAM, LPARAM lParam)
{
if (m_bLockFlag)
return 0;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -