首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 如何去掉ICON的显示的背景色(我的ICON本来没有背景色的) [已结贴,结贴人:greatws]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 13:50:10 楼主
    我的TabCtrl用了一个Child对话框作为一页,用了OnEraseBkgnd然后return TRUE使其背景透明。
    然后在上面放一个图标,我用了CStatic::SetIcon,可是背景不是透明的,是windows默认对话框的那种灰黄色,后来用了如下代码
    C/C++ code
    HBRUSH CDlg::OnCtlColor(CDC *pDC,CWnd* pWnd ,UINT nCtlColor) { HBRUSH hbr=CDialog::OnCtlColor(pDC,pWnd,nCtlColor); if(CTLCOLOR_STATIC == nCtlColor && pWnd->GetDlgCtrlID() == IDC_PIC) { pDC->SetBkMode(TRANSPARENT); return (HBRUSH)GetStockObject(HOLLOW_BRUSH); } return hbr; }


    结果ICON的背景变为黑色

    有什么办法使ICON透明呢?就只有使用MFC对话框向导的方法SendMessage(WM_ICONERASEBKGND, reinterpret_cast <WPARAM>(dc.GetSafeHdc()), 0);然后CPaintDC::DrawIcon吗?

    测试工程我放到了附件里,不明白意思的可以下载看一下
    该帖包含附件:http://dl2.csdn.net/down4/20080506/06133902885.rar
    200  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    发表于:2008-05-06 13:57:311楼 得分:0
    下载不了代码。
    你再确认一下Icon是不是透明背景,把图标文件复制到桌面上就可以看出来。
    另外,你的static控件是怎么创建的?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    发表于:2008-05-06 13:58:092楼 得分:0
    还有static控件的风格是SS_ICON吗?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    发表于:2008-05-06 14:01:233楼 得分:0
    我用SPY++查了一下static控件的风格,应该是WS_CHILDWINDOW ¦WS_VISIBLE ¦SS_ICON,你用SPY++确认一下控件风格。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 16:31:084楼 得分:0
    没错,是你说的那3种风格

    换个地方下载testui.rar
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    发表于:2008-05-06 16:45:435楼 得分:0
    看过了,我把OnCtlColor中的下列代码注释掉就可以了。
        if(CTLCOLOR_STATIC == nCtlColor &&  pWnd->GetDlgCtrlID() == IDC_PIC) 
        {
             pDC->SetBkMode(TRANSPARENT);
             
             return (HBRUSH)GetStockObject(HOLLOW_BRUSH); 
        }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 17:06:596楼 得分:0
    找个适当的地方
    ::DrawIcon
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 18:15:597楼 得分:0
    不行啊cnzdgs,我说的是XP样式,如果用2000样式是没有问题的,因为颜色一样。XP样式就出问题了,如图

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    发表于:2008-05-06 22:22:378楼 得分:0
    我下载你的代码无法打开工程文件,所以我是自己创建了一个非Unicode项目,然后把你的代码复制进去来测的,所以没看到问题。

    你把
    return (HBRUSH)GetStockObject(HOLLOW_BRUSH);
    改成
    return 0;
    就可以了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    发表于:2008-05-06 22:26:019楼 得分:0
    另外,ShowWindow(TRUE)和ShowWindow(FALSE)最好该成ShowWindow(SW_SHOW)和ShowWindow(SW_HIDE),因为ShowWindow的参数不是BOOL型。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-07 09:32:4910楼 得分:0
    改成return 0; 仔细看一下,背景是白色的,还是不行啊。麻烦cnzdgs再想想办法

    ShowWindow(TRUE)这里是我疏忽了,想成EnableWindow的参数了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-07 10:49:4311楼 得分:0
    其实产生这个问题的根本原因是在
    BOOL CDlg::OnEraseBkgnd(CDC* pDC)
    {
    return TRUE;
    }
    应该取TAB的背景色填充DLG,或者填充STATIC
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-07 11:35:5112楼 得分:70
    HTHEME hTheme = OpenThemeData(AfxGetMainWnd()->GetSafeHwnd(), _T("TAB"));
    if (hTheme)
    {
    //DrawThemeBackgroundEx(hTheme, pDC->GetSafeHdc(), TABP_PANE, 0, client, NULL);
    COLORREF color=0;
    HRESULT hr = GetThemeColor(hTheme, TABP_PANE, 0, TMT_FILLCOLORHINT, &color);
    CloseThemeData(hTheme);
    return CreateSolidBrush(color);
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-07 12:43:2313楼 得分:0
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-07 12:43:5714楼 得分:0
    在资源编辑器中打开那个ICON,全选删除 (删除ICON的前景像素),然后编译运行看看效果
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    发表于:2008-05-07 15:03:0015楼 得分:110
    出现这种情况的原因是你将子对话框处理成了透明背景,而子对话框后面是Tab控件,必须取得Tab控件所填充的颜色作为static控件的颜色才行。可以按下面方法处理:
    C/C++ code
    HBRUSH CDlg::OnCtlColor(CDC *pDC, CWnd* pWnd, UINT nCtlColor) { if (nCtlColor == CTLCOLOR_STATIC) { return CreateSolidBrush(pDC->GetPixel(0, 0)); } return CDialog::OnCtlColor(pDC, pWnd, nCtlColor); }

    顺便再提一下,最好不要把子对话框做成透明,如果要使用XP样式,最好是用CPropertySheet和CPropertyPage。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-07 15:48:2016楼 得分:20
    我测试了一下,如果默认不对对话框背景色进行处理,没有问题;
    如果你改变了对话框的背景色,那么这个icon图片后面还是灰色,与周边的环境不一致,即使设置了static为透明,也只是把icon后面这一块设置成黑色;

    实在不行就使用gdi+ Draw上去吧。不难:

    C/C++ code
    CString strIconPath("icon.ico"); Graphics graphics(::GetDC(GetDlgItem(IDC_PIC)->m_hWnd)); Image image(strThemePicPath.AllocSysString()); graphics.DrawImage(&image, 0, 0);


    或者
    C/C++ code
    Graphics graphics(::GetDC(GetDlgItem(IDC_PIC)->m_hWnd)); Image image(L"icon.ico"); graphics.DrawImage(&image, 0, 0);
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-07 16:12:2117楼 得分:0
    搞定了,谢谢cnzdgs,至于你说不把字对话框搞成透明,可以采用cofanz的方法,从主题中取内容,然后画上

    C/C++ code
    void CDlg::OnPaint() { CPaintDC dc(this); HTHEME hTheme = OpenThemeData(AfxGetMainWnd()->GetSafeHwnd(), _T("TAB")); RECT rcdlg; ::GetClientRect(m_hWnd,&rcdlg); DrawThemeBackground(hTheme,dc,TABP_BODY,0,&rcdlg,NULL); CDialog::OnPaint(); }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-07 17:46:2718楼 得分:0
    温馨提示:选择汉唐,像为您的企业选择了一名全程诊断服务医生! 全程式诊断服务如下:公司写字楼选址或推荐选址,内外资公司注册,会计代理记帐,公司年检,公司运营过程中遇到的疑难杂症等! 汉唐将根据您的具体情况为您量身制定合理、贴切、便捷、高效的公司运营方式! 
    近期心愿: 选择汉唐,选择真诚的合作伙伴!
    联系方式:O①O-⑧④④⑥⑥④④⑤ 刘小姐
    QQ:553813117
    我的博客:http://i.cn.yahoo.com/05654311083
    公司网站:http://www.zhucestar.com/
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 07:55:3519楼 得分:0
    用 DrawIcon 可以把 .ico 文件,直接畫成透明的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bjsun
    • 等级:
    发表于:2008-05-08 09:05:5820楼 得分:0
    该回复于2008-05-08 09:30:18被版主删除
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dxkh
    • 等级:
    发表于:2008-05-08 18:17:5421楼 得分:0
    学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 20:15:3822楼 得分:0
    xue xi
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 21:00:1223楼 得分:0
    学习~学习~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 22:01:5924楼 得分:0
    换个透明的图标啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zzwu
    • 等级:
    发表于:2008-05-08 22:31:3425楼 得分:0
    当通过ImasgeList来使用某个设计好的Icon时,
    可以利用它的transparent color参数来指定
    Icon的某一种颜色为透明色,这种颜色就看不到。
    如果指定的颜色不是Icon的具有的颜色,则Icon整个不透明。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jinghao666666
    • 等级:
    发表于:2008-05-11 15:32:5926楼 得分:0
    引用 23 楼 yoyo00oo00 的回复:
    学习~学习~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 09:22:1627楼 得分:0
    ***************************************************************************

    思想决定行动,行动决定习惯,习惯决定命运.
    程序员在深圳QQ群,交流产生思想碰撞.

    部份专业群:
    程序员在深圳c++群15195967
    程序员在深圳英语学习群:23864353
    程序员在深圳c++Ⅱ17409451
    程序员在深圳嵌入式开发群37489763
    程序员在深圳移动开发群31501597
    程序员在深圳创业群33653422

    部份高级程序员群:
    高级群I:17538442
    高级群II:7120862

    部份初、中级程序员群:
    第三群:2650485
    第五群:29537639
    第四群:28702746
    第六群:10590618
    第七群:10543585
    第八群:12006492
    第九群:19063074
    第十群:2883885
    第十一群:25460595
    第十二群:9663807

    深圳程序员QQ群联盟成立三年多,拥有三十个以上的QQ群,人数超二千多人,大量经验丰富的老手,成员从业于大公司(如微软、IBM,SUN,华为)、来自国内著名高校和研究院成员,和有丰富实践经验的高级程序员、系统分析员(包括参加过上亿元的项目的架构师),有很热爱技术的成员(包括自己写过嵌入式操作系统),还有少数女程序员。推荐:深程高级群I:17538442 深程高级群II:7120862 (深程高级群不欢迎新手,如果在深圳,月薪6K以下的别加入) c++:15195967  mobile:31501597嵌入式:37489763  
    —————————————————————————————————————————— 
    群内交流解决问题的方法,一般难以直接得到答案,问题的解决还是要靠自己。(授之以渔与授之以鱼的关系)。
    *****************************************************************************
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 09:22:3728楼 得分:0
    ***************************************************************************

    思想决定行动,行动决定习惯,习惯决定命运.
    程序员在深圳QQ群,交流产生思想碰撞.

    部份专业群:
    程序员在深圳c++群15195967
    程序员在深圳英语学习群:23864353
    程序员在深圳c++Ⅱ17409451
    程序员在深圳嵌入式开发群37489763
    程序员在深圳移动开发群31501597
    程序员在深圳创业群33653422

    部份高级程序员群:
    高级群I:17538442
    高级群II:7120862

    部份初、中级程序员群:
    第三群:2650485
    第五群:29537639
    第四群:28702746
    第六群:10590618
    第七群:10543585
    第八群:12006492
    第九群:19063074
    第十群:2883885
    第十一群:25460595
    第十二群:9663807

    深圳程序员QQ群联盟成立三年多,拥有三十个以上的QQ群,人数超二千多人,大量经验丰富的老手,成员从业于大公司(如微软、IBM,SUN,华为)、来自国内著名高校和研究院成员,和有丰富实践经验的高级程序员、系统分析员(包括参加过上亿元的项目的架构师),有很热爱技术的成员(包括自己写过嵌入式操作系统),还有少数女程序员。推荐:深程高级群I:17538442 深程高级群II:7120862 (深程高级群不欢迎新手,如果在深圳,月薪6K以下的别加入) c++:15195967  mobile:31501597嵌入式:37489763  
    —————————————————————————————————————————— 
    群内交流解决问题的方法,一般难以直接得到答案,问题的解决还是要靠自己。(授之以渔与授之以鱼的关系)。
    *****************************************************************************
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 10:19:3029楼 得分:0
    想了解更多IT技术,请登陆:http://www.ciitc.com
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    世纪乐知(北京)网络技术有限公司 版权所有 京 ICP 证 020026 号
    Copyright © 2000-2007, CSDN.NET, All Rights Reserved