转自: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()函数中,也能正常显示,但是闪烁比较大