5787|9

64

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

Wince下DrawText与控件透明的问题 [复制链接]

基于对话框的程序里放了一个位图作为背景,上面放置了一个静态控件,这个静态控件的文字有时是要更新的,现在想要的就是不让静态控件的背景挡住对话框的位图,当然静态控件写的字可以看见.

自己解决方案想走三条路:
1.把静态控件透明,自己试了下,但不知使指定控件透明.
用下面的代码后,发现所有的static都变了,而且不是透明的.

if(message==WM_CTLCOLORSTATIC)
{
       
        HDC hdc=GetDlgItem(IDC_STATICControl)->GetDC()->GetSafeHdc();
        HDC   hdc1, mdc1;   
        hdc1 = GetDlgItem(IDC_Main)->GetDC()->GetSafeHdc();   
        mdc1 = CreateCompatibleDC(hdc1);  
        SetTextColor(hdc, RGB(0,0,0));                        
         BitBlt(hdc,0,0,100,50,mdc1,200,30,SRCCOPY
        SetBkMode(hdc, TRANSPARENT);                       
         return (int)GetStockObject(NULL_BRUSH);
}

2.DrawText的方法,下面这段代码在VC里面就可行,换到eVC下就不行了

CDC *pDC=this->GetDC();
pDC->SetBkMode(TRANSPARENT);
pDC->DrawText(_T("aaaaaa"),CRect(10,10,100,100),DT_SINGLELINE|DT_LEFT|DT_VCENTER);

3.再者就是换背景图片,也就是想把静态控件上的文字放到背景图片上来,这样要改的时候,就更换一下图片就行了.不过感觉这样有点麻烦,换背景图屏幕刷新厉害.

哪位有做过的话,指点下吧...多谢多谢
此帖出自WindowsCE论坛

最新回复

标记一下,弄了一天了,没弄好·~~ 唉  详情 回复 发表于 2009-11-17 20:18
点赞 关注
 

回复
举报

80

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
加我msn:guohualee@hotmail.com
此帖出自WindowsCE论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
TransparentBlt 就可以呀
此帖出自WindowsCE论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

4
 
我在OnPaint()
{
CPaintDC dc(this);
                dc.SetBkMode(TRANSPARENT);
                dc.SetTextColor(GROUP_TEXT_COLOR);                                                                                // 选择文本颜色
                dc.ExtTextOut(pt.x , pt.y , ETO_CLIPPED , &rctText , chText , NULL);
}
这样用可以呀.
此帖出自WindowsCE论坛
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

5
 
1982pc() :我这样不可以呀.有没有测试工程,我看一下.多谢了
happytrm@gmail.com
此帖出自WindowsCE论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

6
 
已经搞定了呵,多谢lenux()了.
此帖出自WindowsCE论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

7
 
这是解决方案.
我的Email:
happytrm@gmail.com


//从背景图上得到控件的在背景图的位置的brush,然后用这些brush来刷控件的背景
//OnCtlColorStatic是关于设static   control的背景色或文本色的,也可以做,但比较//复杂一些,涉及至CDC的问题.   
   

//.h
MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnCtlColorStatic )
HBRUSH GetBkBrush( HWND hWnd, UINT nID, HBITMAP hBmBk );
HBRUSH  m_hBrCtl[10];//刷子数组
//.cpp
        //界面美化
        m_hBmBkgnd = ::LoadBitmap(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDB_BT_S_SS_MAIN) );
        if( m_hBmBkgnd )
        {
                m_hBrCtl[0] = GetBkBrush( m_hWnd, IDC_SENDSMS_1, m_hBmBkgnd );
                m_hBrCtl[1] = GetBkBrush( m_hWnd, IDC_SENDSMS_2, m_hBmBkgnd );
                m_hBrCtl[2] = GetBkBrush( m_hWnd, IDC_SENDSMS_3, m_hBmBkgnd );
                m_hBrCtl[3] = GetBkBrush( m_hWnd, IDC_SENDSMS_4, m_hBmBkgnd );
                m_hBrCtl[4] = GetBkBrush( m_hWnd, IDC_SENDSMS_5, m_hBmBkgnd );
                m_hBrCtl[5] = GetBkBrush( m_hWnd, IDC_SENDSMS_6, m_hBmBkgnd );
                m_hBrCtl[6] = GetBkBrush( m_hWnd, IDC_SENDSMS_7, m_hBmBkgnd );
                m_hBrCtl[7] = GetBkBrush( m_hWnd, IDC_SENDSMS_8, m_hBmBkgnd );
                m_hBrCtl[8] = GetBkBrush( m_hWnd, IDC_SENDSMS_9, m_hBmBkgnd );
                m_hBrCtl[9] = GetBkBrush( m_hWnd, IDC_SENDSMS_10, m_hBmBkgnd );
        }
        else
        {
                m_hBrCtl[0] = NULL;
                m_hBrCtl[1] = NULL;
                m_hBrCtl[2] = NULL;
                m_hBrCtl[3] = NULL;
                m_hBrCtl[4] = NULL;
                m_hBrCtl[5] = NULL;
                m_hBrCtl[6] = NULL;
                m_hBrCtl[7] = NULL;
                m_hBrCtl[8] = NULL;
                m_hBrCtl[9] = NULL;
        }

        if(m_hBmBkgnd)
        {
                ::DeleteObject( m_hBmBkgnd );
                m_hBmBkgnd = NULL;
        }


LRESULT CSendSmsDlg::OnCtlColorStatic(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
        HDC hDCBtn = (HDC) wParam;
        HWND hWndCtrl = (HWND) lParam;
       
        UINT nID = ::GetDlgCtrlID( hWndCtrl );
       
        ::SetBkMode( hDCBtn, TRANSPARENT );
        ::SetTextColor(hDCBtn, RGB(255,255,255));
        switch( nID )
        {
        case IDC_SENDSMS_1:
                return (LRESULT)m_hBrCtl[0];
        case IDC_SENDSMS_2:
                return (LRESULT)m_hBrCtl[1];
        case IDC_SENDSMS_3:
                return (LRESULT)m_hBrCtl[2];
        case IDC_SENDSMS_4:
                return (LRESULT)m_hBrCtl[3];
        case IDC_SENDSMS_5:
                return (LRESULT)m_hBrCtl[4];
        case IDC_SENDSMS_6:
                return (LRESULT)m_hBrCtl[5];
        case IDC_SENDSMS_7:
                return (LRESULT)m_hBrCtl[6];
        case IDC_SENDSMS_8:
                return (LRESULT)m_hBrCtl[7];
        case IDC_SENDSMS_9:
                return (LRESULT)m_hBrCtl[8];
        case IDC_SENDSMS_10:
                return (LRESULT)m_hBrCtl[9];
        default:
                break;
        }
       
        return 0;
}


#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 CSendSmsDlg::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;
}



此帖出自WindowsCE论坛
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

8
 
MARK!
最近正好要用到这个,想法和楼主的最终解决方案一致,只是感觉实施起来有难度,正发愁呢,呵呵。
感谢楼主的分享!
此帖出自WindowsCE论坛
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

9
 
学习下!
此帖出自WindowsCE论坛
 
 
 

回复

48

帖子

0

TA的资源

一粒金砂(初级)

10
 
标记一下,弄了一天了,没弄好·~~
此帖出自WindowsCE论坛
 
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表