更新时间:2024-07-30 GMT+08:00

显示会议信息框

通知描述

收到该通知时,表示用户将鼠标移至会中界面左上角的会议ID处。

方法定义

1
virtual void OnShowExternalConfInfoWnd(int left,int top) {};

注意事项

1 收到该通知的前提需要打开 7.5.3.1 表2 frame对象介绍 中的isUseExternalConfInfoWnd开关为true。

2 通知方法OnShowExternalConfInfoWnd中添加线程切换,抛到用户自己线程中,再显示用户自定义的

会议信息框(会议信息框显示需做置顶操作)。

3 显示用户自定义的会议信息框接口中,需要添加定时器检测(2s):

鼠标若未移入自定义会议信息框区域,定时器时间到则销毁会议信息框。

鼠标若移入自定义会议信息框区域,则待鼠标移出信息框区域直接销毁会议信息框。

(若未添加3处理,无法覆盖所有的场景销毁会议信息框)

参数描述

表1

参数

类型

描述

left

int

会议信息框左上角坐标的x。

top

int

会议信息框左上角坐标的y。

示例代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/**
* 显示外部会议信息框
*/
LRESULT demoMainMenuDlg::OnShowExternalConfInfoWnd(WPARAM wParam, LPARAM lParam)
{
    CPoint* pt = (CPoint*)wParam;
    demoConfInfoDlg* dlg = demoData::GetInstance().GetConfInfoDlgObj();
    // 若窗口对象不存在,则创建窗口对象
    if (dlg == NULL)
    {
        dlg = new demoConfInfoDlg;
        dlg->Create(IDD_CONF_INFO_DIALOG, NULL);
        demoData::GetInstance().SetConfInfoDlgObj(dlg);
    }
    // 若窗口存在,则发起定时器检测窗口销毁
    if (IsWindow(dlg->GetSafeHwnd()))
    {
        SetTimer(1, 2000, NULL);
    }
    // 显示窗口且置顶
    CRect rectDlg(0, 0, 0, 0);
    dlg->GetClientRect(rectDlg);
    CRect rt(pt->x, pt->y, pt->x + rectDlg.Width(), pt->y + rectDlg.Height());
    dlg->MoveWindow(rt);
    dlg->SetWindowPos(&CWnd::wndTopMost, pt->x, pt->y, rectDlg.Width(), rectDlg.Height(), SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
    dlg->ShowWindow(SW_SHOW);
 
    delete pt;
    pt = NULL;
    return 0;
}
/**
* 定时器检测销毁会议信息框
*/
void demoMainMenuDlg::OnTimer(UINT_PTR nIDEvent)
{
    if (nIDEvent == 1)
    {
        demoConfInfoDlg* dlg = demoData::GetInstance().GetConfInfoDlgObj();
        if (dlg == NULL)
        {
            return;
        }
 
        if (IsWindow(dlg->m_hWnd))
        {
            CPoint ptMouse(0, 0);
            GetCursorPos(&ptMouse);
            
            CRect rtConfInfo(0,0,0,0);
            dlg->GetWindowRect(&rtConfInfo);
            // 鼠标不在会议信息框范围内则销毁
            if (!rtConfInfo.PtInRect(ptMouse))
            {
                dlg->CloseWindow();
                demoData::GetInstance().SetConfInfoDlgObj(NULL);
                delete dlg;
                dlg = NULL;
                KillTimer(nIDEvent);
            }
        }
    }
    CDialogEx::OnTimer(nIDEvent);
}
/**
* 会议信息框添加鼠标移出销毁自身窗口
*/
void demoConfInfoDlg::OnMouseMove(UINT nFlags, CPoint point)
{ 
    if (!m_bTracking)
    {
        TRACKMOUSEEVENT   t_MouseEvent;
        t_MouseEvent.cbSize = sizeof(TRACKMOUSEEVENT);
        t_MouseEvent.dwFlags = TME_HOVER | TME_LEAVE;
        t_MouseEvent.hwndTrack = m_hWnd;
        t_MouseEvent.dwHoverTime = 30;
 
        // 触发OnMouseLeave or OnMouseHover事件,m_bTracking 防止频繁触发事件
        if (::_TrackMouseEvent(&t_MouseEvent))
        {
            m_bTracking = true;
        }
    } 
    CDialogEx::OnMouseMove(nFlags, point);
}
 
void demoConfInfoDlg::OnMouseLeave()
{ 
    m_bTracking = false;
    CDialogEx::OnMouseLeave();
    demoData::GetInstance().SetConfInfoDlgObj(NULL);
    OnCancel();
}