3827|5

71

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

window mobile中 static text控件透明问题 [复制链接]

  在非windows mobile 下一般通过修改消息映射函数WM_CTLCOLOR,返回一个HOLLOW_BRUSH实现背景透明,为何在window mobile下死活不行。
   Static text空间放在对话框上,对话框上通过StrchBit贴上了背景图,在非windows mobile下,通过在对话框类中加入WM_CTLCOLOR的消息响应函数
OnCtlColor(CDC*   pDC,   CWnd*   pWnd,   UINT   nCtlColor)     
{   
     HBRUSH   hbr   =   CDialog::OnCtlColor(pDC,   pWnd,   nCtlColor);   
   
     //   TODO:   Change   any   attributes   of   the   DC   here   

     if(nCtlColor   ==   CTLCOLOR_STATIC)     
     {   
         pDC->SetBkMode(TRANSPARENT);   //设置背景透明
          return   HBRUSH(GetStockObject(HOLLOW_BRUSH));   
     }  
}
是可以实现想要的效果的,但是在mobile下就不行了,根本不起作用,透出来的是对话框后的背景,(比如today的背景)很是奇怪。请求高手帮助。


   

最新回复

取得背景取错了呗  详情 回复 发表于 2009-10-20 12:00
点赞 关注

回复
举报

70

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
WINCE下,存在区别

这里有个DEMO:
[url=http://www.evccode.com/ch/ProductView.asp?ID=14][/url]

实现原理:
首先,获取背景位图,然后再重新贴图。

实现代码:
HBRUSH CLightSettingDlg::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 );
                //::StretchBlt(hMemDCCtrl, 0, 0, _W(rcCtrl), _H(rcCtrl), hMemDCBk, 0,0,20, 30, SRCCOPY );

                ::SelectObject(hMemDCCtrl, hBmOldCtrl );
                ::SelectObject(hMemDCBk, hBmOldBk );
               
                hBrushCtrl = ::CreatePatternBrush( hBmCtrl );

                DeleteObject( hBmCtrl );

                ::DeleteDC( hMemDCBk );
                ::DeleteDC( hMemDCCtrl );
                ::ReleaseDC( hWnd, hDC );
        }

        return hBrushCtrl;
}
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
非常感谢,我去试试。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

4
 
我找到了这个连接,解释了为何会出现这种情况,提供了一种备选方法。试过了是可行的。http://windowsmobiledn.com/qa-how-to-make-static-controls-transparent/
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用楼主 shiwuxuege 的回复:
? 在非windows mobile 下一般通过修改消息映射函数WM_CTLCOLOR,返回一个HOLLOW_BRUSH实现背景透明,为何在window mobile下死活不行。
? Static text空间放在对话框上,对话框上通过StrchBit贴上了背景图,在非windows mobile下,通过在对话框类中加入WM_CTLCOLOR的消息响应函数
OnCtlColor(CDC*? pDC,? CWnd*? pWnd,? UINT? nCtlColor)? ?
{?
? ? HBRUSH? hbr? =? CDialog::OnCtlColor(pDC,? pWnd,? nCtlColor);?
? ?
? ? //? TODO:? Change? any? attributes? of? the? DC? here?

? ? if(nCtlColor? ==? CTLCOLOR_STATIC)? ?
? ? {?
? ? ? ? pDC->SetBkMode(TRANSPARENT);? //设置背景透明
? ? ? ? ? return? HBRUSH(GetStockObject(HOLLOW_BRUSH));?
? ? }?
}
是可以实现想要的效果的,但是在mobile下就不行了,根本不起作用,透出来的是对话框后的背景,(比如today的背景)很是奇怪。请求高手帮助。


?


mobile 下的消息是这个
WM_CTLCOLORSTATIC
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

6
 
取得背景取错了呗
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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