第十课

图形的绘制,如何使用自定义画笔(颜色,线宽,线型)。如何为程序中添加选项菜单和选项设置对话框,如何使用标准颜色对话框,如何使用字体对话框,在选项对话框中实现预览功能。实现选项对话框和窗口类中的数据交换。如何改变对话框和控件的背景色,如何改变控件的文本颜色,对按钮控件的特殊处理。如何在窗口中显示一幅位图。


 
  
  1. 改变button的样式,应该在CButtonST::DrawItem(LPDRAWITEMSTRUCT lpDIS)这个虚函数去改变一些值,框架去调用这个函数 
  2.  // Draw the button text using the text color red. 
  3.     
  4. COLORREF crOldColor = ::SetTextColor(lpDrawItemStruct->hDC, RGB(255,0,0)); 
  5.     
  6. ::DrawText(lpDrawItemStruct->hDC, strText, strText.GetLength(),  
  7.       &lpDrawItemStruct->rcItem, DT_SINGLELINE|DT_VCENTER|DT_CENTER); 
  8.     
  9. ::SetTextColor(lpDrawItemStruct->hDC, crOldColor); 
  10.  
  11.  
  12. 在窗口中贴图 
  13. 1、创建位图 
  14. CBitmap bitmap; 
  15. bitmap.LoadBitmap(IDB_BITMAP1); 
  16. 2、创建兼容DC 
  17. CDC dcCompatible; 
  18. dcCompatible.CreateCompatibleDC(pDC); 
  19. 3、将位图选到兼容DC中 
  20. dcCompatible.SelectObject(&bitmap); 
  21. 4、将兼容DC中的位图贴到当前DC中。 
  22. pDC->BitBlt(rect.left,rect.top,rect.Width(), 
  23. rect.Height(),&dcCompatible,0,0,SRCCOPY); 
  24.  
  25. 响应背景的擦除BOOL CGraphicView::OnEraseBkgnd(CDC* pDC) 。WM_OnEraseBkgnd 
  26. CBitmap bitmap; 
  27.     bitmap.LoadBitmap(IDB_BITMAP1);  加载位图 
  28.  
  29.     BITMAP bmp; 
  30.     bitmap.GetBitmap(&bmp);得到位图信息 
  31.  
  32.     CDC dcCompatible;           创建兼容dc 
  33.     dcCompatible.CreateCompatibleDC(pDC);与当前dc兼容 
  34.  
  35.     dcCompatible.SelectObject(&bitmap);选入位图 
  36.  
  37.     CRect rect; 
  38.     GetClientRect(&rect);得到客户端大小 
  39. //  pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY);    
  40.     pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible, 
  41.         0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY); 
  42.  
  43. 屏蔽基类//  return CView::OnEraseBkgnd(pDC); 
 
  
  1. dc.SetPixel(point,m_clr);画点 
  2. dc.MoveTo(m_ptOrigin);画线 
  3. dc.LineTo(point); 
  4. dc.Rectangle(CRect(m_ptOrigin,point));画矩形 
  5. dc.Ellipse(CRect(m_ptOrigin,point));画椭圆 
  6.  
  7.     CClientDC dc(this); 
  8.     CPen pen(m_nLineStyle,m_nLineWidth,m_clr);创建画笔 
  9.     dc.SelectObject(&pen); 
  10.     CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));画刷 
  11.     dc.SelectObject(pBrush); 
  12.  
  13.  
  14. CColorDialog         颜色选择对话框 
  15. CColorDialog dlg; 
  16. COLORREF m_clr; 
  17.     dlg.m_cc.Flags|=CC_RGBINIT | CC_FULLOPEN; 
  18.     dlg.m_cc.rgbResult=m_clr; 
  19.     if(IDOK==dlg.DoModal()) 
  20.     { 
  21.         m_clr=dlg.m_cc.rgbResult; 
  22.     } 
  23. CFontDialog dlg; 字体对话框 
  24. CFont m_font; 
  25. void CGraphicView::OnFont()  
  26.     // TODO: Add your command handler code here 
  27.     CFontDialog dlg; 
  28.     if(IDOK==dlg.DoModal()) 
  29.     { 
  30.         if(m_font.m_hObject)        释放字体资源 
  31.             m_font.DeleteObject(); 
  32.         m_font.CreateFontIndirect(dlg.m_cf.lpLogFont); 
  33.         m_strFontName=dlg.m_cf.lpLogFont->lfFaceName; 
  34.         Invalidate(); 
  35.     } 
  36.  
  37. Wm_ctlcolor控件颜色设置 
  38.  
  39. HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);设置对话框画刷设置背景色 
  40. return hbr; 
  41.  
  42. HBRUSH CSettingDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)  
  43.     HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); 
  44.      
  45.     // TODO: Change any attributes of the DC here 
  46.     if(pWnd->GetDlgCtrlID()==IDC_LINE_STYLE) 
  47.     { 
  48.         pDC->SetTextColor(RGB(255,0,0));设置文本颜色 
  49.         pDC->SetBkMode(TRANSPARENT);设置背景模式 
  50.         return m_brush; 
  51.     } 
  52.     if(pWnd->GetDlgCtrlID()==IDC_LINE_WIDTH) 
  53.     { 
  54.         pDC->SetTextColor(RGB(255,0,0));设置文本颜色 
  55.         //pDC->SetBkMode(TRANSPARENT);设置背景混合模式 
  56.         pDC->SetBkColor(RGB(0,0,255));设置背景色 
  57.         return m_brush; 
  58.     } 
  59.     if(pWnd->GetDlgCtrlID()==IDC_TEXT) 
  60.     { 
  61.         pDC->SelectObject(&m_font); 
  62.     } 
  63.     /*if(pWnd->GetDlgCtrlID()==IDOK) 
  64.     { 
  65.         pDC->SetTextColor(RGB(255,0,0)); 
  66.         return m_brush; 
  67.     }*/ 
  68.     // TODO: Return a different brush if the default is not desired 
  69.     return hbr; 
  70.     //return m_brush;