孙鑫VC++视频学习笔记之10: 图形绘制与通用对话框

时间:2021-07-12 21:12:40

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