学习之旅

一起进步,一起成长。
wince 静态控件实现透明色
//从背景图上得到控件的在背景图的位置的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;
}

posted on 2008-10-24 17:09  zuogang  阅读(1772)  评论(0编辑  收藏  举报