如果我点一个完成按钮,发现email地址没填,然后我1.m_edit_emial.SetFocus();2.messagebox("你没填邮箱"),现在问题是。我不能用messagebox,而是在邮箱编辑框旁边出现note(会自己消失),象tooltips那样。听说要自己做窗口类,不懂,望高手指教。

解决方案 »

  1.   

    是的,要做成提示窗口。www.vckbase.com上面有的。你查查看!
      

  2.   

    晕,不负责任的回答,我知道微软 msdn 上有
      

  3.   

    vc自带有这样的控件
    Project->Add to project->components and controls
      

  4.   

    不知道你要不要,我有一个ToolTip的提示控件,可以支持多行提示,自己做的!
      

  5.   

    我的要求是:我不能用messagebox,而是在邮箱编辑框旁边立刻出现note(会自己消失),象tooltips那样。主要是立刻出现2个字。
      

  6.   

    用tooltipctrl自己做一个也不会有多麻烦的
      

  7.   

    //给你一个简单一点的东东,假设你的对话框类是CTestDlg//先给CTestDlg类加三个对话框成员:
    LPCSTR m_strOpenWndClass;
    HWND m_hOpenWnd;
    HBRUSH m_hOpenWndBrush;//之后在OninitDialog中加上:
    m_hOpenWndBrush = CreateSolidBrush(RGB(255,252,238));
    m_strOpenWndClass = AfxRegisterWndClass(CS_DBLCLKS, AfxGetApp()->LoadCursor(IDC_ARROW), m_hOpenWndBrush, NULL);//定义一个函数:
    HWND CTestDlg::OpenWindow(LPCSTR strText, int x, int y, int nWidth, int nHeight)
    {
    if(m_hOpenWnd != NULL)
    {
    ::DestroyWindow(m_hOpenWnd);
    m_hOpenWnd = NULL; KillTimer(1);
    } m_hOpenWnd = CreateWindowEx(WS_EX_TOPMOST, m_strOpenWndClass, NULL, WS_BORDER|WS_POPUP|WS_VISIBLE, 
    x, y, nWidth, nHeight, this->GetSafeHwnd(), NULL, NULL, NULL); if(m_hOpenWnd != NULL)
    {
    ::UpdateWindow(m_hOpenWnd);
    HDC hdc = ::GetDC(m_hOpenWnd); SetBkColor(hdc, RGB(255,252,238));
    TextOut(hdc, 0, 0, strText, strlen(strText)); ::ReleaseDC(m_hOpenWnd, hdc); SetTimer(1, 5000, NULL);
    } return m_hOpenWnd;
    }//定义OnTimer事件:
    void CTestDlg::OnTimer(UINT nIDEvent) 
    {
    if(nIDEvent == 1 && m_hOpenWnd != NULL)
    {
    ::ShowWindow(m_hOpenWnd, SW_HIDE);
    ::DestroyWindow(m_hOpenWnd);
    m_hOpenWnd = NULL; KillTimer(nIDEvent);
    } CDialog::OnTimer(nIDEvent);
    }//释放资源,重载DestroyWindow:
    BOOL CTestDlg::DestroyWindow() 
    {
    if(m_hOpenWnd != NULL)
    {
    ::DestroyWindow(m_hOpenWnd);
    m_hOpenWnd = NULL;
    }

    if(m_hOpenWndBrush != NULL)
    {
    ::DeleteObject(m_hOpenWndBrush);
    m_hOpenWndBrush = NULL;
    } return CDialog::DestroyWindow();
    }//使用:
    void CTestDlg::OnTestOpenwindow() 
    {
    OpenWindow("测试打开提示窗口!", 400, 400, 140, 20);
    }//当然这里面的“SetTimer(1, 5000, NULL)”可以调整,你可以在任何需要调用的地方调用
    //如果你要实现更强的功能,比如说实现气泡式窗口的话,去自定义一个窗口类可能更好
      

  8.   

    Vc的组件中有一个Splash window的组件,就是在程序运行时弹出一个闪屏窗口,你可以看看这个窗口类的源代码,稍加修改就可以用于你说得情况
      

  9.   

    可以用CToolTipCtrl等类似的功能窗口,然后用一个定时器让它消失
      

  10.   

    首先谢谢大家的帮助  
        ?问一下启明星:       
    1,怎么使tooltip窗口停在输入邮箱地址的 edit控件旁边 
    2,如果下面还有edit 如(姓名)也没填,该怎么关闭邮箱的定时器,
       同时另开一个 姓名 的定时器, 迷茫中??
      

  11.   

    //1、假设你的编辑控件是m_edit:
    RECT rect;
    m_edit.GetWindowRect(&rect);
    OpenWindow("测试打开提示窗口!", rect.right, rect.top, 140, 20);
    //2、在开两个定时器很简单啊:
    #define TIMER_ID_EMAIL  1
    #define TIMER_ID_NAME   2//开一个Email的定时器
    SetTimer(TIMER_ID_EMAIL, 5000, NULL);//开一个Name的定时器
    SetTimer(TIMER_ID_NAME, 5000, NULL);//处理OnTimer事件:
    void CTestDlg::OnTimer(UINT nIDEvent) 
    {
    if(nIDEvent == TIMER_ID_EMAIL) // 处理Email的定时器
    {
    //... KillTimer(nIDEvent); 
    }
    else if(nIDEvent == TIMER_ID_EMAIL) // 处理Name的定时器
    {
    //... KillTimer(nIDEvent);
    }
    CDialog::OnTimer(nIDEvent);
    }//不过要注意,开太多的定时器会造成系统的不稳定性且耗费资源
    //对于你这个问题,我认为开一个定时器足够解决了,只需要开多个窗口就可以了!