CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

我实现了MSN6.0中聊天窗口的透明效果,与大家共享,绝对原创,主要的实现思想如下:

楼主hearthavegone()2003-12-01 11:59:32 在 VC/MFC / 基础类 提问

(仅支持win2000及以后版本)  
   
  对于普通的透明,在www.vckbase.com有许多现成的例子,但是这些透明却都是完全的透明(对桌面也是透明的),为了实现MSN6.0中的聊天对话框的透明效果,实现为:  
   
        1.创建两个对话框,后台对话框,及前台对话框,其中前台对话框是透明的,但后台对话框是非透明的,且后台对话框是前台对话框的父窗口,  
        2.当后台对话框移动时,也同时移到前台对话框,且让前台对话框覆盖其客户区  
   
        到目前为止还有一点点问题,就是当后台对话框最小化或Restore时,会有一种明显的层次感,希望大家一起改进。  
       
        因为没有地方上传代码,需要代码给我联系:kangfx@126.com,   MSN:kangfx@hotmail.com,   QQ:160915312 问题点数:0、回复次数:15Top

1 楼Ariesman(苦行僧)回复于 2003-12-01 12:06:14 得分 0

这也有例子呀  
  仅仅一个函数嘛。。。  
  我记得不是VCKBASE的第13期就是第17期就有Top

2 楼zhucde(【風間苍月】★<==>★【虚拟闲人】)回复于 2003-12-01 12:06:37 得分 0

要一份  
  Top

3 楼CreateProcessAsUser(World.reStart)回复于 2003-12-01 12:08:06 得分 0

垃圾.Top

4 楼IceboundRock()回复于 2003-12-01 12:14:48 得分 0

帮你顶,你可以把代码在vckbase上发表啊  
  Top

5 楼mfc168(子非鱼)回复于 2003-12-01 12:42:39 得分 0

共同参考研究:     mfc168@163.comTop

6 楼ddddh(叶君临)回复于 2003-12-01 12:46:08 得分 0

弱弱的问一句,msn怎么透明窗口啊?Top

7 楼topwork(日光)回复于 2003-12-01 12:47:57 得分 0

同意,我也想知道,MSN怎么透明窗口。Top

8 楼patient(北京病人)回复于 2003-12-01 12:57:12 得分 0

remarkTop

9 楼ifengfeng(fengfeng)回复于 2003-12-01 13:03:47 得分 0

MSN哪里有透明了,是不是我系统看不出来?我的是2003Top

10 楼beyondtkl(大龙驹<*好久没来了,兄弟们好吧。*>)回复于 2003-12-01 13:06:58 得分 0

学习   来一份先   beyondtkl@sina.com.cnTop

11 楼zjlgigi(外星人)回复于 2003-12-01 13:37:03 得分 0

学习  
  支持一下,不如放到主页空间上让更多人下载~~Top

12 楼hearthavegone()回复于 2003-12-01 13:46:33 得分 0

TO:ifengfeng(fengfeng)  
  在MSN6.0中的对话窗口(后面有一个背景图片,前面的各种控件对于后面的图片都是透明的),请注意不是主窗口,这个解决方案是想了好久才想到的  
  主要的代码有:  
   
   
  /************************dlgBk.h***********/  
   
  #include   "DlgTop.h"  
   
  class   CDlgBk   :   public   CDialog  
  {  
  public:  
  CDlgBk(CWnd*   pParent   =   NULL);  
  //{{AFX_DATA(CDlgBk)  
  enum   {   IDD   =   IDD_DLG_BK   };  
  //}}AFX_DATA  
   
  //{{AFX_VIRTUAL(CDlgBk)  
  protected:  
  virtual   void   DoDataExchange(CDataExchange*   pDX);  
  //}}AFX_VIRTUAL  
  private:  
  CBrush   m_brushBk;  
  CBitmap   m_bitMap;  
  CDlgTop*   m_pDlgTop;  
   
  protected:  
  //{{AFX_MSG(CDlgBk)  
  afx_msg   void   OnPaint();  
  afx_msg   void   OnMove(int   x,   int   y);  
  virtual   BOOL   OnInitDialog();  
  afx_msg   void   OnShowWindow(BOOL   bShow,   UINT   nStatus);  
  afx_msg   void   OnClose();  
  //}}AFX_MSG  
  DECLARE_MESSAGE_MAP()  
  };  
   
   
  /****************dlgBk.cpp*********************/  
  CDlgBk::CDlgBk(CWnd*   pParent)  
  :   CDialog(CDlgBk::IDD,   pParent)  
  {  
  //{{AFX_DATA_INIT(CDlgBk)  
  //}}AFX_DATA_INIT  
  m_bitMap.LoadBitmap(   IDB_BMP_GIRL   );  
  m_brushBk.CreatePatternBrush(&m_bitMap);  
  m_pDlgTop   =   new   CDlgTop;  
  }  
   
   
  void   CDlgBk::DoDataExchange(CDataExchange*   pDX)  
  {  
  CDialog::DoDataExchange(pDX);  
  //{{AFX_DATA_MAP(CDlgBk)  
  //}}AFX_DATA_MAP  
  }  
   
   
  BEGIN_MESSAGE_MAP(CDlgBk,   CDialog)  
  //{{AFX_MSG_MAP(CDlgBk)  
  ON_WM_PAINT()  
  ON_WM_MOVE()  
  ON_WM_SHOWWINDOW()  
  ON_WM_CLOSE()  
  //}}AFX_MSG_MAP  
  END_MESSAGE_MAP()  
   
   
  BOOL   CDlgBk::OnInitDialog()    
  {  
  CDialog::OnInitDialog();  
   
  //自己初始化时将前台显示的对话框也创建出来  
  m_pDlgTop->Create(   IDD_DLG_TOP,   this   );  
   
  return   TRUE;  
  }  
   
   
  void   CDlgBk::OnPaint()    
  {  
  CPaintDC   dc(this);  
   
  //绘制背景图  
  CRect   rect;  
  GetClientRect(rect);  
  dc.FillRect(rect,&m_brushBk);  
  }  
   
  void   CDlgBk::OnMove(int   x,   int   y)    
  {  
  CDialog::OnMove(x,   y);  
   
  //将前台对话框与其客户区相重合  
  if   (   IsWindow(   m_pDlgTop->m_hWnd   )   )  
  {  
  CRect   rectClient;  
  GetClientRect(   &rectClient   );  
  ClientToScreen(   &rectClient   );  
  m_pDlgTop->MoveWindow(   &rectClient   );  
  }  
  }  
   
  void   CDlgBk::OnShowWindow(BOOL   bShow,   UINT   nStatus)    
  {  
  CDialog::OnShowWindow(bShow,   nStatus);  
   
  if   (   bShow   )  
  {  
  OnPaint();//要先刷新,如果不调用是不会刷新的,因为被CDlgTop覆盖  
  m_pDlgTop->ShowWindow(   SW_SHOW   );  
  }  
  }  
   
  void   CDlgBk::OnClose()    
  {  
  delete   m_pDlgTop;  
  CDialog::OnClose();  
  }  
   
   
  /************************dlgtop.h*******************/  
  class   CDlgTop   :   public   CDialog  
  {  
  public:  
  CDlgTop(CWnd*   pParent   =   NULL);       //   standard   constructor  
  //{{AFX_DATA(CDlgTop)  
  enum   {   IDD   =   IDD_DLG_TOP   };  
  //}}AFX_DATA  
   
  //{{AFX_VIRTUAL(CDlgTop)  
  protected:  
  virtual   void   DoDataExchange(CDataExchange*   pDX);         //   DDX/DDV   support  
  //}}AFX_VIRTUAL  
   
  protected:  
  //{{AFX_MSG(CDlgTop)  
  virtual   BOOL   OnInitDialog();  
  afx_msg   void   OnShowWindow(BOOL   bShow,   UINT   nStatus);  
  //}}AFX_MSG  
  DECLARE_MESSAGE_MAP()  
  };  
   
   
  /***********dlgtop.cpp*******************/  
  #include   "stdafx.h"  
  #include   "MsnTrans.h"  
  #include   "DlgTop.h"  
   
  #ifdef   _DEBUG  
  #define   new   DEBUG_NEW  
  #undef   THIS_FILE  
  static   char   THIS_FILE[]   =   __FILE__;  
  #endif  
   
   
  CDlgTop::CDlgTop(CWnd*   pParent)  
  :   CDialog(CDlgTop::IDD,   pParent)  
  {  
  //{{AFX_DATA_INIT(CDlgTop)  
  //}}AFX_DATA_INIT  
  }  
   
   
  void   CDlgTop::DoDataExchange(CDataExchange*   pDX)  
  {  
  CDialog::DoDataExchange(pDX);  
  //{{AFX_DATA_MAP(CDlgTop)  
  //}}AFX_DATA_MAP  
  }  
   
   
  BEGIN_MESSAGE_MAP(CDlgTop,   CDialog)  
  //{{AFX_MSG_MAP(CDlgTop)  
  ON_WM_SHOWWINDOW()  
  //}}AFX_MSG_MAP  
  END_MESSAGE_MAP()  
   
   
  BOOL   CDlgTop::OnInitDialog()    
  {  
  CDialog::OnInitDialog();  
   
  //以下代码是我从别人那里抄来的,主要是使CDlgTop对话框透明  
  //出处为www.vckbase.com,不用细看其内容  
  SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,  
  GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);  
  HINSTANCE   hInst   =   LoadLibrary("User32.DLL");    
  if(hInst)    
  {                          
  typedef   BOOL   (WINAPI   *MYFUNC)(HWND,COLORREF,BYTE,DWORD);                      
  MYFUNC   fun   =   NULL;  
  //取得SetLayeredWindowAttributes函数指针            
  fun=(MYFUNC)GetProcAddress(hInst,   "SetLayeredWindowAttributes");  
  if(fun)fun(this->GetSafeHwnd(),0,128,2);            
  FreeLibrary(hInst);    
  }  
   
  return   TRUE;  
  }  
   
  void   CDlgTop::OnShowWindow(BOOL   bShow,   UINT   nStatus)    
  {  
  CDialog::OnShowWindow(bShow,   nStatus);  
  //向其父窗口发消息要求其刷新背景  
  GetParent()->SendMessage(   WM_PAINT,   NULL,   NULL   );  
  }  
   
   
  Top

