日志文章

2008年05月09日 13:38:37

EVC中透明控件的实现

本文从创建一个工程开始详细说明如何用EVC实现WINCE应用程序下的透明控件(这里实现按钮和STATIC)。
1.     新建一个MFC对话框工程取名TransButton
2.     ResourceView处插入一背景图片IDB_BITMAP1
3.     在对话框中拉4个控件:两个按钮,两个STATIC
4.     增加TransButtonDlg.h文件中增加如下3个类成员
HBRUSH GetBkBrush( HWND hWnd, UINT nID, HBITMAP hBmBk );
HBITMAP m_hBmBkgnd; // 对话框背景图片
HBRUSH m_hBrCtl[2]; // 控件背景画刷
5.     TransButtonDlg.cpp中增加GetBkBrush()的实现
HBRUSH CTransButtonDlg::GetBkBrush( HWND hWnd, UINT nID, HBITMAP hBmBk )
{
#define _X(x) (x.left)
#define _Y(x) (x.top)
#define _W(x)     (x.right - x.left)
#define _H(x) (x.bottom - x.top)
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;
}
6.     OnInitDialog()中增加下面一段截取控件所在部分的图片:
m_hBmBkgnd=::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP1) );
if( m_hBmBkgnd )
{
    m_hBrCtl[0]=GetBkBrush(GetSafeHwnd(),IDC_BUTTON_TEST1, m_hBmBkgnd );
    m_hBrCtl[1]=GetBkBrush(GetSafeHwnd(),IDC_STATIC_TEST1,m_hBmBkgnd );
}
7.     增加WM_PAINT的处理函数,并在函数中增加画背景的部分(OnPaint()函数)
CDC memDC;
CBitmap bmBkgnd;
bmBkgnd.Attach( m_hBmBkgnd );


memDC.CreateCompatibleDC(&dc);
CBitmap *pOldBm = memDC.SelectObject( &bmBkgnd );


BITMAP bm;
bmBkgnd.GetObject(sizeof(bm), &bm);



dc.BitBlt(0, 0, bm.bmWidth, bm.bmHeight, &memDC, 0, 0, SRCCOPY );
memDC.SelectObject( pOldBm );
bmBkgnd.Detach();
8.     增加WM_CTLCOLOR的处理函数,并在其中增加画控件背景的部分:
if(pWnd->GetDlgCtrlID()   ==   IDC_BUTTON_TEST1 )
{
    pDC->SetTextColor(RGB(255, 0, 0));
    pDC->SetBkMode( TRANSPARENT ) ;
    return m_hBrCtl[0];
}
else if(pWnd->GetDlgCtrlID()   ==   IDC_STATIC_TEST1)
{
        pDC->SetTextColor(RGB(255, 0, 0));
    pDC->SetBkMode( TRANSPARENT ) ;
    return m_hBrCtl[1];
}
9.     编译链接
10.   运行后的图片如下:



源码下载:TransButton.rar
TransButton.rar


类别: 技术文章 |  评论(4) |  浏览(2966) |  收藏
4楼 [匿名]cat 2008年10月30日 20:16:28 Says:
thinks
3楼 [匿名]guest 2008年10月23日 23:12:08 Says:
由衷地感谢,我做这个好几天了,都没有弄出来
2楼 [匿名]KOPP0725 2008年07月25日 14:18:41 Says:
KOPP0725
vhyu6v
[url=http://itemrate.com]wow gold[/url]
[url=http://www.oforu.com]wow gold[/url]
[url=http://www.oforu.com/Faq.aspx]wow gold[/url]
[url=http://www.oforu.com/Power.1.World_of_Warcraft_US.aspx]wow gold[/url]
[url=http://www.wow-account.net]buy wow account[/url]
[url=http://www.wow-account.net]wow account[/url]
[url=http://www.wow-account.net]wow accounts[/url]
[url=http://www.wow-account.net]buy wow accounts[/url]
[url=http://www.wow-accounts.org]buy wow account[/url]
[url=http://www.wow-accounts.org]wow account[/url]
[url=http://www.wow-accounts.org]wow accounts[/url]
[url=http://www.wow-accounts.org]buy wow accounts[/url]
[url=http://www.iae-longre.com/]留学[/url]
[url=http://www.iae-longre.com/country/UK/]英国留学[/url]
[url=http://www.iae-longre.com/country/UK/]留学英国[/url]
[url=http://www.iae-longre.com/country/fra/]法国签证[/url]
[url=http://www.iae-longre.com/news/2007/6-8/134528.html]澳洲签证[/url]
[url=http://acctstore.com]wow account[/url]
[url=http://accountsbay.com]wow account[/url]
[url=http://www.oforu.com/Cheap.001.Final_Fantasy_XI.Server.aspx]wow gold[/url]
[url=http://www.oforu.com/PLindex.aspx]wow gold[/url]
[url=http://www.oforu.com/Sitemap.htm]wow gold[/url]
[url=http://www.oforu.com/Cheap.065.Age_of_Conan_-_US.aspx]wow gold[/url]
[url=http://www.oforu.com/Power.019.World_of_Warcraft_-_EU.aspx]wow gold[/url]
[url=http://www.oforu.com/Cheap.007.Guild_Wars.aspx]wow gold[/url]
[url=http://www.oforu.com/AboutUs.aspx]wow gold[/url]
[url=http://www.oforu.com/Cheap.030.Lord_of_the_Rings_Online.aspx]wow gold[/url]
[url=http://www.oforu.com/Cheap.006.Rose_Online.aspx]wow gold[/url]
[url=http://www.oforu.com/Cheap.051.Ultima_Online.aspx]wow gold[/url]
[url=http://www.oforu.com/Cheap.002.Ever_Quest_2.aspx]wow gold[/url]
[url=http://www.oforu.com/Cheap.031.Sword_of_the_new_world.aspx]wow gold[/url]
[url=http://www.oforu.com/Cheap.008.City_of_Villains.aspx]wow gold[/url]
[url=http://www.oforu.com/Cheap.029.Scions_of_Fate.aspx]wow gold[/url]
[url=http://www.oforu.com/Cheap.011.Star_Wars_Galaxies.aspx]wow gold[/url]
[url=http://www.oforu.com/Cheap.014.Maple_Story.aspx]wow gold[/url]
[url=http://www.oforu.com/Cheap.009.Ever_Quest.aspx]wow gold[/url]
[url=http://www.oforu.com/Power.030.Lord_of_the_Rings_Online.aspx]wow gold[/url]
[url=http://loxlive.com]wow gold[/url]
[url=http://kunhill.com]wow gold[/url]
[url=http://gtpls.com]wow gold[/url]
[url=http://dinkloyal.com]wow gold[/url]
[url=http://wowmine.org]wow gold[/url]
[url=http://loxbird.com]wow gold[/url]
[url=http://guy4game.net]wow gold[/url]
1楼 [匿名]qwe78oi 2008年07月08日 10:30:14 Says:
qwe78oi jkfl90kl wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold buy AoC gold buy AoC gold buy AoC gold buy AoC gold buy AoC gold 洗涤机械设备 洗涤机械设备 全封闭干洗机 全封闭干洗机 修鞋擦鞋 修鞋擦鞋 干洗店 干洗店 PDM PDM PLM PLM 修鞋加盟 修鞋加盟 wow gold wow gold wow gold wow gold wow gold wow gold wow gold
发表评论
看不清楚,换一张