我一步一步讲解。既为了让您能看懂我的问题,也给初学者扫扫盲。1 带背景图案,这很简单,我重载了OnEraseBkGnd(对话框程序重载此消息,需要到ClassWizard的ClassInfo卡中修改MessageFilter为Window)
BOOL CFx2TestDlg::OnEraseBkgnd(CDC* pDC) 
{
CDC MemDC;
HBITMAP hBitmap=(HBITMAP)LoadImage(NULL,"bg.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
CBitmap *pBitmap = new CBitmap;
pBitmap->Attach(hBitmap);   
MemDC.CreateCompatibleDC(pDC); 
CBitmap *pOldBitmap=MemDC.SelectObject(pBitmap);
pDC->BitBlt(0, 0,800,800, &MemDC, 0, 0, SRCCOPY); 
pBitmap->Detach();
delete pBitmap; 
pDC->SelectObject(pOldBitmap);
return true;
 
}2 要背景透明,在OnInitDialog中使用
CDC *pDC=GetDC();
pDC->SetBkMode(TRANSPARENT);
但无效。后来在论坛上问的,应该酱紫:
重载OnCtlColor,将其内容删除,改为这样:
if(nCtlColor == CTLCOLOR_STATIC) 
{
pDC->SetBkMode(TRANSPARENT); 
}
return HBRUSH(GetStockObject(HOLLOW_BRUSH));
的确,可以看到,对话框上面的CStatic都已经透明了。但是一旦修改了CStatic的关联变量,比如修改m_Str="anotherValue";然后UpdateData(False)
那么刚才显示的,和现在显示的就重叠起来。
除非你Invalidate这个区域。问题就是酱紫了。不知道我是否描述得足够清楚。
因为我需要频繁刷新这个区域,我嫌Invalidate效率低下,而且看得出来程序界面一动一动的,
很不爽。
不知道谁有解决方法。
或者把我的程序推倒重来也行,只要能让“带背景图案的对话框上:如何CStatic文字的背景透明”。感谢,58分尽数奉上

解决方案 »

  1.   

    修改框架无用
    那个是字体的颜色
    证明 cs是CStatic
    Create("abccd",SS_OWNERDRAW|WS_CHILD|WS_VISIBLE,CRect(0,0,200,500),this);
    void CS::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
    { // TODO:  添加您的代码以绘制指定项
    CDC dc;
    dc.Attach(lpDrawItemStruct->hDC);
    dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
    dc.SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
    dc.TextOut(0,0,"abcdd");
    dc.Detach();
    }
    就是蓝底dc.SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
    如果字不复杂就画个 这个你会
    复杂的话可能CFont问别人去吧
      

  2.   

    不Invalidate,在OnEraseBkgnd中用FillRect擦掉背景重来.
    试试.
      

  3.   

    首先对你们的回复表示感谢不过看了前两个回复我真想去撞墙。我的理解力是不是出了问题?真的看不懂to lanhanNO_1(lanhanNO_1)
    我不是要设置字体颜色啊。
    这个为什么要重载控件?
    “把字贴在图上去颜色?”实在看不懂,能不能详细点?
      

  4.   

    BOOL CcdsDlg::OnEraseBkgnd(CDC* pDC)
    {
    // TODO: 在此添加消息处理程序代码和/或调用默认值 //return CDialog::OnEraseBkgnd(pDC);
    CDC MemDC;
    HBITMAP hBitmap=(HBITMAP)LoadImage(NULL,"bg.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
    CBitmap *pBitmap = new CBitmap;
    pBitmap->Attach(hBitmap);   
    MemDC.CreateCompatibleDC(pDC); 
    CBitmap *pOldBitmap=MemDC.SelectObject(pBitmap);
    pDC->BitBlt(0, 0,800,800, &MemDC, 0, 0, SRCCOPY); 
    pBitmap->Detach();
    delete pBitmap; 
    pDC->SelectObject(pOldBitmap);
    pDC->SetBkMode(TRANSPARENT);////////////////////
    pDC->TextOut(0,100,"abccd");/////////////////////////
    return true;}第一次接触SetBkMode,不好意识
    上面说的是MemDC.TextOut显示在MemDC
    再去掉MemDC上特殊的颜色的方法都是想像中的
      

  5.   

    谢谢你懒汉
    但是你这样做就很麻烦了,如果要改变显示的文字,岂不是相当麻烦。首先你这儿的TextOut应该接收传入参数,
    而且每次要显示都要Invalidate全部(不然不会OnEraseBkGnd啊)
      

  6.   

    能不能在OnErase方法里面SetBKMode(Transparent)啊?
      

  7.   

    谢谢回复
    我试过,不行。在帖图的对话框上使用SetBKMode(Transparent),CStatic不是透明的
      

  8.   

    下面是我试过的
    class CS : public CStatic
    void CS::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
    { // TODO:  添加您的代码以绘制指定项
    CDC dc;
    dc.Attach(lpDrawItemStruct->hDC);
    dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHT));
    dc.SetBkMode(TRANSPARENT);
    dc.TextOut(0,0,"abcdkjj");
    dc.Detach();
    }
    m_cs.Create("abccd",SS_OWNERDRAW|WS_CHILD|WS_VISIBLE,CRect(0,0,200,500),this);
    不是完整的程序但CStatic是透明地
    准确的说他不是CStatic
    应该是说和标准不一样的都不是原来的东西用Custom方法应该最好
      

  9.   

    LZ,你这个问题我也遇到过的, 给你看一个东西,完美解决方案.
    别人的问题:
    请问static控件设置透明后,再更改文字时会与之前的文字覆盖,怎么解决 
    用pDC->SetBkMode(TRANSPARENT);
    设置透明后,要改变控件的文字就会发生文字重叠,如果不使用透明就不会,请问在透明状态下改变文字如何不发生重叠?地址:
    核心语句是这句: 
    在给static 设置新的文本之后(不是之前!)刷新父窗口。
    GetDlgItem(IDC_STATIC)->GetParent()->RedrawWindow(); 
    http://blog.vckbase.com/hatemath/archive/2005/08/04/10485.aspx
      

  10.   

    this solve the problem
    http://www.codeproject.com/staticctrl/clabel.asp