GDI绘制填充图

1、矩形填充图

(1)、填充矩形图函数FillRect():用指定的画刷填充一个无边线的矩形区域(上边界和左边界)

Void FillRect(
    LPCRECT lpRect,  //将要填充的矩形
    CBrush* pBrush   //填充矩形所需的画刷
)

(2)、单色矩形填充函数

void FillSolidRect(
    LPCRECT lpRect,  //填充的矩形
    COLORREF clr     //填充矩形的颜色
)

(3)、实例

创建位图资源IDB_BITMAP1

 在对话框的OnPaint()函数里添加绘制代码

        CPaintDC dc(this);
		CBrush brush1(HS_HORIZONTAL,RGB(255,0,0));  //横纹画刷
		dc.FillRect(CRect(10,30,150,70),&brush1);
		CBrush brush2(HS_VERTICAL,RGB(0,255,0));  //竖纹画刷
		dc.FillRect(CRect(10,80,150,120),&brush2);
		CBrush brush3(HS_FDIAGONAL,RGB(255,0,0));  //正斜纹画刷
		dc.FillRect(CRect(10,130,150,170),&brush3);
		CBrush brush4(HS_BDIAGONAL,RGB(0,0,255));  //反斜纹画刷
		dc.FillRect(CRect(10,180,150,220),&brush4);
		CBrush brush5(HS_CROSS,RGB(0,255,255));  //十字条纹画刷
		dc.FillRect(CRect(10,230,150,270),&brush5);
		CBrush brush6(HS_DIAGCROSS,RGB(255,0,255));  //斜十字纹画刷
		dc.FillRect(CRect(10,280,150,320),&brush6);
		CBrush brush7;
		CBitmap bmp;
		bmp.LoadBitmap(IDB_BITMAP1);
		brush7.CreatePatternBrush(&bmp);  //位图画刷
		dc.FillRect(CRect(180,30,310,310),&brush7);
		dc.FillSolidRect(320,30,150,50,RGB(0,255,255));  //单色矩形填充区域
		dc.FillSolidRect(320,90,150,50,RGB(255,255,0));
		dc.FillSolidRect(320,150,150,50,RGB(255,0,255));
		CDialogEx::OnPaint();

结果

 2、扇形填充图

函数为Pie(),填充整个扇形区域

BOOL Pie(LPCRECT lpRect   //扇形图对应圆的外接矩形
         POINT ptStart   //圆弧起点
         POINT ptEnd     //圆弧终点
)

BOOL Pie(
    int x1,int y1,int x2,int y2,
    int x3,int y3,
    int x4,int y4
)

实例

在对话框的OnPaint()函数里添加绘制扇形函数

        CPaintDC dc(this);
		CBrush brush1(HS_HORIZONTAL,RGB(255,0,0));  //横纹画刷
		CBrush brush5(HS_CROSS,RGB(0,255,255));  //十字条纹画刷
		CBrush brush6(HS_DIAGCROSS,RGB(255,0,255));  //斜十字纹画刷
		CBrush brush7;
		CBitmap bmp;
		bmp.LoadBitmap(IDB_BITMAP1);
		brush7.CreatePatternBrush(&bmp);  //位图画刷
		CBrush *oldBrush=dc.SelectObject(&brush1);
		dc.Pie(CRect(10,10,150,150),CPoint(15,25),CPoint(80,130));
		dc.SelectObject(&brush5);
		dc.Pie(CRect(10,160,150,300),CPoint(15,175),CPoint(80,280));
		dc.SelectObject(&brush6);
		dc.Pie(CRect(160,10,300,150),CPoint(165,25),CPoint(230,130));
		dc.SelectObject(&brush7);
		dc.Pie(CRect(160,160,300,300),CPoint(165,185),CPoint(230,280));
		dc.SelectObject(oldBrush);
		CDialogEx::OnPaint();

结果

 3、填充拖动矩形

拖动矩形的填充函数为DrawDragRect(),反复调用该成员函数可重新绘制一个拖动的矩形。如为得到视觉反馈,可以在指定鼠标位置后循环调用该函数。

void DrawDragRect(
    LPCRECT lpRect,
    SIZE size,
    LPCRECT lpRectLast,
    SIZE sizeLast,
    CBrush *pBrush=NULL,
    CBrush *pBrushLast=NULL
)

lpRect:指向RECT结构或CRect对象的指针

size:边界厚度

lpRectLast:指向RECT结构或CRect对象的指针,矩形的原始位置处于重新绘制状态,第一次调用设置为NULL

sizeLast:重新绘制矩形边界厚度

pBrush:指向画刷的指针

pBrushLast:指向最近使用的画刷指针

实例:

在对话框里添加成员变量

    private:
	CRect m_rect;  //拖动的矩形
	CPoint m_ptOrigin;  //矩形左上角
	bool m_bDraw;  //是否绘制拖动的矩形
	bool m_bFirstDraw;  //是否第一次绘制矩形
	CBrush m_brush;  //填充拖放矩形的画刷

在构造函数里初始化

    m_bFirstDraw=TRUE;
	m_bDraw=FALSE;
	m_ptOrigin=CPoint(0,0);
	m_brush.CreateHatchBrush(HS_CROSS,RGB(0,0,255));

