CEdit自绘背景

CEdit背景自绘.
方案:
在CtlColor设置透明.
在OnEraseBkgnd自绘.
在OnEnChange使之无效.
代码如下.
C/C++ code
    
    
    
    
#pragma once // CBmpEdit class CBmpEdit : public CEdit { DECLARE_DYNAMIC(CBmpEdit) public : CBmpEdit(); virtual ~ CBmpEdit(); protected : DECLARE_MESSAGE_MAP() public : afx_msg HBRUSH OnCtlColor(CDC * pDC, CWnd * pWnd, UINT nCtlColor); afx_msg HBRUSH CtlColor(CDC * pDC, UINT nCtlColor); public : CBitmap m_Bitmap; CBrush m_Brush; afx_msg BOOL OnEraseBkgnd(CDC * pDC); afx_msg void OnEnChange(); };

响应WM_ERASEBKGND
C/C++ code
    
    
    
    
CBmpEdit::CBmpEdit() { m_Bitmap.LoadBitmap(IDB_BITMAP1); } BOOL CBmpEdit::OnEraseBkgnd(CDC * pDC) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CDC memDC; memDC.CreateCompatibleDC(pDC); memDC.SelectObject( & m_Bitmap); BITMAP m_Bmp; m_Bitmap.GetBitmap( & m_Bmp); CRect rect; GetClientRect( & rect); // 拉伸贴图 pDC -> StretchBlt( 0 , 0 ,rect.Width() ,rect.Height(), & memDC, 0 , 0 ,m_Bmp.bmWidth,m_Bmp.bmHeight,SRCCOPY); memDC.DeleteDC(); return TRUE; // return CEdit::OnEraseBkgnd(pDC); }

响应=WM_CTLCOLOR
C/C++ code
    
    
    
    
HBRUSH CBmpEdit::CtlColor(CDC * pDC, UINT nCtlColor) { // TODO: 在此更改 DC 的任何属性 // 透明 pDC -> SetBkMode(TRANSPARENT); // 字体色彩 pDC -> SetTextColor(RGB( 0 , 255 , 0 )); // 空的画笔 return (HBRUSH)GetStockObject(HOLLOW_BRUSH); // TODO: 如果默认的不是所需画笔,则返回另一个画笔 }

最后,
C/C++ code
    
    
    
    
void CBmpEdit::OnEnChange() { // 使无效 Invalidate(); }

这里需要注意的是,设置透明是在=WM_CTLCOLOR里设置的,不是在WM_CTLCOLOR中.

有=的是从父窗口反射回来的消息.当然也可以在父窗口的WM_CTLCOLOR中设置透明,不过这样就封装得不好了.


转帖:http://topic.csdn.net/u/20100813/15/3e7be209-19b4-40f6-b63f-87e3e182cdb1.html

你可能感兴趣的:(CEdit自绘背景)