孙鑫vc++ 第十课 笔记 图形的绘制

1、画点
   CDC::SetPixel
   COLORREF SetPixel(int x,int y,COLORREF crColor);
   COLORREF SetPixel(POINT point,COLORREF crColor); //用指定的颜色设置一个指定的点

   void CGraphicView::OnLButtonUp(UINT nFlags, CPoint point)
   {
 CClientDC dc(this);
 CPen pen(m_nLineStyle,m_nLineWidth,m_clr);
 dc.SelectObject(&pen);
 CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); //透明画刷
 dc.SelectObject(pBrush);
 switch(m_nDrawType)
 {
 case 1:
  dc.SetPixel(point,m_clr);
  break;
 case 2:
  dc.MoveTo(m_ptOrigin);
  dc.LineTo(point);
  break;
 case 3:
  dc.Rectangle(CRect(m_ptOrigin,point));
  break;
 case 4:
  dc.Ellipse(CRect(m_ptOrigin,point));
  break;
 }
 CView::OnLButtonUp(nFlags, point);
   }

2、创建颜色对话框
   CColorDialog : CCommonDialog : CDialog : CWnd : CmdTarget : CObject
  
   CColorDialog::CColorDialog
   CColorDialog(COLORREF clrInit=0,DWORD dwFlags=0,CWnd* pParetWnd=NULL);
                  颜色,默认黑色     功能,外观        父窗口
 
   构造一个CColorDialog对象,然后直接DoModal()即可

   获取用户选择的颜色,用该类的成员变量m_cc
   CColorDialog::m_cc
   CHOOSECOLOR m_cc;

   CHOOSECOLOR结构体中有一个成员变量,COLORREF rgbResult; 保存了用户点击ok按钮时的颜色选择

   如果想改变颜色对话框的初始颜色,可以改变该类的m_cc中的标记Flags,但不能直接用赋值的方式,然后使用新的颜色对rgbResult赋值

   void CGraphicView::OnColor()
   {
 // TODO: Add your command handler code here
 CColorDialog dlg;
 dlg.m_cc.Flags|=CC_RGBINIT | CC_FULLOPEN;
 dlg.m_cc.rgbResult=m_clr;
 if(IDOK==dlg.DoModal())
 {
  m_clr=dlg.m_cc.rgbResult;
 }
   }

3、字体对话框
   CFontDialog : CCommonDialog : CDialog : CWnd : CmdTarget : CObject

   CFontDialog::CFontDialog
   CFontDialog(LPLOGFONT lpltInitle=NULL,DWORD dwFlags=CFEFFECTS|CFSCRFFNFONTS,CDC*pdePrinter=NULL,CWnd* pParentWnd=NULL);
   字体特征  选择字体的标记  打印设备上下文指针  父窗口指针

   构造一个该类对象,然后DoModal()

   CFont::CreateFontIndirect
   BOOL CreateFontIndirect(const LOGFONT* lpLogFont); //用LOGFONT结构体初始化一个CFont对象

4、编辑框有一个EN_CHANGE消息,响应编辑内容的改变

5、UpdateData(); 不能忽视这个函数的作用,窗口数据交换

