內容:MFC基於對話框的項目設置背景圖片以及解決設置對話框背景之後導致文字重疊(疊影)問題。
簡介:
被嚴密封裝的MFC應用程序界面開發是一個很大的問題。先從簡單的對話框背景設置來說。
可以設置BITMAP圖像或者其他格式的圖片做爲背景。
MFC內置了CImage類來加載和使用各種類型的圖片。
簡單使用方式如下:在Rect大小的區域用Image來繪製背景。(也可以使用bkImage.BitBlt();bkImage.StretchBlt()等函數來繪製Rect區域)。
CRect rect;
GetClientRect(rect);
CPaintDC dc(this);
CImage bkImage;
bkImage.Load(_T("res//bg.jpg"));
bkImage.Draw(dc, rect);
bkImage.Destroy();
繪製可以放在OnPaint()(WM_PAINT消息函數)或者OnEraseBkgnd(CDC *pDC)(WM_ERASEBKGND消息函數)中。
其中又遇到兩個問題,
第一個問題是在對話框中的每個控件都包含一個自己的背景色,導致出現了下面的問題。
產生原因:
每個控件默認帶一個自己的背景色。
解決方法:
將其默認的背景色設置爲透明即可。
在WM_CTLCOLOR消息對應的消息處理函數OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)中
HBRUSH CCourseInputDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 在此更改 DC 的任何特性
// TODO: 如果默認的不是所需畫筆,則返回另一個畫筆
//通過控件ID的形式進行選擇性設置背景爲透明。
if(IDC_LOGOUT==pWnd->GetDlgCtrlID()
|| IDCANCEL==pWnd->GetDlgCtrlID()
|| IDC_STTCTREE==pWnd->GetDlgCtrlID()
|| IDC_COURSEDMODELLIST==pWnd->GetDlgCtrlID()
|| IDC_STTCTREE==pWnd->GetDlgCtrlID()
|| IDC_COURSESMODELLIST==pWnd->GetDlgCtrlID()
|| IDC_COURSEANATLIST==pWnd->GetDlgCtrlID()
|| IDC_COURSESOUNDLIST==pWnd->GetDlgCtrlID()
|| IDC_CURCOURSE==pWnd->GetDlgCtrlID())
{
pDC->SetBkColor(RGB(255,255,255));
pDC->SetBkMode(TRANSPARENT);
return (HBRUSH)::GetStockObject(NULL_BRUSH);
}
//批量進行設置
//switch(nCtlColor)
//{
// case CTLCOLOR_STATIC: //對所有靜態文本控件的設置
// {
// pDC->SetBkMode(TRANSPARENT);//設置背景爲透明
// pDC->SetTextColor(RGB(255,0,0)); //設置字體顏色
// return HBRUSH(GetStockObject(NULL_BRUSH)); // 必須
// }
// case CTLCOLOR_DLG: //對所有靜態文本控件的設置
// {
// pDC->SetBkMode(TRANSPARENT);
// return hbr; //返回畫刷句柄
// }
// default:
// pDC->SetBkMode(TRANSPARENT);
// return CDialog::OnCtlColor(pDC,pWnd, nCtlColor);
//}
//pDC->SetBkMode(TRANSPARENT);
//return (HBRUSH)::GetStockObject(NULL_BRUSH);
return hbr;
}
pDC->SetBkMode(TRANSPARENT);
然後返回NULL_BRUSH即可。
第二個問題時出現文字重影問題。
繪製完之後會出現字體的重影問題,即文字在更新時舊有的文字沒有被清除。如下圖:
產生原因:
咱無
解決方法:
對包含該文字的控件在更新文字之前,
先調用ShowWindow(SW_HIDE);
然後等更新文字到控件之後。
再調用ShowWindow(SW_SHOW);
即可解決。
由於我是通過變量關聯的控件所以
直接使用
mCurCourseShow.ShowWindow(SW_HIDE);
mCurCourseShow.SetWindowText(selStr);//selStr爲要更新的字符串
mCurCourseShow.ShowWindow(SW_SHOW);
//也可以直接使用
((CEdit *)(GetDlgItem(IDC_EDIT)))->ShowWindow(SW_HIDE);
((CEdit *)(GetDlgItem(IDC_EDIT)))->SetWindowText(str);
((CEdit *)(GetDlgItem(IDC_EDIT)))->ShowWindow(SW_SHOW);
如上重影現象消失
出現字體重影的原因希望各位指點。