对话框设置位图背景并透明控件
1、使用OnEraseBkgnd
函
关于工期滞后的函关于工程严重滞后的函关于工程进度滞后的回复函关于征求同志党风廉政意见的函关于征求廉洁自律情况的复函
数实现对话框位图背景
(CABoutDialog______WM_ERASEBKGN_____MDI Child Frame) BOOL CDisplayBmpBackGroundDlg::OnEraseBkgnd(CDC *pDC) {
CRect rect;
GetClientRect(&rect);
CBitmap m_pBmp;
BITMAP bm;
CDC dcMem;
m_pBmp.LoadBitmap(IDB_BITMAP1);
m_pBmp.GetBitmap(&bm);//得到位图尺寸
dcMem.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = dcMem.SelectObject(&m_pBmp);
pDC->SetStretchBltMode(COLORONCOLOR);//这个模式不设置的话会
导致图片严重失真
pDC->StretchBlt(0,0,rect.Width() ,rect.Height(),
&dcMem,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
dcMem.SelectObject(pOldBitmap);
return TRUE;
}
到这里就可以实现位图了,但STATIC控件背景不透明,显得很难看。
2、来我们让STATIC控件透明吧
HBRUSH CDisplayBmpBackGroundDlg::OnCtlColor(CDC* pDC, CWnd*
pWnd, UINT nCtlColor)
{
if(nCtlColor == CTLCOLOR_DLG || nCtlColor == CTLCOLOR_BTN ||
nCtlColor == CTLCOLOR_STATIC)
{
pDC->SetBkMode(TRANSPARENT);
}
return HBRUSH(GetStockObject(HOLLOW_BRUSH));
}
到这里其实就可以了,BMP的图片背景实现了,文本框的透明也实现了。
3、补充说明:如果程序运行过程中,需要设置文本框的字体的话,会出现显示"字体重叠不刷新"的问题
4、这就要对该控件或者对话框处理了,要刷出新字体来。
CWnd* pWnd = GetDlgItem(IDC_STATIC1);
pWnd->SetWindowText("guohaiyang.blog.163.com");//需要修改的控件标题
//这里可以刷整个对话框,但如果较频繁的话,很明显能看出来,就选择刷显示字体的那块区域就可以了
pWnd ->GetParent()->InvalidateRect(CRect(0,0,100,50),TRUE);
Static控件背景透明时文字覆盖问题的解决
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
HateMath
引子:
我泡论坛的时间并不长,但印象中已经有好多次在VC区看到类似这样的问题,而且经常议之未果:
请问static控件设置透明后,再更改文字时会与之前的文字覆盖,怎么解决
用pDC->SetBkMode(TRANSPARENT);
设置透明后,要改变控件的文字就会发生文字重叠,如果不使用透明就不会,请问在透明状态下改变文字如何不发生重叠?
起初不以为意,闲暇时自己试了一下,发现:文本确实有重叠。如下图(为了更好的说明问题,我特意设置了背景和前景色):
初步探究其原因,猜想应该是static控件的背景没有得到及时刷新。
那就好办了,解决办法:强制刷新。
方法1:GetDlgItem(IDC_STATIC)->UpdateWindow(); 无效...
方法2:GetDlgItem(IDC_STATIC)-> RedrawWindow(); 无效.......
方法3:GetDlgItem(IDC_STATIC)-> Invalidate (); 无效.........
方法4:还不行,来点小技巧
SetDlgItemText(IDC_STATIC, " ");//多用几个空格,把原先的文本”冲”掉 SetDlgItemText(IDC_STATIC, "TEST");
郁闷了…….
难道这么个小问题要用高级的方法搞,
这个问题困扰了我好几天,终于在一次上WC时突然顿悟:static的背景已经是透明的了,那么残留的文本应该是画在static的父窗口上的。顿悟之后就是感叹:自己真笨啊。
办法有了:在给static设置新的文本之后(不是之前!)刷新父窗口。 void CTestStaticDlg::OnTimer(UINTnIDEvent)
{
CStringstrTime;
CTime time =CTime::GetCurrentTime();
strTime =time.Format("%y年%m月%d日%H:%M:%S");
GetDlgItem(IDC_STATIC)->SetWindowText(strTime);
GetDlgItem(IDC_STATIC)->GetParent()->RedrawWindow();//就这两句话而已,呵呵 CDialog::OnTimer(nIDEvent);
}
编译运行,K.O.