我用HOOK子类化一个静态文本控件,我的继承自CStatic静态文本控件的类,下面是我的CPP文件代码,绘制是正常的。但是有其他窗口在静态文本控件上拖动时就会显示出灰色的背景,然后才会绘制出。想通过响应WM_ERASEBKGND消息来让它不擦除背景。但是就是不响应WM_ERASEBKGND消息。OnEraseBkgnd函数从未执行过,请求帮助!!!#include "../stdafx.h"
#include "SkinStatic.h"#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CStaticCSkinStatic::CSkinStatic()
{
}CSkinStatic::~CSkinStatic()
{
if(m_pbmpOldBk) m_dcBk.SelectObject(&m_pbmpOldBk);
m_bmpBk.DeleteObject();
if(m_dcBk.m_hDC) m_dcBk.DeleteDC();
}
BEGIN_MESSAGE_MAP(CSkinStatic, CStatic)
//{{AFX_MSG_MAP(CSkinStatic)
ON_WM_ERASEBKGND()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// CStatic message handlers
//添加Owner Draw属性
void CSkinStatic::PreSubclassWindow() 
{
// TODO: Add your specialized code here and/or call the base class
ModifyStyle(0, BS_OWNERDRAW);
CStatic::PreSubclassWindow();
}BOOL CSkinStatic::OnEraseBkgnd(CDC* pDC)
{
AfxMessageBox("执行了!");
Draw(pDC);
return TRUE;
}void CSkinStatic::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
int nSaveDC=pDC->SaveDC();
Draw(pDC);
pDC->RestoreDC(nSaveDC);
}void CSkinStatic::Draw(CDC *pDC)
{
CRect rect;
CRect rect1; GetClientRect(rect);
GetWindowRect(rect1);
GetParent()->ScreenToClient(rect1); if (m_dcBk.m_hDC == NULL)//父窗口背景没取到,则取
{
m_dcBk.CreateCompatibleDC(&g_DlgBkmemDC);
m_bmpBk.CreateCompatibleBitmap(&g_DlgBkmemDC, rect.Width(), rect.Height());
m_pbmpOldBk = m_dcBk.SelectObject(&m_bmpBk);
m_dcBk.BitBlt(0, 0, rect.Width(), rect.Height(), &g_DlgBkmemDC, rect1.left, rect1.top, SRCCOPY);
} //建立临时内存设备
    CDC dcMem;
    dcMem.CreateCompatibleDC(pDC);
    CBitmap bk,*pOldbk;
    bk.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
    pOldbk=dcMem.SelectObject(&bk);
//将父窗口背景复制到临时内存设备
    dcMem.BitBlt(0,0,rect.Width(),rect.Height(),&m_dcBk,0,0,SRCCOPY);
    //在临时内存设备中绘制按钮
// 取得文本 
CString szText; 
GetWindowText(szText); 
// 取得字体,并选入设备文件 
CFont *pFont, *pOldFont; 
pFont = GetFont(); 
pOldFont = dcMem.SelectObject(pFont); 
// 用透明背景填充设备文件 
dcMem.SetBkMode(TRANSPARENT); 
// 显示文字 
dcMem.SetTextColor(pDC->GetTextColor());
dcMem.DrawText(szText, rect, DT_SINGLELINE|DT_LEFT|DT_VCENTER);
// 清除字体 
dcMem.SelectObject(pOldFont);
//真正将内存设备中绘制好的按钮绘制到屏幕上
    pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,SRCCOPY); bk.DeleteObject();
dcMem.SelectObject(pOldbk);
dcMem.DeleteDC();
}

解决方案 »

  1.   

    调用INVALIDATE一下能否让它重绘来执行背景擦除呢
    通过获得它的ID来执行
      

  2.   

    我是HOOK后子类化这个控件的。不可以用ID的。我同样的方法用在窗口控件或者是按钮控件上就有效。用在静态文本控件和分组框控件上就无效。
      

  3.   

    哦,那是因为你必须修改它们的控件ID,不能让他们的ID为ID_STATIC
      

  4.   

    补充说明:我的程序是用PB写的。另外是已经写好的。我是想换肤的。所以你们说的改ID不可能的吧。