重载对话框的3个鼠标事件

void CdeskClock_testDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	m_bFirstDraw=TRUE;  //第一次绘制
	m_bDraw=TRUE;  //开始绘制
	m_ptOrigin=point;  //鼠标当前点作为矩形左上角
	CDialogEx::OnLButtonDown(nFlags, point);
}


void CdeskClock_testDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	m_bDraw=FALSE;  //停止绘制
	CClientDC dc(this);  //屏幕设备描述符
	CRect rect(0,0,0,0);  //空矩形
	//结束填充区域
	dc.DrawDragRect(rect,CSize(1,1),m_rect,CSize(1,1),NULL,NULL);
	CDialogEx::OnLButtonUp(nFlags, point);
}


void CdeskClock_testDlg::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CClientDC dc(this);
	if(m_bDraw==TRUE)
	{
		CRect rect(m_ptOrigin,point);  //绘制的矩形
		rect.NormalizeRect();  //使矩形区域正常化
		if(m_bFirstDraw==TRUE)  //第一次绘制矩形
		{
			m_bFirstDraw=FALSE;  //标识已经开始绘制
			dc.DrawDragRect(rect,CSize(10,10),NULL,CSize(10,10),&m_brush,&m_brush);  //绘制矩形
		}
		else
		{
			//绘制拖动矩形
			dc.DrawDragRect(rect,CSize(10,10),m_rect,CSize(10,10),&m_brush,&m_brush);
		}
		m_rect.CopyRect(rect);  //保存当前矩形
	}
	
	CDialogEx::OnMouseMove(nFlags, point);
}

结果

 4、填充区域

填充一点周围的同色区域

(1)、使用当前刷从指定点开始向四周填充到颜色为指定色的边界

BOOL FloodFill(
    int x,int y,   //填充的起始点
    COLORREF crColor  //填充的颜色
)

(2)、使用当前刷从指定点开始向四周填充

BOOL ExFloodFill(
    int x,int y,
    COLORREF crColor,
    UNIT nFillType  //FLOODFILLBORDER(同FloodFill()函数):内部颜色不同但边界颜色相同的区域
                   //FLOODFILLSURFACE:内部颜色相同但边界颜色可以不同的区域
)

5、GDI输出字体的实际应用

        CPaintDC dc(this);
		LOGFONT lf;
		CFont font;
		CFont *pOldFont;
		for(int i=0;i<5;i++)
		{
			dc.SetTextColor(RGB(50*i,50*i,250-50*i));
			dc.GetCurrentFont()->GetLogFont(&lf);
			lf.lfHeight=20+i*10;
			lf.lfWidth=lf.lfHeight/2;
			lf.lfWeight=500;
			lf.lfItalic=i%2;
			lf.lfUnderline=(i+1)%2;
			lf.lfStrikeOut=i%2;
			strcpy(lf.lfFaceName,"隶书");
			font.CreateFontIndirect(&lf);
			pOldFont=dc.SelectObject(&font);
			dc.SetBkMode(TRANSPARENT);
			dc.TextOut(10,10+lf.lfHeight*(i),"CFont字体输出!!!!");
			font.DeleteObject();
		}
		CDialogEx::OnPaint();

结果

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows GDI(Graphics Device Interface)是一个用于在Windows操作系统上绘制形的API。它提供了一组函数和数据结构,可用于创建形界面元素,如窗口、按钮、文本和像等。 要在Windows GDI绘制形,可以使用以下步骤: 1. 创建设备上下文(DC)。设备上下文是一个数据结构,它包含了与输出设备(如显示器或打印机)相关的信息。 2. 创建画笔和画刷。画笔定义了绘制线条和曲线的属性,如颜色、宽度和样式等。画刷定义了填充形区域的属性,如颜色和案等。 3. 使用设备上下文和画笔/画刷绘制形。可以使用Windows GDI中的函数,如LineTo、Rectangle和Ellipse等,来绘制直线、矩形和椭圆等基本形。 4. 如果需要,可以使用位和位函数来显示像。位是一个由像素组成的像,可以使用LoadImage函数加载位文件,并使用BitBlt函数将位绘制到设备上下文中。 5. 最后,记得释放设备上下文、画笔和画刷等资源,以避免内存泄漏。 以下是一个简单的示例代码,演示如何在Windows GDI绘制一个红色矩形: ``` #include <windows.h> LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps); // 创建红色画刷 HBRUSH hBrush = CreateSolidBrush(RGB(255, 0, 0)); // 选择画刷到设备上下文中 SelectObject(hdc, hBrush); // 绘制矩形 Rectangle(hdc, 50, 50, 200, 200); // 释放资源 DeleteObject(hBrush); EndPaint(hWnd, &ps); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // 注册窗口类 WNDCLASSEX wcex = { 0 }; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.hInstance = hInstance; wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.lpszClassName = "GDIExample"; RegisterClassEx(&wcex); // 创建窗口并显示 HWND hWnd = CreateWindow("GDIExample", "GDI Example", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL, NULL, hInstance, NULL); ShowWindow(hWnd, nCmdShow); // 进入消息循环 MSG msg = { 0 }; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值