CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  界面

100分求消息提示窗口

楼主skyrakehell(天涯浪子)2005-08-18 09:24:13 在 VC/MFC / 界面 提问

本人根据网上的一些资料写了一个消息提示窗口,但是一直不太理想,  
  主要存在以下两个问题  
  1:有些时候不能自动弹出  
  2:当前正在使用的对话框会在提示窗口弹出时失去焦点  
  请高手给出相关改正指示,感激++高分 奖励  
  问题点数:100、回复次数:28Top

1 楼WecanHuang(曾阿牛)回复于 2005-08-18 09:27:17 得分 0

AfxMessageBox()没有这种情况吧Top

2 楼teli_eurydice(哭泣的仙人掌。。。。)回复于 2005-08-18 09:31:37 得分 0

AfxMessageBox()Top

3 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2005-08-18 09:31:40 得分 0

代码?  
   
  MesasgeBox/AfxMessageBox?Top

4 楼legendhui(秋天的叶子)回复于 2005-08-18 09:35:50 得分 0

不能自动弹出,跟踪看看你的弹出条件是否满足  
   
   
  Top

5 楼bohut(●伯虎● )回复于 2005-08-18 09:36:36 得分 0

是否是类似于msn的消息提示窗口?Top

6 楼happyparrot(快乐鹦鹉)回复于 2005-08-18 09:42:24 得分 0

楼主是要tooltip效果吧?楼上的怎么都说是MessageBox呢?Top

7 楼skyrakehell(天涯浪子)回复于 2005-08-18 09:42:25 得分 0

对呀,就是像msn一样的,要位于所有窗口的最前列显示,并且不影响当前的输入工作就好Top

8 楼skyrakehell(天涯浪子)回复于 2005-08-18 09:47:07 得分 0

好像要用到顶层窗口中的一些技术,但是不知道怎么处理,才不让现有的正在输入窗口失去焦点Top

9 楼lixiaosan(小三)回复于 2005-08-18 09:48:07 得分 0

呵呵。。。被一楼的影响了,  
   
  应该说的是tooltip  
   
  网上关于tooltip的资料太多了。。Top

10 楼hejiwangbaggio()回复于 2005-08-18 09:49:16 得分 0

把他设成当前窗口的子窗口行不?  
  你说的就是tooltip吧?Top

11 楼skyrakehell(天涯浪子)回复于 2005-08-18 09:53:10 得分 0