6、改变对话框背景色
   有一个消息WM_CTLCOLOR,响应函数是OnCtlColor()
   CWnd::OnCtlColor
   afx_msg HBRUSH OnCtlColor(CDC* pDC,CWnd* pWnd,UINT nCtlColor);
                         子窗口的pdc   控件指针   控件的类型
   nCtlColor=CTLCOLOR_BTN/CTLCOLOR_DLG/CTLCOLOR_STATIC等
   返回一个画刷句柄,用于改变控件的背景色
 
   一个控件将要被绘制的时候都要发消息给父窗口,准备一个pDC使用正确的颜色绘制控件

   要改变文字的颜色,用CDC::SetTextColor()
  
   HBRUSH CSettingDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
   {
 HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
 
 // TODO: Change any attributes of the DC here

 // TODO: Return a different brush if the default is not desired
 return hbr;  //只要改变这个值,就能直接改变对话框的背景颜色
   }

   返回子窗口或者子控件的id
   CWnd::GetDlgCtrlID
   int GetDlgCtrlID() const; 

 7、改变控件文字背景颜色为透明
   CDC::SetBkMode
   int SetBkMode(int nBkMode); //OPAQUE 不透明, TRANSPARENT 透明

   改变编辑框内的文字背景,如果设置背景透明,则出现一条白色的区域,只能用背景同色的方式
   CDC::SetBkColor()

   要改变按钮的文字颜色,必须创建一个button类,覆盖成员函数DrawItem(); 按钮类型改为自绘
   CButton::DrawItem
   virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);


   HBRUSH CSettingDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
   {
 HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

 if(pWnd->GetDlgCtrlID()==IDC_LINE_STYLE)
 {
  pDC->SetTextColor(RGB(255,0,0));
  pDC->SetBkMode(TRANSPARENT);
  return m_brush;
 }
 if(pWnd->GetDlgCtrlID()==IDC_LINE_WIDTH)
 {
  pDC->SetTextColor(RGB(255,0,0));
  //pDC->SetBkMode(TRANSPARENT);
  pDC->SetBkColor(RGB(0,0,255));
  return m_brush;
 }
 if(pWnd->GetDlgCtrlID()==IDC_TEXT)
 {
  pDC->SelectObject(&m_font);
 }

 // TODO: Return a different brush if the default is not desired
 return hbr;
 //return m_brush;
   }


8、在窗口中贴图
    1 创建位图
       CBitmap bitmap;
       bitmap.LoadBitmap(IDB_BITMAP1);
    2 创建兼容DC
       CDC dcCompatible;
       dcCompatible.CreateCompatibleDC(pDC);
    3 将位图选到兼容DC中
       dcCompatible.SelectObject(&bitmap);
    4 将兼容DC中的位图贴到当前DC中
       pDC->BitBlt(rect.left,rect.top,rect.Width(),
                        rect.Height(),&dcCompatible,0,0,SRCCOPY);

    CDC::CreateCompatibleDC
    virtual BOOL CreateCompatibleDC(CDC* pDC); //

    CDC::BitBlt
    BOOL BitBlt(int x,int y,int nWidth,int nHeight,CDC* pSrcDC,int xSrc,int ySrc,DWORD

dwRop); //按1:1的比例输出位图

    CWnd::OnEraseBkgnd
    afx_msg BOOL OnEraseBkgnd(CDC* pDC); //擦除背景成功,返回非零

    伸缩显示位图
    CDC::StretchBlt
    BOOL StretchBlt(int x,int y,int nWidth,int nHelgnt,CDC* pSrcDC,int xSrc,int ySrc,int

nSrcWidth,int pSrcHeight,DWORD dwRcp);

    获取位图信息
    CBitmap::GetBitmap
    int GetBitmap(BITMAP* pBitMap);

    typedof struct tacBITMAP{
         int bmType;
         int bmWidth;
         int bmHeight;
         int bmKidthbysoc;
         BYTE bmPlanes;
         BYTE bmFitsPixel
         LPVOID bmBits;
    }BITMAP;

    BOOL CGraphicView::OnEraseBkgnd(CDC* pDC)
    {
 // TODO: Add your message handler code here and/or call default
 CBitmap bitmap;
 bitmap.LoadBitmap(IDB_BITMAP1);

 BITMAP bmp;
 bitmap.GetBitmap(&bmp);

 CDC dcCompatible;
 dcCompatible.CreateCompatibleDC(pDC);

 dcCompatible.SelectObject(&bitmap);

 CRect rect;
 GetClientRect(&rect);
    // pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY);
 pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,
  0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
 return TRUE;
     // return CView::OnEraseBkgnd(pDC);
    }


9、注意在ondraw()函数中显示背景,和在擦除背景函数中显示背景的不同点

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/happyhhb/archive/2007/05/30/1631940.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值