图像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中的OWNERDRAW为true(如果要如此,可以从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.cpp和BtnST.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) 阅读(825) 评论(0) 编辑 收藏 举报