编写有提示的listbox控件



        在MFC中几乎所有的控件都有信息提示,而惟有listbox却没有这样的一个功能,每当我们把鼠标移到listbox上控件时,啥玩意儿都没有是不是很气馁啊,所以我今天特地写了一个简单的有提示的listbox控件,来实现那样的效果.

       思路比较简单:我们首先构造一个自己mylistbox来继承listbox控件,然后在自己的mylistbox里添加一个ctooltipctrl控件(显示信息的载体).这样我们必须提供一个接口来创建ctooltipctrl控件.其次呢,控件创建后,它需要一个设置信息的接口.然后呢,当我们的鼠标移动时,它随着鼠标所在位置的改变,而显示不同的内容,因此它需要一个鼠标移动事件,在鼠标移动的时候进行进行信息设置.代码如下:列出了cpp文件的代码

BOOL CTipListBox::CreateToolTip()
{
    if (NULL == m_toolTipMessage)
    {
        m_toolTipMessage = new CToolTipCtrl();
        if (m_toolTipMessage->Create(this, TTS_ALWAYSTIP|TTS_NOPREFIX))
        {
            m_toolTipMessage->Activate(TRUE);
            m_toolTipMessage->SetDelayTime(100);
            m_toolTipMessage->SetMaxTipWidth(500);
            m_toolTipMessage->AddTool(this);// 帮定控件tooltip

            return TRUE;
        }
    }
    return FALSE;
}

void CTipListBox::SetTipMessage(CString &message)
{
    if (message.IsEmpty())
    {
        return ;
    }

    if (m_toolTipMessage->GetSafeHwnd() != NULL)
    {
        m_toolTipMessage->UpdateTipText(message, this);  // 更新要显示的字符     
    }
    else
    {
        if (CreateToolTip())
        {
            m_toolTipMessage->AddTool(this, message);
        }
    }

    m_toolTipMessage->Activate(TRUE);
}

void CTipListBox::OnMouseMove(UINT nFlags, CPoint point)
{
    CPoint pt;// 当前鼠标所在位置
    GetCursorPos(&pt);
    ScreenToClient(&pt);// 转化为客户区的坐标

    CRect rect;// 控件的大小
    GetClientRect(&rect);
    BOOL inout;
    CString message;

    if (rect.PtInRect(pt))
    {
        int select = ItemFromPoint(pt, inout);// 鼠标所在的哪一条信息
        GetText(select, message);
        SetTipMessage(message);
    }
}

BOOL CTipListBox::PreTranslateMessage(MSG* pMsg)
{
    if (m_toolTipMessage->GetSafeHwnd() != NULL)
    {
        if (pMsg->message == WM_MOUSEMOVE)
        {
            m_toolTipMessage->RelayEvent(pMsg);
            SendMessage(WM_MOUSEMOVE);
        }
    }

    return CWnd::PreTranslateMessage(pMsg);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,您需要在代码中创建一个数据结构来存储已经预订的时间段,例如一个名为“bookedTimes”的Dictionary,其中键为时间段,值为bool类型的标志,表示该时间段是否已经被预订。 在窗体的Load事件中,您需要初始化“bookedTimes”字典,将所有时间段的值都设置为false,表示它们尚未被预订。 接下来,在listbox的SelectedIndexChanged事件中,您需要检查所选时间段是否已经被预订。如果是,则禁用提交按钮,并在消息框中显示一个提示。否则,启用提交按钮,并将“bookedTimes”字典中对应时间段的值设置为true,表示该时间段已经被预订。 以下是示例代码: ```vb.net Public Class BookingForm Private bookedTimes As New Dictionary(Of String, Boolean) Private Sub BookingForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load ' 初始化bookedTimes字典 bookedTimes.Add("11:00-13:00", False) bookedTimes.Add("13:00-15:00", False) bookedTimes.Add("15:00-17:00", False) End Sub Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedIndexChanged Dim selectedTime As String = ListBox1.SelectedItem.ToString() If bookedTimes(selectedTime) Then ' 时间段已经被预订,禁用提交按钮并显示提示 btnSubmit.Enabled = False MessageBox.Show(selectedTime & " has already been booked.") Else ' 时间段可以预订,启用提交按钮并将标志设置为已预订 btnSubmit.Enabled = True bookedTimes(selectedTime) = True End If End Sub End Class ``` 请注意,此代码仅演示了如何实现所要求的基本功能,您可能需要根据您的实际需求进行修改和扩展。同时,请确保在代码中添加适当的错误处理和异常处理,以确保程序的稳定性和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值