轉自:http://webbery.tianyablog.com
閱讀本文前,我們假設您已經:
1,知道如何創建一個單文檔的App Wizard
2,知道C++ 類、函數重載等簡單知識
3,知道如何給View類或者Doc文檔添加成員變量
4,會用MFC的IDE調試工具最好,那麼本文的程序您可以copy去調試
5,知道如何爲某個框架類添加虛函數或消息處理函數
添加對話框,再用ClassWizard添加new class之後,出現找不到類的提示,可以刪除.clw文件,重編譯即可
一、繪製圖形
CClientDC dc(this);
CPen pen(PS_SOLID,1,RGB(255,0,0));
dc.SelceObject(&pen);
//此處可以調用函數進行繪製了
dc.SetPixel(point,RGB(255,0,0));
dc.MoveTo();dc.LineTo();dc.Rectangle()
二、透明畫刷
在繪圖前添加
CBrush *pBrush=CBrush::FromHandle(GetStockObject(NULL_BRUSH));
dc.SelctObject(pBrush);
三、顏色對話框
數據m_cc
CColorDialog dlg;
dlg.m_cc.Flags|=CC_RGBINIT;//可以再|CC_FULLOPEN,但不能寫成dlg.m_cc.Flags=CC_RGBINIT;
dlg.m_cc.rgbResult=m_clr;
if(IDOK==dlg.Domodal())
m_clr=dlg.m_cc.rgbResult;
四、字體對話框
數據成員m_cf
CFont m_font;
CString m_strFontName;
CFontDialog dlg;
if(IDOK==dlg.Domodal())
{
m_font.CreateFontIndirect(dlg.m_cf.lpLogFont); -----1
m_strFontName=dlg.m_cf.lpLogFont->lfFaceName;
Invalidate();
}
在OnDraw()中添加
CFont *pOldFont=pDC->SelectObject(&m_font);
pDC->TextOut(0,0,m_strFontName);
pDC->SelectObject(pOldFont);
運行,第二次選擇字體時出錯(二次初始化),將上面程序語句1修改爲
if(m_font.m_hObject)m_font.DeleteObject();
m_font.CreateFontIndirect(dlg.m_cf.lpLogFont);
控件和成員變量關聯時
控件值=>成員變量 UpdateData();
成員變量可以直接賦值給控件並顯示
五、對話框背景色
1,消息WM_CTLCOLOR
添加WM_CTLCOLOR消息處理函數
CBrush m_brush;
m_brush.CreateSolidBrush(RGB(0,255,0));
在CXXX::OnCtlColor()中返回m_brush即可;
2,對話框上如何精確獲得控件?
在CXX::OnCtlColor()中添加
1)對按靜態框、組合框等可以如下
if(pWnd->GetDlgCtrID()==IDC_STATIC1)
{
pDC->SetTextColor(RGB(255,0,0));
pDC->SetBkMode(TRANSPARENT);//設置文字的背景色
return m_brush;
}
2)對文本框(單行編輯控件)如下
if(pWnd->GetDlgCtrID()==IDC_EDIT1)
{
pDC->SetTextColor(RGB(255,0,0));
pDC->SetBkColor(RGB(255,0,0));//設置文本框的背景色
return m_brush;
}
3,改變靜態框顯示文字類型
CFont m_font;
m_font.CreatePointFont(200,"華文行楷");
if(pWnd->GetDlgCtrID()==IDC_STATIC1)
pDC->SelectObject(&m_font);
4,OK按鈕
1)在對話框類 =>Insert=>New Class添加以CButton爲基類的類CTstBtn
2)增加CtstBtn的虛函數DrawItem
3)在CtstBtn::DrawItem()中添加
UINT uStyle =DFCS_BUTTONPUSH;
ASSERT(lpDrawItemStruct->CtlType == ODT_BUTTON);
if(lpDrawItemStruct->itemState & ODS_SELECTED)uStyle |= DFCS_PUSHED;
::DrawFrameControl(lpDrawItemStruct->hDC,&lpDrawItemStruct->rcItem,DFC_BUTTON,uStyle);
CString strText;
GetWindowText(strText);
COLORREF crOldColor = ::SetTextColor(lpDrawItemStruct->hDC,RGB(255,0,0));
::DrawText(lpDrawItemStruct->hDC,DT_SINGLELINE|DT_VCENTER|DT_CENTER);
::SetTextColor(lpDrawItemStruct->hDC,crOldColor);
4)將OK按鈕關聯CTstBtn的一個變量,並將按鈕的owner_draw的選項選上。這一步就是把對話框上的控件和類關聯
六、在窗口中顯示位圖
1,創建位圖
CBitmap bm;
bm.LoadBitmap(IDB_BITMAP1);
2,創建兼容DC
CDC dcCompatible;
dcCompatible.CreateCompatibleDC(pDC);
3,將位圖選到兼容DC中
dcCompatible.SelectObject(&bm);
4,將兼容DC中的位圖貼到當前DC中。
pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY);
七、窗口繪製
1,擦除背景
添加WM_ERASEBKGND消息對應的函數
在CXXXView::OnEraseBkgnd()中添加
CBitmap bm;
bm.LoadBitmap(IDB_BITMAP1)
獲取位圖信息
//BITMAP bmp;
//bmp=bm.GetBitmap(&bmp);
CDC dcCompatible;
dcCompatible.CreateCompatibleDC(pDC);
dcCompatible.SelectObject(&bm);
CRect rect;
GetClientRect(&rect);
//BitBlt函數進行1:1的拷貝函數,不能壓縮或者拉伸位圖
pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY);
//pDC->StretchBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dcCompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
return TRUE;
並將return CView::OnEraseNkgnd(pDC);註釋掉
在這裏實現閃爍比較小
2,重新顯示
將以上代碼複製到OnDraw()函數中,也能正常顯示,但是閃爍比較大