孫鑫VC++視頻學習筆記之10: 圖形繪製與通用對話框

轉自: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()函數中,也能正常顯示,但是閃爍比較大

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章