有点像   tooltip的效果吧,但是最好要过到类似   msn 提示那样的效果,就以控制关闭,有事件响应处理的,  
  一些现有的代码如下  
  #define   ID_TIMER_POP_WINDOW10  
  #define   ID_TIMER_CLOSE_WINDOW11  
  #define   ID_TIMER_DISPLAY_DELAY12  
  #define   WIN_WIDTH181  
  #define   WIN_HEIGHT116  
  //   CMsgWnd  
   
  CMsgWnd::CMsgWnd()  
  {  
  m_Bitmap.LoadBitmap(MAKEINTRESOURCE(IDB_SHOWMSG));   //Load   Bitmap  
  m_Bitmap.GetBitmap(&bmBitmap);                   //Get   Bitmap   Info  
  m_bFlag=false;  
  m_strMessage="消息提示";  
  m_strCaption="提示文字";  
  }  
   
  void   CMsgWnd::CreateMsgWindow()  
  {CreateEx(0,  
            AfxRegisterWndClass(  
    0,  
    ::LoadCursor(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDC_HAND_1)),(HBRUSH)(COLOR_DESKTOP+1),NULL),  
    "",  
    WS_POPUP|WS_EX_TOPMOST|WS_TABSTOP,  
    0,  
    0,  
    0,//bmBitmap.bmWidth,     //Bitmap   Width   =   Splash   Window   Width  
    0,//bmBitmap.bmHeight,   //Bitmap   Height   =   Splash   Window   Height  
    NULL,//AfxGetMainWnd()->GetSafeHwnd(),  
    NULL,  
    NULL);  
  SetTimer(ID_TIMER_POP_WINDOW,2,NULL);  
  }  
  void   CMsgWnd::OnPaint()    
  {  
  CPaintDC   dc(this);   //   device   context   for   painting  
  CDC   dcMemory;  
  CRect   rect;  
  GetClientRect(&rect);  
          dcMemory.CreateCompatibleDC(NULL);  
  dcMemory.SelectObject(&m_Bitmap);  
  dc.StretchBlt(0,  
  0,  
  rect.right-rect.left,//bmBitmap.bmWidth,  
  rect.bottom-rect.top,//bmBitmap.bmHeight,          
  &dcMemory,    
  0,  
  0,  
  bmBitmap.bmWidth,          
  bmBitmap.bmHeight,  
  SRCCOPY);  
  CFont   font;  
  font.CreatePointFont(90,"Impact");  
  dc.SelectObject(&font);  
  dc.SetTextColor(RGB(0,64,128));  
          dc.SetBkMode(TRANSPARENT);  
  dc.TextOut(30,10,m_strCaption);  
  rect.top=30;  
  dc.DrawText(m_strMessage,-1,&rect,DT_CENTER|DT_SINGLELINE|DT_VCENTER);  
  //   Do   not   call   CWnd::OnPaint()   for   painting   messages  
  }  
  void   CMsgWnd::OnTimer(UINT   nIDEvent)    
  {  
  static   int   nHeight=0;  
    int   cy=GetSystemMetrics(SM_CYSCREEN);  
  int   cx=GetSystemMetrics(SM_CXSCREEN);  
  RECT   rect;  
  SystemParametersInfo(SPI_GETWORKAREA,0,&rect,0);  
  int   y=rect.bottom-rect.top;  
  int   x=rect.right-rect.left;  
  x=x-WIN_WIDTH;  
   
  switch(nIDEvent)  
  {  
  case   ID_TIMER_POP_WINDOW:  
  if(nHeight<=WIN_HEIGHT)  
  {  
  ++nHeight;     //连续增加两次,以加快上声速度  
  ++nHeight;  
  ++nHeight;  
  ++nHeight;  
  MoveWindow(x,  
  y-nHeight,  
  WIN_WIDTH,  
  WIN_HEIGHT);  
   
          Invalidate(FALSE);  
  }  
  else  
  {  
  KillTimer(ID_TIMER_POP_WINDOW);  
  SetTimer(ID_TIMER_DISPLAY_DELAY,5000,NULL);  
  }  
  break;  
  case   ID_TIMER_CLOSE_WINDOW:  
  if(nHeight>=0)  
  {  
  nHeight--;       //连续递减两次,以加快下降速度  
  nHeight--;  
  MoveWindow(x,  
  y-nHeight,  
  WIN_WIDTH,  
  nHeight);  
  }  
  else  
  {  
  KillTimer(ID_TIMER_CLOSE_WINDOW);  
  SendMessage(WM_CLOSE);  
  }  
  break;  
  case   ID_TIMER_DISPLAY_DELAY:  
  KillTimer(ID_TIMER_DISPLAY_DELAY);  
  SetTimer(ID_TIMER_CLOSE_WINDOW,2,NULL);  
  break;  
  }  
   
  CWnd::OnTimer(nIDEvent);  
  }  
   
  int   CMsgWnd::OnCreate(LPCREATESTRUCT   lpCreateStruct)    
  {  
  AnimateWindow(GetSafeHwnd(),1000,AW_CENTER|AW_VER_NEGATIVE);  
  if   (CWnd::OnCreate(lpCreateStruct)   ==   -1)  
  return   -1;  
  BringWindowToTop();  
  return   0;  
  }  
  void   CMsgWnd::OnKillFocus(CWnd*   pNewWnd)    
  {  
  CWnd::OnKillFocus(pNewWnd);  
  if(m_bFlag)  
  SetTimer(ID_TIMER_DISPLAY_DELAY,3000,NULL);  
  //   TODO:   Add   your   message   handler   code   here  
   
  }  
  Top

12 楼goodboyws(深夜不眠者(VCMVP))回复于 2005-08-18 09:53:22 得分 0

设置WS_EX_TOOLWINDOW扩展风格,另外ShowWindow时用SW_SHOWNOACTIVATE和SW_SHOWNA。Top

13 楼skyrakehell(天涯浪子)回复于 2005-08-18 11:03:24 得分 0

急呀,还是会被失去焦点,每当这个提示窗口一弹出时就失去原来的焦点了,  
  我该怎么办?Top

14 楼goodboyws(深夜不眠者(VCMVP))回复于 2005-08-18 11:17:37 得分 0

