
# 显示会议信息框
#### 通知描述
收到该通知时，表示用户将鼠标移至会中界面左上角的会议ID处。
#### 方法定义
```
virtual void OnShowExternalConfInfoWnd(int left,int top) {};
```
#### 注意事项
1 收到该通知的前提需要打开 [7.5.3.1 表2 frame对象介绍](https://support.huaweicloud.com/sdkreference-meeting/meeting_basic_0008.html#ZH-CN_TOPIC_0269368439__table846135215115) 中的isUseExternalConfInfoWnd开关为true。
2 通知方法OnShowExternalConfInfoWnd中添加线程切换，抛到用户自己线程中，再显示用户自定义的
会议信息框(会议信息框显示需做置顶操作)。
3 显示用户自定义的会议信息框接口中，需要添加定时器检测(2s)：
鼠标若未移入自定义会议信息框区域，定时器时间到则销毁会议信息框。
鼠标若移入自定义会议信息框区域，则待鼠标移出信息框区域直接销毁会议信息框。
(若未添加3处理，无法覆盖所有的场景销毁会议信息框)
#### 参数描述
表1 
| 参数   | 类型  | 描述            |
|:---|:---|:---|
| left | int | 会议信息框左上角坐标的x。 |
| top  | int | 会议信息框左上角坐标的y。 |
   
**示例代码**
```
/**
* 显示外部会议信息框
*/
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();
}
```
