我实现了MSN6.0中聊天窗口的透明效果,与大家共享,绝对原创,主要的实现思想如下:
(仅支持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