提示窗口弹出的代码Top

15 楼skyrakehell(天涯浪子)回复于 2005-08-18 11:33:38 得分 0

CMsgWnd   *pMsgWindow1=new   CMsgWnd;  
  CMsgWnd&   msgWindow1=*pMsgWindow1;  
  msgWindow1.SetPromptCaption("秘书消息提示");  
  msgWindow1.SetPrompt("你有新的事务");  
  msgWindow1.CreateMsgWindow();  
  msgWindow1.ShowWindow(SW_SHOWNOACTIVATE);  
  msgWindow1.ShowWindow(SW_SHOWNA);  
  msgWindow1.UpdateWindow();Top

16 楼hejiwangbaggio()回复于 2005-08-18 11:33:46 得分 0

我这有个示例源代码!  
  要不?Top

17 楼skyrakehell(天涯浪子)回复于 2005-08-18 11:34:24 得分 0

CMsgWnd   *pMsgWindow1=new   CMsgWnd;  
  CMsgWnd&   msgWindow1=*pMsgWindow1;  
  msgWindow1.SetPromptCaption("秘书消息提示");  
  msgWindow1.SetPrompt("你有新的事务");  
  msgWindow1.CreateMsgWindow();  
  msgWindow1.ShowWindow(SW_SHOWNOACTIVATE);  
  msgWindow1.ShowWindow(SW_SHOWNA);  
  msgWindow1.UpdateWindow();Top

18 楼skyrakehell(天涯浪子)回复于 2005-08-18 11:35:29 得分 0

to   -->   hejiwangbaggio()    
       
  你有用过吗?  
  能否正常使用?Top

19 楼vcmute(BCare4 H1Rest Good9!)回复于 2005-08-18 11:38:28 得分 0

http://www.vckbase.com/document/finddoc.asp?keyword=msnTop

20 楼hejiwangbaggio()回复于 2005-08-18 11:39:36 得分 0

呵呵,可以正常使用啊!Top

21 楼skyrakehell(天涯浪子)回复于 2005-08-18 11:48:44 得分 0

好呀,发给我看看,  
  有什么方法能解决。  
  我的Email为skyrakehell@126.comTop

22 楼hejiwangbaggio()回复于 2005-08-18 11:59:16 得分 0

好,这就发给你!  
  收到后给我回复一个!Top

23 楼skyrakehell(天涯浪子)回复于 2005-08-18 13:51:47 得分 0

上班时收到了,这完全就是一个   tooltip   的例子嘛,我看看能不能改造先!Top

24 楼vcmute(BCare4 H1Rest Good9!)回复于 2005-08-18 14:00:18 得分 0

http://www.codeproject.com/dialog/statusbarmsgwnd.aspTop

25 楼goodboyws(深夜不眠者(VCMVP))回复于 2005-08-18 14:07:39 得分 0

估计是你在  
  msgWindow1.CreateMsgWindow();  
  已经把窗口Show出来了,看看你的窗口是否选了WS_VISIBLE去掉  
  Top

26 楼skyrakehell(天涯浪子)回复于 2005-08-18 14:36:14 得分 0

我要的是个要qq、msn那样的上线提示效果的类,如果有的就发给我呀,收到马上给分,不够可以再加!Top

27 楼hyg2008(蓝色雨)回复于 2005-08-18 16:15:31 得分 0

markTop

28 楼nanjian011()回复于 2005-08-22 15:11:20 得分 100

我有方法,发到你的e-mail去了Top

相关问题

  • 弹出消息提示窗口的问题
  • 从主窗口发消息给对话框,如何,高手提示???
  • 怎么像VC6那样在视中显示一个消息提示窗口?CToolTipCtrl可以吗?立马结帐!
  • 声音提示、弹出窗口提示
  • 消息提示框!!大虾帮忙
  • WinForm中实现消息提示框????
  • 关于onclose事件的消息提示
  • 如何做个消息提示器
  • 窗口消息
  • 数据窗口提示select error

关键词

  • 消息
  • 代码
  • ws
  • 效果
  • msn
  • msgwindow1
  • cmsgwnd
  • pmsgwindow1
  • createmsgwindow
  • 弹出

得分解答快速导航

  • 帖主:skyrakehell
  • nanjian011

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo