【转】第十章 图形绘制与通用对话框

阅读本文前,我们假设您已经:
         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函数进行11的拷贝函数,不能压缩或者拉伸位图

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

题目:创建CDialogBar并在其上放置控件,重复以上的功能,并在列表框中显示位图

    欢迎以任何形式转载本文,只要对您有用
    欢迎给我来信 webbery (at) sohu (dot) com (分别用@,.替换at,dot)

    韦伯主页: http://mail.ustc.edu.cn/~bywang(提供此笔记系列相关源程序下载)
    韦伯Blog: http://webbery.tianyablog.com
参考书目和网站: 
    (1)孙鑫VC++视频
    (2)1-6章主要参考: hbyufan的BLog
    (3)11-20章主要参考: songpeng的Blog

 

你可能感兴趣的:(MFC)