我一步一步讲解。既为了让您能看懂我的问题,也给初学者扫扫盲。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分尽数奉上
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分尽数奉上
那个是字体的颜色
证明 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问别人去吧
试试.
我不是要设置字体颜色啊。
这个为什么要重载控件?
“把字贴在图上去颜色?”实在看不懂,能不能详细点?
{
// 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上特殊的颜色的方法都是想像中的
但是你这样做就很麻烦了,如果要改变显示的文字,岂不是相当麻烦。首先你这儿的TextOut应该接收传入参数,
而且每次要显示都要Invalidate全部(不然不会OnEraseBkGnd啊)
我试过,不行。在帖图的对话框上使用SetBKMode(Transparent),CStatic不是透明的
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方法应该最好
别人的问题:
请问static控件设置透明后,再更改文字时会与之前的文字覆盖,怎么解决
用pDC->SetBkMode(TRANSPARENT);
设置透明后,要改变控件的文字就会发生文字重叠,如果不使用透明就不会,请问在透明状态下改变文字如何不发生重叠?地址:
核心语句是这句:
在给static 设置新的文本之后(不是之前!)刷新父窗口。
GetDlgItem(IDC_STATIC)->GetParent()->RedrawWindow();
http://blog.vckbase.com/hatemath/archive/2005/08/04/10485.aspx
http://www.codeproject.com/staticctrl/clabel.asp