GDI+基础编程(1)

首先是在我的VS2008里面配置GDI+库,以及初始化GDI+Lib,参见http://blog.sina.com.cn/s/blog_51e67b250100ebkp.html

然后进行一些比较基础的GDI+画笔、图像处理(详细请见注释)

 

void CGDIAppDlg::DrawImage1(CDC* pDC)
{
	//CDC* pDC=GetDC();
	Graphics g(pDC->m_hDC);
	Bitmap bm1(L"1.jpg");
	int width=bm1.GetWidth();
	int height=bm1.GetHeight();
	Bitmap* pBm=bm1.Clone(0,0,width,height,PixelFormatDontCare);
	g.DrawImage(pBm,0,0,width,height);
	g.DrawImage(&bm1,width+10,0,width,height);
	//进行毛玻璃的透明设置
	ImageAttributes imageAtt;
	ColorMatrix colorMatrix={
		1.0f,0.0f,0.0f,0.0f,0.0f,
		0.0f,0.1f,0.0f,0.0f,0.0f,
		0.0f,0.0f,1.0f,0.0f,0.0f,
		0.0f,0.0f,0.0f,1.0f,0.0f,
		0.0f,0.0f,0.0f,0.0f,1.0f
	};
	imageAtt.SetColorMatrix(&colorMatrix,ColorMatrixFlagsDefault,ColorAdjustTypeBitmap);
	g.DrawImage(&bm1,
		Rect(width*2+20,0,width,height),
		0,0,width,height,
		UnitPixel,
		&imageAtt);
	///
	//绘制文字
	WCHAR str[256];
	wcscpy(str,L"Hello  GDI+");
	Font ft(L"Arial",30);
	StringFormat format;
	format.SetAlignment(StringAlignmentCenter);
	format.SetLineAlignment(StringAlignmentCenter);
	SolidBrush black(Color(255,255,0,0));
	RectF rc(10.0f,300.0f,300.0f,50.0f);
	g.DrawString(
		str,
		wcslen(str),
		&ft,
		rc,
		&format,
		&black);
	g.DrawRectangle(&Pen(Color(155,0,200),5),rc);
	Image bmp(L"1.bmp");
	TextureBrush textBrush(&bmp);//构造纹理画刷
	Pen textPen(&textBrush,30);
	//textPen.SetAlignment(PenAlignmentInset);
	g.DrawEllipse(&textPen,100,300,100,200);
	Pen red(Color(255,0,0),10);
	Pen green(Color(0,255,0),10);
	red.SetAlignment(PenAlignmentInset);
	g.DrawEllipse(&red,Rect(340,240,100,40));
	g.DrawEllipse(&green,Rect(340,240,100,40));
	/
	//画笔的缩放
	Pen p(Color(155,0,200));
	p.SetWidth(5);
	Matrix matrix(1,0,0,2,0,0);
	//p.SetTransform(&matrix);
	p.ScaleTransform(1,3);
	g.DrawRectangle(&p,Rect(300,500,100,40));
	//画笔的旋转
	Pen pen(Color::Blue,5);
	pen.ScaleTransform(1,6);//垂直方向扩充六倍,水平方向不变
	g.DrawEllipse(&pen,50,350,200,200);
	//依次旋转画笔
	pen.RotateTransform(60);
	g.DrawEllipse(&pen,50,50,200,200);
	pen.RotateTransform(120);
	g.DrawEllipse(&pen,260,50,200,200);
	pen.RotateTransform(180);
	g.DrawEllipse(&pen,260,350,200,200);
	
	//自定义画笔的画帽
	GraphicsPath sPath,ePath;
	//在路径中添加一个矩形
	sPath.AddRectangle(Rect(-10,-5,20,10));
	ePath.AddLine(0,-20,10,0);
	ePath.AddLine(0,-20,-10,0);
	ePath.AddLine(0,-10,10,0);
	ePath.AddLine(0,-10,-10,0);
	Rect rc1(10,-5,20,10);
	Pen p1(Color(255,0,0,255),3);
	CustomLineCap sCap(NULL,&sPath),eCap(NULL,&ePath);
	g.DrawLine(&p,420,30,300,30);
	for(float j=0.0f;j<6.28f;j+=0.15f)
	{
		g.DrawLine(&p1,600.0f,600.0f,600+200.0f*cos(j),600+200.0f*sin(j));
	}
	//
	//this->RedrawWindow();
//	enum LineJoin{斜接LineJoinMiter=0,斜切LineJoinBevel=1,圆形LineJoinRound=2,剪裁斜切LineJoinMiterClipped=3};
	Pen p2(Color(255,0,0,255),15);
	p2.SetLineJoin(LineJoinBevel);
	g.DrawRectangle(&p2,450,300,100,40);
	p2.SetLineJoin(LineJoinRound);
	p2.SetColor(Color(255,255,0,0));
	g.DrawRectangle(&p2,600,300,100,40);
	p2.SetLineJoin(LineJoinMiter);
	p2.SetColor(Color(255,155,0,200));
	g.DrawRectangle(&p2,750,300,100,40);
	p2.SetLineJoin(LineJoinMiterClipped);
	p2.SetColor(Color(255,0,255,0));
	g.DrawRectangle(&p2,900,300,100,40);
	///
	Point pt[4]={
		Point(500,10),
		Point(550,60),
		Point(650,110),
		Point(500,170),
	};
	g.SetSmoothingMode(SmoothingModeHighQuality);
	p2.SetLineJoin(LineJoinMiter);
	g.DrawLines(&p2,pt,4);
	/
	pt[0].X+=100;
	pt[1].X+=100;
	pt[2].X+=100;
	pt[3].X+=100;
	p2.SetColor(Color(255,200,0,155));
	p2.SetLineJoin(LineJoinBevel);
	g.DrawLines(&p2,pt,4);
	//
	pt[0].X+=100;
	pt[1].X+=100;
	pt[2].X+=100;
	pt[3].X+=100;
	p2.SetColor(Color(255,0,200,155));
	p2.SetLineJoin(LineJoinRound);
	g.DrawLines(&p2,pt,4);
	///
	pt[0].X+=100;
	pt[1].X+=100;
	pt[2].X+=100;
	pt[3].X+=100;
	p2.SetColor(Color(255,100,200,155));
	p2.SetLineJoin(LineJoinMiterClipped);
	g.DrawLines(&p2,pt,4);


}

这个函数的参数最好使用CPaintDC类型,以免绘制图像后刷新区域后消失

因此,我把这个函数放在CXXDlg::OnPaint()函数中


最后运行效果如下:(按照绘制的先后顺序,开始画的被覆盖住了)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值