65.9K
CodeProject 正在变化。 阅读更多。
Home

突出显示带焦点的视图

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.57/5 (4投票s)

2000年1月11日

viewsIcon

78960

添加视觉反馈,指示拆分视图中的哪个窗格当前具有焦点

很多时候,当在分割视图中,知道哪个窗格当前拥有焦点,会很有帮助。 如果您有多种视图类型,并且不同的键盘按键在每个窗格中都会导致不同的操作,这将非常有用。

注意:这使用了 MFC 中的一个未文档化的特性,因此请谨慎使用。

  • 步骤 1. 派生您自己的 SplitterWnd 类。
  • 步骤 2. 重写未文档化的 OnDrawSplitter 函数。
  • 步骤 3. 将子框架中的 CSplitterWnd 实例替换为您的分割器。

此示例以红色绘制,但您可以更改定义值来调整框架的颜色和宽度。

/////////////////////////////////////////////////////////////////////////////
// MySplitterWnd.h

class MySplitterWnd : public CSplitterWnd
{
public: 
    int cRow;
    int cCol; 
    MySplitterWnd();
    void OnDrawSplitter(CDC* pDC, ESplitType nType, const CRect& rectArg);
    void RefreshSplitBars(void);
};

/////////////////////////////////////////////////////////////////////////////
// MySplitterWnd.cpp

#include "StdAfx.h"
#include "MySplitterWnd.h"

#define FOCUS_HILIGHT_COLOR_ULO RGB(180, 75, 25)
#define FOCUS_HILIGHT_COLOR_LRO RGB(245, 5, 25)
#define FOCUS_HILIGHT_COLOR_ULI RGB(145, 95, 75)
#define FOCUS_HILIGHT_COLOR_LRI RGB(220, 65, 40)

#define FOCUS_HILIGHT_SHOW TRUE

#define SPLITTER_CX 4
#define SPLITTER_CY 4
#define SPLITTER_GAPX 4
#define SPLITTER_GAPY 4

void MySplitterWnd::RefreshSplitBars(void)
{
    CRect rectInside;

    GetInsideRect(rectInside);
    DrawAllSplitBars(NULL, rectInside.right, rectInside.bottom);
}

MySplitterWnd::MySplitterWnd()
{
    cRow = 0;
    cCol = 0;

    m_cxSplitter = SPLITTER_CX;
    m_cySplitter = SPLITTER_CY;
    m_cxSplitterGap = SPLITTER_GAPX;
    m_cySplitterGap = SPLITTER_GAPY;
}

void MySplitterWnd::OnDrawSplitter(CDC* pDC, ESplitType nType,
                                   const CRect& rectArg)
{
    if ((FOCUS_HILIGHT_SHOW) && ((GetRowCount() > 1) || 
        (GetColumnCount() > 1)) && (nType == splitBorder))
    {
        int pRow = 0;
        int pCol = 0;
        if (rectArg.top)
        {
            pRow = 1;
        }
        if (rectArg.left)
        {
            pCol = 1;
        }
        if ((cRow == pRow) && (cCol == pCol))
        {
            if (pDC == NULL)
            {
                RedrawWindow(rectArg, NULL, RDW_INVALIDATE|RDW_NOCHILDREN);
                return;
            }
            ASSERT_VALID(pDC);
            CRect rect = rectArg;
            pDC->Draw3dRect(rect, 
                FOCUS_HILIGHT_COLOR_ULO, FOCUS_HILIGHT_COLOR_LRO);
            rect.InflateRect(-GetSystemMetrics(SM_CXBORDER), 
                             -GetSystemMetrics(SM_CYBORDER));
            pDC->Draw3dRect(rect,
                FOCUS_HILIGHT_COLOR_ULI, FOCUS_HILIGHT_COLOR_LRI);
            return; 
        }
    }

    CSplitterWnd::OnDrawSplitter(pDC,nType,rectArg); 
}

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.