7886|27

72

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

EVC下对话框贴背景图后CStatic的设置透明背景问题?? [复制链接]

各位:
     用EVC做了一个对话框,并在OnPaint里给对话框贴了背景图,然后上面的控件(如CStatic)的背景还是原来标准对话框的背景,然后我又把CStatic控件的背景改为透明的,让其背景为对话框的图片,我想这样本应该就可以了呀,因为我在VC上也是这样做的,可是结果不一样,CStatic的背景确实是透明了,但它所在的整个区域的对话框都透明了,也就是显示的CStatic背景为桌面的图片了??请做过的朋友给些意见!!!谢谢!

最新回复

mark  详情 回复 发表于 2008-11-12 14:10
点赞 关注

回复
举报

80

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
我的做法是先得到CStatic在背景图中对应的区域的图片,做成一个刷子,
然后在OnCtlColor中设
::SetBkMode( hDCBtn, TRANSPARENT );

再返回对应CStatic的刷子。
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
能不能说具体些?!谢谢!
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

4
 
我发现我的问题就是:先把CStatic的背景改了,再贴的对话框的背景图,所以才会显示桌面的图片为CStatic的
背景。那我应该怎样才能把这个顺序给换一下呢??对于CStatic的透明处理我是在我的重载CStatic的类中。
希望指点!!!
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

5
 
你的对话框的背景图是在WM_PAINT中写的吗?

在WM_INITDIALOG中,
先得到CStatic在背景图中对应的区域的图片,做成一个刷子,
不用重载CStatic

使用WM_CTLCOLOR,
::SetBkMode(   hDCBtn,   TRANSPARENT   );
再返回对应CStatic的刷子。

 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

6
 
是的,我是在OnPaint里贴对话框的背景图的。重载不行吗?可是如果不重载,那要每个类都写类似的代码哦!
有点重复啊。好吧先试试你的方法再说了。谢谢!
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(中级)

7
 
TO * lenux:
     还是不行呀?!能否给个例子。谢谢!
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

8
 
使用WM_CTLCOLOR,
::SetBkMode(       hDCBtn,       TRANSPARENT       );

——————————————————————————————————————————就像lenux说的这样做
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

9
 
设置透明我已经实现了。问题是什么该区域所在的对话框也被设置为透明了
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(中级)

10
 
“先得到CStatic在背景图中对应的区域的图片,做成一个刷子”
——这步怎么实现
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

11
 

哎,这种代码是我在国外网站上找到的。 一直用的。
#define _X(x)        (x.left)
#define _Y(x)        (x.top)
#define _W(x)        (x.right - x.left)
#define _H(x)        (x.bottom - x.top)

//**************************************************************************************
//
//        GetBkBrush( HWND hWnd, UINT nID, HBITMAP hBmBk )
//  
//        Creates Background brush for the control specified by nID
//        according to its position in the parent dialog window.
//
//        hWnd [in]: Handle to the parent window
//  nID [in]: Control ID
//  hBmBk [in]: Bitmap handle of the parent dialog's background image
//
//
//**************************************************************************************

HBRUSH GetBkBrush( HWND hWnd, UINT nID, HBITMAP hBmBk )
{
        HWND hWndCtrl;
       
        hWndCtrl = ::GetDlgItem( hWnd, nID );
       
        HBRUSH        hBrushCtrl = NULL;
       
        if( NULL != hWndCtrl )
        {
                RECT rcCtrl;
               
                ::GetWindowRect( hWndCtrl, &rcCtrl );
                ::ScreenToClient(hWnd, (LPPOINT)&rcCtrl);
                ::ScreenToClient(hWnd, ((LPPOINT)&rcCtrl)+1);
               
                HDC hDC = ::GetDC(hWnd);
               
                HDC hMemDCBk = CreateCompatibleDC( hDC );
                HDC hMemDCCtrl = CreateCompatibleDC( hDC );
               
                HBITMAP hBmCtrl = CreateCompatibleBitmap( hDC, _W(rcCtrl), _H(rcCtrl) );
               
                HBITMAP hBmOldBk;
                HBITMAP hBmOldCtrl;
               
                hBmOldBk = (HBITMAP) ::SelectObject( hMemDCBk, hBmBk );
                hBmOldCtrl = (HBITMAP) ::SelectObject( hMemDCCtrl, hBmCtrl );
               
                ::BitBlt( hMemDCCtrl, 0, 0, _W(rcCtrl), _H(rcCtrl), hMemDCBk, _X(rcCtrl), _Y(rcCtrl), SRCCOPY );
               
                ::SelectObject(hMemDCCtrl, hBmOldCtrl );
                ::SelectObject(hMemDCBk, hBmOldBk );
               
                hBrushCtrl = ::CreatePatternBrush( hBmCtrl );
               
                DeleteObject( hBmCtrl );
               
                ::DeleteDC( hMemDCBk );
                ::DeleteDC( hMemDCCtrl );
                ::ReleaseDC( hWnd, hDC );
        }
       
        return hBrushCtrl;
}


