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

CheckerCtrl

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.96/5 (11投票s)

2001年3月26日

CPOL
viewsIcon

65888

downloadIcon

1580

一个类似于 Microsoft Scandisk 的控件(在用户界面方面),允许您在屏幕上放置一系列块。

Sample Image - CheckerCtrl.gif

引言

我花了好几天在网上寻找类似于 Microsoft Scandisk 的控件(在图形用户界面方面,而不是行为),但我没有找到任何一个。所以我创建了一个名为 CCheckerCtrl 的类,它可以做同样的事情。您可以填充一系列您自己选择的颜色的块,以及获取任何块的颜色。

如何使用

要使用该控件,您需要导入头文件以及附加到本文的 .cpp 文件。 然后,您只需打开对话框编辑器并在对话框上放置一个矩形。 我们将这个静态控件称为 IDC_STATIC_CHECKER。 之后,您可以从 CCheckerCtrl 类实例化一个对象,例如 m_ctrlChecker,作为对话框类的公共数据成员。

然后在 WM_INITDIALOG 消息的消息处理程序中,您获取已经在对话框上放置的静态矩形的区域,然后您只需创建如下的检查器控件

//Declaring a local variable

CRect rect; 
//Get the rectangulare coordinates of the 

//rectangle we already placed on dialog

GetDlgItem(IDC_STATIC_CHECKER)->GetWindowRect(rect);
//Convert to the client coordinates

ScreenToClient(rect);
//Create and place the checker control on screen

m_ctrlChecker.Create(WS_VISIBLE | WS_CHILD | WS_VSCROLL | 
                    WS_TABSTOP, rect, this, IDC_STATIC_CHECKER);

完成此操作后,检查器的窗口将显示在屏幕上。现在,我们使用该类的 SetTotalBlocks 方法来设置我们希望检查器控件包含的块的总数

//Creating and placing 500 blocks on the checker control

m_ctrlChecker.SetTotalBlocks(500); 

该函数的声明如下

void CCheckerCtrl::SetTotalBlocks(const UINT nNumberofBlocks, 
                                     const UINT nStartIndex = 0)

其中 nNumberofBlocks 是我们想要放置在检查器控件中的块数,nStartIndex 是起始块的索引。 假设您需要将这些块从 5 编号到 505。为此,您将 5 作为 nStartIndex。 这样,第一个块的第一个数字将是 5,第二个块的数字是 6,依此类推...直到 505。默认值为 0。

如果您现在运行该程序,您将面临 500 个白色块。 现在,您可以通过该类的以下成员函数简单地设置块的颜色

void CCheckerCtrl::SetBlock(const UINT nBlockNumber, 
                               const COLORREF crColor)

例如,要将控件的第 2、3、4 和 5 个块涂成红色,我们将执行以下操作

for(register i = 2; i < 6; i++)
    m_ctrlChecker.SetBlock(i, RGB(255, 0, 0));

现在为了使更改生效,我们只需调用该类的 Refresh 函数

m_ctrlChecker.Refresh();

但有时您需要立即刷新一个块,因此您可以使用该类的 Update 方法。 声明如下

void CCheckerCtrl::Update(const UINT nBlockNumber);

例如,

for(register i = 2; i < 6; i++)
{
    m_ctrlChecker.SetBlock(i, RGB(255, 0, 0));
    m_ctrlChecker.Update(i);
}

当我们想要获取特定块的颜色时,此控件的下一个函数开始发挥作用。 为此,使用 GetBlock 成员函数

COLORREF GetBlock(const UINT nBlockNumber) const;

例如,要获取第 6 个块的颜色,我们这样做

COLORREF crColor = m_ctrlChecker.GetBlock(6);

最后,我们来看该类的最后一个成员函数,Reset(),它将所有块的颜色再次重置为白色。

此类中还有一个预定义的消息,名为 WM_CHECKERCTRL_RBUTTONDOWN,当您需要控制鼠标左键单击时使用,例如,在屏幕上显示弹出菜单。 请注意,该消息将被发送到创建时提供给该类的父窗口。 您可以使用以下原型为此消息定义处理程序

UINT OnRclickedChecker(WPARAM wParam, LPARAM lParam)

其中 wParam 是检查器控件的控件 ID,lParam 是用户单击的块的编号。 控件 ID 用于区分同一对话框上的不同检查器控件。

最后说明

由于源代码非常简单明了,并且充满了前提条件、后置条件和不同的注释行,我认为本文现在已经完成。 您可以通过他的电子邮件地址联系作者。 欢迎提出任何意见、问题或建议。 阿罗哈!

© . All rights reserved.