玩转C科技.NET

从学会做人开始认识这个世界!http://volnet.github.io

导航

图像Graphic的相关处理

Graphic

一、             绘制图像

void CGraphicView::OnLButtonDown(UINT nFlags, CPoint point)

{

  // TODO: 在此添加消息处理程序代码和/或调用默认值

  m_ptOrigin=point;

  CView::OnLButtonDown(nFlags, point);

}

 

void CGraphicView::OnLButtonUp(UINT nFlags, CPoint point)

{

  // TODO: 在此添加消息处理程序代码和/或调用默认值

  CClientDC dc(this);

  CPen pen(PS_SOLID,1,RGB(250,34,53));

  dc.SelectObject(&pen);

  CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));

  dc.SelectObject(pBrush);

  switch(m_nDrawType)

  {

  case 1:

       dc.SetPixel(point,RGB(200,20,2));    //在一个指定点设定像素,用一个和我们所指定的颜色最接近的颜色来设置这个点

       break;  

  case 2:

       dc.MoveTo(m_ptOrigin);

       dc.LineTo(point);

       break;  

  case 3:

       dc.Rectangle(CRect(m_ptOrigin,point));    //CRect类自动重载了LPCRECT类,因此无须强制类型转换

       break;  

  case 4:

       dc.Ellipse(CRect(m_ptOrigin,point));

       break;

  default:

       break;

  }

  CView::OnLButtonUp(nFlags, point);

}

 

二、             设置对话框

1、 新建CSettingDlg类,添加对话框资源,添加Edit框,IDC_LINE_WIDTH,关联变量。目标:输入线宽(整型),能在画出相应框的线。

2、 给定线型,能画出相应类型

3、 在示例中能预览出相应设置时候的变化。

4、 按确定的时候能设定相关选项。

void CSettingDlg::OnEnChangeLineWidth()

{

     // TODO:  如果该控件是 RICHEDIT 控件,则它将不会

     // 发送该通知,除非重写 CDialog::OnInitDialog()

     // 函数并调用 CRichEditCtrl().SetEventMask()

     // 同时将 ENM_CHANGE 标志“或”运算到掩码中。

 

     // TODO:  在此添加控件通知处理程序代码

     Invalidate(); //以调用本类中OnPaint()

}

 

void CSettingDlg::OnBnClickedRadio1()

{

     // TODO: 在此添加控件通知处理程序代码

     Invalidate(); //以调用本类中OnPaint()

}

 

void CSettingDlg::OnBnClickedRadio2()

{

     // TODO: 在此添加控件通知处理程序代码

     Invalidate(); //以调用本类中OnPaint()

}

 

void CSettingDlg::OnBnClickedRadio3()

{

     // TODO: 在此添加控件通知处理程序代码

     Invalidate(); //以调用本类中OnPaint()

}

 

void CSettingDlg::OnPaint()

{

     CPaintDC dc(this); // device context for painting

     // TODO: 在此处添加消息处理程序代码

     // 不为绘图消息调用 CDialog::OnPaint()

     UpdateData(); //用来获得设备变化

     CPen pen(m_nLineStyle,m_nLineWidth,m_clr);

     dc.SelectObject(&pen);

 

     CRect rect;

     GetDlgItem(IDC_SAMPLE)->GetWindowRect(&rect);  //获得一个相对于Windows桌面的矩形

     ScreenToClient(&rect); //将它们转化为相对于应用程序对话框的矩形

 

     dc.MoveTo(rect.left+20,rect.top+rect.Height()/2);  //在示例框的中部画线

     dc.LineTo(rect.right-20,rect.top+rect.Height()/2);

}

三、             设置颜色(调用系统自带的调色板)

void CGraphicView::OnColor()

{

     // TODO: 在此添加命令处理程序代码

     CColorDialog dlg;  //构建一个系统自带的调色板

     //dlg.m_cc.Flags|=CC_RGBINIT | CC_FULLOPEN;    //CC_FULLOPEN可以使整个调色面板打开 

     dlg.m_cc.Flags|=CC_RGBINIT; //只有设置了此项才可使调色板的初始值为当前值

     dlg.m_cc.rgbResult=m_clr;

     if(IDOK==dlg.DoModal())

     {

         m_clr=dlg.m_cc.rgbResult;

     }

}

四、             设置字体(调用系统自带的字体)

void CGraphicView::OnFont()

{

     // TODO: 在此添加命令处理程序代码

     CFontDialog dlg;

     if(IDOK==dlg.DoModal())

     {

         if(m_font.m_hObject)   //由于字体如果已经创建过了,那么直接再创建就会出错,在此应先判断是否已经存在,存在就将其删除

         {

              m_font.DeleteObject();

         }

         m_font.CreateFontIndirect(dlg.m_cf.lpLogFont);

         m_strFontName=dlg.m_cf.lpLogFont->lfFaceName;

         Invalidate(); //转到OnDraw()

     }

}

 

