| 发表于:2007-09-21 21:02:346楼 得分:0 |
这是解决方案. 我的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; } | | |
|