使用例子:
m_hBmBkgnd = ::LoadBitmap( _Module.GetResourceInstance(), MAKEINTRESOURCE(IDB_BT_NEWADD) );
        if( m_hBmBkgnd )
        {
                m_hBrCtl[0] = GetBkBrush( m_hWnd, IDC_ADD_NAME, m_hBmBkgnd );
                m_hBrCtl[1] = GetBkBrush( m_hWnd, IDC_ADD_MOBILE, m_hBmBkgnd );
                m_hBrCtl[2] = GetBkBrush( m_hWnd, IDC_ADD_WORK, m_hBmBkgnd );
                m_hBrCtl[3] = GetBkBrush( m_hWnd, IDC_ADD_HOME, m_hBmBkgnd );
                m_hBrCtl[4] = GetBkBrush( m_hWnd, IDC_ADD_OTHER, m_hBmBkgnd );
        }
        else
        {
                m_hBrCtl[0] = NULL;
                m_hBrCtl[1] = NULL;
                m_hBrCtl[2] = NULL;
                m_hBrCtl[3] = NULL;
                m_hBrCtl[4] = NULL;
        }

LRESULT OnCtlColorStatic(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
        HDC hDCBtn = (HDC) wParam;
        HWND hWndCtrl = (HWND) lParam;
       
        UINT nID = ::GetDlgCtrlID( hWndCtrl );
       
        ::SetBkMode( hDCBtn, TRANSPARENT );
        switch( nID )
        {
        case IDC_ADD_NAME:
                return (LRESULT)m_hBrCtl[0];
        case IDC_ADD_MOBILE:
                return (LRESULT)m_hBrCtl[1];
        case IDC_ADD_WORK:
                return (LRESULT)m_hBrCtl[2];
        case IDC_ADD_HOME:
                return (LRESULT)m_hBrCtl[3];
        case IDC_ADD_OTHER:
                return (LRESULT)m_hBrCtl[4];
        default:
                break;
        }
       
        return 0;
}
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

12
 
# lenux:

     你真是太热心了。非常感谢!!
     我得更加努力了。基础的东西还好多要学的。在VC/EVC,我最不会用的就是关于画刷、贴图,应该说是
关于GDI方面的。越来越发现VC真的很强大。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

13
 
-_-0
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

14
 
哎,其实给你代码不是我希望的学习方法。
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

15
 
呵呵……我会慢慢研究。其实看别人的代码,可以学到好多东西。你应该比我更有经验了……谢谢
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

16
 
lenux
请问你用你的方法实现了static透明了吗?
OnCtlColorStatic是怎么响应的呢?
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

17
 
Mark!
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

18
 
OnCtlColorStatic就是
WM_CTLCOLORSTATIC消息的响应。
mfc中可能是WM_CTLCOLOR吧。
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

19
 
呵呵,我的已经实现了。还得多谢lenux啊。
TO huangtaoyuan:
    就按lenux的方法试用下,能实现的。

TO lenux:
    你是否实现过在EVC下重载一个CStatic类,来实现这个功能呢?
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

20
 
没有试过继承出一个子类
有时间可以尝试一下。
放假了,
人心散了,
节后再说了。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表