網(wǎng)站開發(fā)php廣州網(wǎng)站seo公司
文章目錄
- 設(shè)置mfc窗體背景顏色
- 窗體設(shè)置背景顏色后解決控件白色背景
- 解決重復(fù)修改控件文本后重疊的問題
- 自繪控件被父窗體背景覆蓋的問題
設(shè)置mfc窗體背景顏色
設(shè)置窗體的背景顏色非常簡(jiǎn)單,只需要在窗體的OnEraseBkgnd里面填充窗體背景就可以了,甚至直接畫一張背景圖片(一般在OnPaint函數(shù)里畫背景圖片)。
OnEraseBkgnd(CDC* pDC)
{// TODO: 在此添加消息處理程序代碼和/或調(diào)用默認(rèn)值CBrush brushBg;brushBg.CreateSolidBrush(RGB(51, 51, 51)); // 創(chuàng)建紅色畫刷CRect rect;GetClientRect(&rect); // 獲取窗口客戶區(qū)大小pDC->FillRect(&rect, &brushBg); // 使用自定義畫刷填充背景return TRUE;// 返回 TRUE 表示背景已經(jīng)擦除,不需要再次擦除return CDialogEx::OnEraseBkgnd(pDC);
}
窗體設(shè)置背景顏色后解決控件白色背景
窗體在設(shè)置背景色或者背景圖片后,控件的背景會(huì)變成白色。
對(duì)于靜態(tài)文本控件,顯示的內(nèi)容關(guān)系,默認(rèn)的控件背景沒有改變,因此會(huì)有白色的控件背景和文字背景
需要在OnCtlColor里面設(shè)置控件背景透明,方法就是返回一個(gè)空畫刷。同時(shí)文本背景也設(shè)置成透明
HBRUSH DlgP::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);// TODO: 在此更改 DC 的任何特性if (nCtlColor == CTLCOLOR_STATIC)//對(duì)于文本控件實(shí)現(xiàn)背景透明{pDC->SetTextColor(RGB(222, 222, 222));//設(shè)置字體顏色pDC->SetBkMode(TRANSPARENT);//文本背景透明return (HBRUSH)::GetStockObject(NULL_BRUSH);//控件背景透明}// TODO: 如果默認(rèn)的不是所需畫筆,則返回另一個(gè)畫筆return hbr;
}
解決重復(fù)修改控件文本后重疊的問題
設(shè)置窗體背景色后,控件文本改變后不能得到背景的刷新。因此會(huì)造成重疊。
獲取控件在客戶區(qū)的坐標(biāo)區(qū)域,只有使用GetWindowRect和ScreenToClient進(jìn)行屏幕坐標(biāo)轉(zhuǎn)換,再配合GetClientRect函數(shù)獲取控件大小,才能夠真正獲取到控件在窗體中的相對(duì)位置。網(wǎng)上其他的辦法,多數(shù)是錯(cuò)的。
//獲取控件在客戶區(qū)的坐標(biāo)區(qū)域RECT get_control_rect_in_client(CWnd* control){RECT rc;//獲取控件在屏幕中位置control->GetWindowRect(&rc);//將左上坐標(biāo)轉(zhuǎn)化成點(diǎn)POINT p;p.x = rc.left;p.y = rc.top;//將點(diǎn)坐標(biāo)在屏幕位置轉(zhuǎn)化成在本窗體客戶區(qū)位置this->ScreenToClient(&p);//獲取控件區(qū)域大小control->GetClientRect(&rc);//真正的在客戶區(qū)的區(qū)域rc.right = p.x + rc.right - rc.left;rc.left = p.x;rc.bottom = p.y + rc.bottom - rc.top;rc.top = p.y;return rc;}
設(shè)置控件所在區(qū)域?yàn)闊o(wú)效區(qū),rc是上面代碼里面獲取控件在客戶區(qū)的坐標(biāo)區(qū)域
InvalidateRect(&rc,true);
之后立即使用updatewindow更新無(wú)效區(qū)
UpdateWindow();
就可以解決文本重疊問題
自繪控件被父窗體背景覆蓋的問題
有的控件如按鈕屬性設(shè)置為ownerdraw并且進(jìn)行自繪操作
父窗體如果有背景色或者背景圖片,刷新就會(huì)導(dǎo)致直接覆蓋ownerdraw屬性的子控件。
解決方法是設(shè)置父窗體的屬性為Clip Children,這樣父窗體就不會(huì)刷新子控件區(qū)域