突出显示带焦点的视图






2.57/5 (4投票s)
2000年1月11日

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);
}
许可证
本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。