:) 我:CWnd写了一个自定义控件,怎么记这个控件的背景透明啊?高手请指点12,小弟感激不尽!!

eww 2006-10-10 06:40:21
继承于CWnd 做了一个滚动字幕,但背景怎么改都是黑的,我也可以自定义颜色。但是怎么能让背景色透明,这样才能显示出父窗口的内容:(,搞了好长时间了,都没有搞定。

请各位大虾不惜指点:)

下面是create function


BOOL CScrollerCtrl::Create(const RECT& rect, CWnd* pParentWnd, UINT uStyle, UINT nID)

{


if ( NULL == m_font.GetSafeHandle() ) SetFont(szFONT_NAME, nFONT_SIZE, FALSE,FALSE,FALSE);


m_bShowScroll = uStyle&WS_VSCROLL;
uStyle &= ~WS_VSCROLL;



if ( CWnd::Create(::AfxRegisterWndClass(CS_HREDRAW|CS_PARENTDC|CS_VREDRAW,::LoadCursor(NULL,IDC_ARROW)), "Scroller", uStyle, rect, pParentWnd, nID) )
{




...............
//this->ModifyStyleEx(0,WS_EX_TRANSPARENT);



return TRUE;
}



return FALSE;
}
...全文
689 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
angelyeti 2007-01-05
  • 打赏
  • 举报
回复
onpaint
CDC *pDC = GetDC();
pDC->SetTextColor(RGB(255, 0, 0));
pDC->SetBkMode(TRANSPARENT);
pDC->DrawText("Hello", &m_rcOccupy, DT_CENTER);
ReleaseDC(pDC);
在某处调用:
COLORREF maskColor = RGB(0, 0, 0);
#define LWA_COLORKEY 0x00000001
#define WS_EX_LAYERED 0x00080000

typedef BOOL (WINAPI *lpfnSetLayeredWindowAttributes)(HWND hWnd,
COLORREF crKey,
BYTE bAlpha,
DWORD dwFlags);

lpfnSetLayeredWindowAttributes SetLayeredWindowAttributes;

HMODULE hUser32 = GetModuleHandle("user32.dll");
SetLayeredWindowAttributes = (lpfnSetLayeredWindowAttributes)GetProcAddress(hUser32,
"SetLayeredWindowAttributes");

SetWindowLong(GetSafeHwnd(),
GWL_EXSTYLE,
GetWindowLong(GetSafeHwnd(),
GWL_EXSTYLE) | WS_EX_LAYERED);

SetLayeredWindowAttributes(GetSafeHwnd(),
maskColor,
255,
LWA_COLORKEY);
不知行不行
angelyeti 2007-01-05
  • 打赏
  • 举报
回复
mark
leon19850102 2006-12-12
  • 打赏
  • 举报
回复
定义控件背景色,在OnCtlColor中啊
HBRUSH CXXXXDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
// TODO: Return a different brush if the default is not desired
int nID = pWnd->GetDlgCtrlID();
pDC->SetBkMode(OPAQUE);
if( nID ==IDC_EDIT_TEXT)
{pDC->SetBkColor(RGB(0,0,0));//控件背景色
pDC->SetTextColor( RGB( 255,255,255 ) );//控件前景色(文字)
return ::CreateSolidBrush(RGB(0,0,0));//控件底色
}
greenabc 2006-12-12
  • 打赏
  • 举报
回复
The black color only because of the bitmap that select into the memery DC ,the bitmap you create is fill with black at begin(mo ren).you can fill with other color include with NULL_BRUSH.
Remember the main cause you do with memery dc.
YangAnShun 2006-12-12
  • 打赏
  • 举报
回复
UP
对我有用。。。
stevphen 2006-12-11
  • 打赏
  • 举报
回复
OnPaint里处理,所谓透明就是什么都不画。
gcin2008 2006-12-11
  • 打赏
  • 举报
回复
楼主,方法都尽了,结帖吧,别枉费他人一番热心
三条猫 2006-10-13
  • 打赏
  • 举报
回复
不知道你是怎么试网上提供的方法的,要实现这个特效不难.

首先你要查看一下这个例子,就是利用BitBlt最后一个参数进行颜色的位操作,达到过滤一种颜色的程序.这样才能在显示你字幕的时候,不覆盖背景窗口的内容.(如果你看不懂网上的例子,建议你看看<<MFC Windows程序设计>>15章,里面有非常详细的描述和一个完整的例子)

还有你输出文字之前,要把文字的背景通过CDC::SetBkMode(TRANSPARENT);设置为透明色.
egxsun 2006-10-13
  • 打赏
  • 举报
回复
BOOL CGWnd::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
return TRUE;
}

CGWnd继承于CWnd
wangyekyo 2006-10-13
  • 打赏
  • 举报
回复
括号里的是"父类" 不是"父窗口"
打错了 :)
wangyekyo 2006-10-13
  • 打赏
  • 举报
回复
将控件背景色设为透明,就是不绘制背景色
捕捉ON_WM_ERASEBKGRND消息
添加消息处理函数afx_msg BOOL OnEraseBkgnd(CDC *pDC)
实现这个函数的时候直接返回TRUE;(不要调用父窗口的该函数)
就可以实现透明背景了
eww 2006-10-12
  • 打赏
  • 举报
回复
:(。。。。。。。
eww 2006-10-11
  • 打赏
  • 举报
回复
CDC::SetBkMode(TRANSPARENT)

这样是字看不见了可是背京还是黑的。。。。。。。。。。

Elysium 2006-10-11
  • 打赏
  • 举报
回复
CDC::SetBkMode(TRANSPARENT)
eww 2006-10-11
  • 打赏
  • 举报
回复
再说一下我的实现吧,可以有的兄弟没有理解到

我自定义一个控件:这个控件继承于CWnd,这个控件是一个滚动字幕

我把这个控件create到 一个窗口上时,这个控件的背景是黑的(如果我不定义颜色的话)

怎么能让这个控件透明? 网上的很多方法我都试了,不行。我现在又没地方上传源文件。所以....
eww 2006-10-11
  • 打赏
  • 举报
回复
我是在void CScrollerCtrl::OnPaint()
里画

CPaintDC dc(this); // device context for painting
static HBRUSH hNullBrush = (HBRUSH)GetStockObject(NULL_BRUSH);
::FillRect(dc, &rectClient, hNullBrush);

但是不行啊,还是黑色的。nnd
eww 2006-10-11
  • 打赏
  • 举报
回复
CPaintDC dc(this); // device context for painting
static HBRUSH hNullBrush = (HBRUSH)GetStockObject(NULL_BRUSH);
::FillRect(dc, &rectClient, hNullBrush);

都试了,不行:9
MLiang 2006-10-11
  • 打赏
  • 举报
回复
(HBRUSH)::GetStockObject(HOLLOW_BRUSH)
或者
(HBRUSH)::GetStockObject(NULL_BUSH)
eww 2006-10-11
  • 打赏
  • 举报
回复
是NULL_BRUSH吧?但是这个???怎么用?晕
eww 2006-10-11
  • 打赏
  • 举报
回复
NULL_BUSH ????有这个函数吗?我没找到啊。晕。
加载更多回复(4)

15,976

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