五、             设置控件的颜色(CBUTTON类见“六”)

HBRUSH CSettingDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

{

     HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

 

     // TODO:  在此更改 DC 的任何属性

     //每个控件或单元在着色的时候单独调用一次OnCtlColor,多次调用完成对整个对话框的着色

     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->SetBkColor(RGB(233,34,3));  //设置编辑框文字的背景色

         return m_brush;

     }

     if(pWnd->GetDlgCtrlID()==IDC_TEXT)

     {

         pDC->SelectObject(&m_font); //改变静态TEXT控件的字体,只需要先定义一个字体,然后选择进设备描述表中

     }

 

     //但对于一个BUTTON类的成员,则先改变BUTTON中的OWNERDRAWtrue(如果要如此,可以从MSDN中复制一段关于DrawItem方法的示例代码来完成),也可重新写一个类(见六)

 

     // TODO:  如果默认的不是所需画笔,则返回另一个画笔

     return hbr;

}

 

void CTestBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)

{

   UINT uStyle = DFCS_BUTTONPUSH;

 

   // This code only works with buttons.

   ASSERT(lpDrawItemStruct->CtlType == ODT_BUTTON);

 

   // If drawing selected, add the pushed style to DrawFrameControl.

   if (lpDrawItemStruct->itemState & ODS_SELECTED)

      uStyle |= DFCS_PUSHED;

 

   // Draw the button frame.

   ::DrawFrameControl(lpDrawItemStruct->hDC, &lpDrawItemStruct->rcItem,

      DFC_BUTTON, uStyle);

 

   // Get the button's text.

   CString strText;

   GetWindowText(strText);

 

   // Draw the button text using the text color red.

   COLORREF crOldColor = ::SetTextColor(lpDrawItemStruct->hDC, RGB(255,0,0));

   ::DrawText(lpDrawItemStruct->hDC, strText, strText.GetLength(),

      &lpDrawItemStruct->rcItem, DT_SINGLELINE|DT_VCENTER|DT_CENTER);

   ::SetTextColor(lpDrawItemStruct->hDC, crOldColor);

 

     // TODO:  添加您的代码以绘制指定项

}

 

六、             通过附加一个CButtonST类,来添加更多功能。(BtnST.cppBtnST.h

BOOL CSettingDlg::OnInitDialog()

{

     CDialog::OnInitDialog();

 

     // TODO:  在此添加额外的初始化

     m_btnST.SetActiveBgColor(RGB(255,0,0));

     m_btnST.SetActiveFgColor(RGB(0,34,34));

 

     m_btnST.SetInactiveFgColor(RGB(255,34,34));

     m_btnST.SetInactiveFgColor(RGB(25,34,24));

 

     m_btnST2.SetActiveBgColor(RGB(255,0,0));

     m_btnST2.SetActiveFgColor(RGB(0,34,34));

 

     m_btnST2.SetInactiveFgColor(RGB(255,34,34));

     m_btnST2.SetInactiveFgColor(RGB(25,34,24));

     return TRUE;  // return TRUE unless you set the focus to a control

     // 异常: OCX 属性页应返回 FALSE

}

 

七、             在背景中插入位图

BOOL CGraphicView::OnEraseBkgnd(CDC* pDC)

{

     // TODO: 在此添加消息处理程序代码和/或调用默认值

     //OnEraseBkgnd该函数是无须擦除位图直接将新位图粘贴到旧位图上。而OnDraw是先擦除,再粘贴,因此用此方法,显示速度比较快。

     CBitmap bitmap;

     bitmap.LoadBitmap(IDB_BITMAP1);

 

     CDC dcCompatible;

     dcCompatible.CreateCompatibleDC(pDC);

 

     dcCompatible.SelectObject(&bitmap);

 

     CRect rect;

     GetClientRect(&rect);

     pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY);     //按原尺寸张贴位图

 

     BITMAP bmp;

     bitmap.GetBitmap(&bmp); //获得SRC()图片的信息。通过定义一个BITMAP结构体来存储该信息。

     pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);    //按比例张贴位图

     return TRUE; 

     //return CView::OnEraseBkgnd(pDC);   //调用父类的EraseBkgnd,又擦除了背景色。因此要显示背景图片就要将这条语句注释掉

}

posted on 2008-07-18 20:08  volnet(可以叫我大V)  阅读(826)  评论(0编辑  收藏  举报

使用Live Messenger联系我
关闭