13 楼ayanamiwww(咩~咩『抵制日货』)回复于 2003-12-01 13:51:23 得分 0

支持你一下吧Top

14 楼UPCCPU(最低奋斗目标:农妇、山泉、有点田)回复于 2003-12-01 14:12:45 得分 0

give   me  
  upccpu@yahoo.com.cnTop

15 楼lingdove(灵鸽)回复于 2003-12-01 14:24:46 得分 0

帮我看看这个跟透明有关的问题吧  
   
  http://expert.csdn.net/Expert/topic/2511/2511444.xml?temp=.7537653  
   
  这个问题我看是没人能解决了??因为我还没见到有这样的东西,比较说永远在桌面的最上面滚动一行透明文字,上面的文字是时间,而且要求不能闪动太明显??有哪位高手能做到??我就服了....是高手的快点站出来吧...  
  Top

相关问题

  • 【原创共享】自定义滚动条
  • 共享我原创的平面按钮控件!!!
  • [共享][原创] 不用session的图片验证码
  • [原创问题]怎么实现 treeview 背景为透明?
  • 原创:一个MSN提示类
  • 原创控件代码共享--日期选择控件+同时祝贺爱人生日+来者有分
  • 共享:原创C#三层结构代码生成器,想要的快快下载了!
  • 共享??
  • 共享
  • 谁知道msn的共享空间中,文件上传是怎样实现的

关键词

  • msn
  • 代码
  • virtual
  • 对话框
  • cdlgbk
  • 透明
  • afx
  • 前台
  • 后台
  • 实现

得分解答快速导航

  • 帖主:hearthavegone

相关链接

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

广告也精彩

反馈

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