计算机图形学 VC图形编程
绘制点
绘制点
32位的COLORREF类型值来确定图形颜色值,其结构为0x00bbggrr,
bb:代表蓝色值,范围从00到FF;
gg:代表绿色值,范围从00到FF;
rr:代表红色值,范围从00到FF;
还可以用RGB宏来完成相同的功能:
RGB(short red ,short green, short blue)
red 代表红色值,范围从0到255;
green代表绿色值,范围从0到255;
blue代表蓝色值,范围从0到255;
绘制点
void CPixelView::OnDraw(CDC* pDC)
{
…………
for(int i=0;i<200;i++)
pDC->SetPixel(1*i,50,RGB(0,0,255));
for(int j=0;j<200;j++)
pDC->SetPixel(2*j,100,(COLORREF)0x0000ff00);
for(int m=0;m<200;m++)
pDC->SetPixel(3*m,150,(COLORREF)0x000000ff);
for(int n=0;n<200;n++)
pDC->SetPixel(4*n,200,(COLORREF)0x0000ffff);
for(int p=0;p<200;p++)
pDC->SetPixel(5*p,250,(COLORREF)0x00ff00ff);
for(int s=0;s<200;s++)
pDC->SetPixel(6*s,300,(COLORREF)0x00000000);
}
使用鼠标绘图
在VC中,鼠标的各种事件(单击鼠标左键,单击鼠标右键,双击鼠标左键,双击鼠标右键,移动鼠标)被作为消息,通过系统自带的消息映射功能,对操作者的不同操作进行响应处理。
使用鼠标绘图
绘制直线
void CCreateLineView::OnLButtonDown(UINT nFlags, CPoint point)
{
CDC* pDC=GetDC();//获取设备环境
pDC->SelectStockObject(NULL_BRUSH);//空画刷,选取库存的GDI模式
使用鼠标绘图
绘制直线
switch(m_step)
{
case 0://当第一次单击鼠标左键
m_Startp=m_Endp=point;//确定直线的起点
m_step++;//等待输入直线的终点
break;
使用鼠标绘图
绘制直线
case 1://当第二次单击鼠标左键
m_Endp=point;//确定直线的终点
m_step=-1;//使得再单击鼠标左键均无效
//m_bline=TRUE;//生成直线
DrawLine(pDC,m_Startp,m_Endp);//绘制直线
break;
default://为空操作,表示不再绘制新直线;
}
使用鼠标绘图
绘制直线
ReleaseDC(pDC);//释放不再使用的DC
CView::OnLButtonDown(nFlags, point);
}
使用鼠标绘图
绘制直线
void CCreateLineView::DrawLine(CDC *pDC, CPoint start, CPoint end)
{
pDC->MoveTo(start.x,start.y);
pDC->LineTo(end.x,end.y);
}
使用鼠标绘图
绘制直线
设置4个成员变量
使用鼠标绘图
绘制直线
设置橡皮筋模式
void CCreateLineView::OnMouseMove(UINT nFlags, CPoint point)
{
CDC* pDC=GetDC();
int nDrawmode=pDC->SetROP2(R2_NOT);//设置绘图模式:屏幕颜色反色。
pDC->SelectStockObject(NULL_BRUSH);
使用鼠标绘图
绘制直线
设置橡皮筋模式
if(m_step==1&&!m_bline)
{
CPoint prePnt,curPnt;
prePnt=m_Endp;//获得光标所在的前一个位置
curPnt=point;
使用鼠标绘图
绘制直线
设置橡皮筋模式
DrawLine(pDC,m_Startp,prePnt);//绘制橡皮线
DrawLine(pDC,m_Startp,curPnt);
m_Endp=point;
}
pDC->SetROP2(nDrawmode);//恢复先前的绘图模式
ReleaseDC(pDC);//释放DC
与绘图相关的GDI对象类
CBitmap类,CBrush类,CFont类,CPen类
CRgn类,CPalette类。
通常,我们都是使用GDI绘图对象类所创建的对象进行绘制各种图形的, 好象画家手里的画笔,而设备环境就是用什么样的画纸。
CPen
画笔是一种用来画线及绘制有形边框的工具,用户可以指定它的颜色及厚度,并且可以指定它画实线、点线或虚线。
CPen(int nPenStyle,int nWidth,COLORREF crcolor);
CPen
CPen(int nPenStyle,int nWidth,COLORREF crcolor);
nPenStyle:
PS_SOLID:实线画笔。
PS_DASH:虚线画笔。
PS_DOT:点线画笔。
PS_DASHDOT:点划线画笔。
CPen
CPen(int nPenStyle,int nWidth,COLORREF crcolor);
nWidth :指定画笔宽度。
CPen
for (int i=0;i<7;i++)
{
CPen NewPen1(PS_SOLID+i,1,RGB(0,255,0));
CPen *pOldPen=pDC->SelectObject(&NewPen1);
pDC->MoveTo(10,20*i+10);
pDC->LineTo(700,20*i+10);
pDC->SelectObject(pOldPen);
}
CBrush
画刷定义了一种位图形式的像素,利用它可以对域内部填充颜色。
CBrush(int nIndex,COLORREF crcolor);
CBrush
CBrush(int nIndex,COLORREF crcolor):
nIndex:画刷的阴影线的风格
HS_BDIAGONAL:从左到右向下成45度的对角线。
HS_CROSS:水平线和垂直线相交的十字交叉线。
HS_DIAGCROSS:夹角为45度的斜十字交叉线。
HS_FDIAGONAL:从左到右向上成45度的对角线。
HS_HORIZONAL:水平阴影线。
HS_VERTICAL: 垂直阴影线。
CBrush
CBrush NewBrush1(RGB(0,255,0));
CBrush *pOldBrush1=pDC->SelectObject(&NewBrush1);
pDC->Rectangle(50,50,200,300);
pDC->SelectObject(pOldBrush1);
CBrush
CBrush NewBrush2(HS_BDIAGONAL,RGB(255,0,0));
CBrush *pOldBrush2=pDC->SelectObject(&NewBrush2);
pDC->Rectangle(250,50,400,300);
pDC->SelectObject(pOldBrush2);
CFont
字体是一种具有某种风格和尺寸的所有字符的完整集合,它常常被当作资源存于磁盘中,其中有一些还依赖于某种设备。
扫描转换矩形
void CFillView::Fillrectangle(CDC *pDC, COLORREF rccolor)
{
int x,y;
for (y=50;y<300;y++)
for (x=50;x<200;x++)
{
pDC->SetPixel(x,y,rccolor);
}
}
扫描转换矩形
void CFillView::OnLButtonDown(UINT nFlags, CPoint point)
{
if ((50 < point.x) & (point.x <200) & (50<point.y) & (point.y<300))
{CDC *pDC=GetDC();
Fillrectangle(pDC, RGB(255,255,0));
}
CView::OnLButtonDown(nFlags, point);
}
谢 谢