wxWidgets的GDI

设备上下文

GDI图形设备接口)是一种使用图形界面。它被用来进行交互的图形设备,例如显示器,打印机或一个文件。GDI允许程序员将显示在屏幕上或打印机的数据,而无需关注一个特定设备的细节。的GDI绝缘程序员从硬件。


在GDI
GDI结构图:

从程序员的角度来看,GDI是一组类和方法使用图形。GDI由2D矢量图形,字体和图像。

要开始绘制图形,我们必须创建一个设备上下文(DC)的对象。在wxWidgets的设备上下文被称为wxDC。其上的图形和文字,可以得出一个设备上下文的文档定义wxDC的。它代表的设备在一个通​​用的方法。同一段代码可以写不同类型的设备。它的屏幕或打印机。该wxDC是不打算要直接使用。取而代之的是一个程序员应该选择一个派生类。每一个派生类的目的是在特定条件下使用。

衍生wxDC类

  • wxBufferedDC
  • wxBufferedPaintDC
  • wxPostScriptDC
  • wxMemoryDC
  • wxPrinterDC
  • wxScreenDC
  • wxClientDC
  • wxPaintDC
  • wxWindowDC

wxScreenDC是用来绘制在屏幕上的任何地方。如果我们要画整个窗口(仅适用于Windows),wx.WindowDC使用。这包括窗口装饰。是用来绘制一个窗口的客户区上的wxClientDC。客户端区域是没有它的装饰(标题和边框)的一个窗口。的wxPaintDC以及用于绘制的客户区上。但有的区别之一的wxPaintDC和wxClientDC。应使用的wxPaintDC,只能从wxPaintEvent。该wxClientDC,应该不使用从wxPaintEvent。wxMemoryDC是使用的位图上绘制图形。的wxPostScriptDC是用来写PostScript文件在任何平台上。wxPrinterDC是用于访问打印机(仅适用于Windows)。

简单的行

我们开始画线。

line.h
#包括<wx/wx.h>

公共类线:wxFrame
{
市民:
    线(常量wxString及名称);

    无效的OnPaint(wxPaintEvent事件);

};
line.cpp
#包括“line.h”的


线::行(常量wxString及名称)
       :wxFrame(NULL,wxID_ANY,标题,wxDefaultPosition,wxSize(280,180))
{
  这个连接(wxEVT_PAINT,wxPaintEventHandler(行:: OnPaint中));
  - >中心();
}

空行:: OnPaint中(wxPaintEvent和事件)
{
  wxPaintDC DC(本);
  
  wxCoord×1 = 50,γ1= 60;
  wxCoord X2 = 190,Y2 = 60;

  dc.DrawLine(X1,Y1,X2,Y2);
}
main.h
#包括<wx/wx.h>

类MyApp:公共wxApp的
{
  市民:
    虚拟BOOL的OnInit();
};
main.cpp中
的#include“main.h”
#包括“line.h”的

IMPLEMENT_APP(MyApp的)

布尔MyApp的:: OnInit中()
{

    线线=新线(维先通(“线”));
    线 - >显示(TRUE);

    返回true;
}

在我们的例子中,我们画一条线到窗口的客户区。如果我们改变窗口的大小,它是重绘。产生一种wxPaintEvent。并线重画。

 无效的OnPaint(wxPaintEvent事件);

在这里,我们声明的OnPaint()事件处理函数。

 这个连接(wxEVT_PAINT,wxPaintEventHandler(行:: OnPaint中));

我们的OnPaint()方法连接Paint事件。所有的绘图内发生的事情 的OnPaint()事件处理程序。

 wxPaintDC DC(本);

我们定义一个wxPaintDC的设备上下文。这是一个设备上下文,使用的窗口内的wxPaintEvent的借鉴

 wxCoord×1 = 50,γ1= 60;
 wxCoord X2 = 190,Y2 = 60;

我们定义了四个坐标。

  dc.DrawLine(X1,Y1,X2,Y2);

我们调用的drawLine()方法画一条线


线
图:一个简单的线

绘制文本

在窗口中绘制一些文本是很容易的。

text.h
#包括<wx/wx.h>

公共类文本:wxFrame
{
市民:
    文本(常量wxString及名称);

    无效的OnPaint(wxPaintEvent事件);

};
text.cpp
#包括“text.h”的


文字::文本(常量wxString及名称)
       :wxFrame(NULL,wxID_ANY,标题,wxDefaultPosition,wxSize(250,150))
{
  连接(wxEVT_PAINT(文字:: OnPaint中),wxPaintEventHandler);
  中心();
}

无效的文本:: OnPaint中(wxPaintEvent和事件)
{
  wxPaintDC DC(本);

  dc.DrawText(WXT(“ЛевНиколaевичТолстoй”),40,60);
  dc.DrawText(WXT(“АннаКаренина的),70,80);
}
main.h
#包括<wx/wx.h>

类MyApp:公共wxApp的
{
  市民:
    虚拟BOOL的OnInit();
};

main.cpp中
的#include“main.h”
#包括“text.h”的

IMPLEMENT_APP(MyApp的)

布尔MyApp的:: OnInit中()
{

    文本*文本的新文本(维先通(“文本”));
    文本显示(TRUE);

    返回true;
}

在我们的例子中,我们绘制文本,安娜·卡列尼娜列夫·尼古拉耶维奇·托尔斯泰在俄罗斯azbuka到窗口。

  dc.DrawText(WXT(“ЛевНиколaевичТолстoй”),40,60);
  dc.DrawText(WXT(“АннаКаренина的),70,80);

DrawText的()方法绘制文本的窗口。画一个文本字符串指定的点,使用当前的文本字体,和当前文本前景和背景颜色。由于 维先通()宏,我们可以使用azbuka的直接导出代码。维先通()宏_T()宏是相同的 。包装使用或不使用Unicode的字符串文字。WhenUnicode没有被激活,维先通()是一个空的宏。当Unicode启用时,它添加了必要的L为字符串字面成为一个宽字符的字符串常量。


绘制文本
图:绘制文本

最简单的几何对象是一个点。这是一个普通点的窗口。

 DrawPoint(X,诠释y)

此方法绘制一个点的x,y坐标。

point.h
#包括<wx/wx.h>

公共类积分:wxFrame
{
市民:
    点(常量wxString及名称);

    无效的OnPaint(wxPaintEvent事件);

};
points.cpp
#包括“points.h”的
#包括<stdlib.h>
#包括<time.h>


积分::点(常量wxString标题)
       :wxFrame(NULL,wxID_ANY,标题,wxDefaultPosition,wxSize(280,180))
{

  这个连接(wxEVT_PAINT,wxPaintEventHandler(点:: OnPaint中));
  函数srand(时间(NULL));
  - >中心();
}

无效点::的OnPaint(wxPaintEvent和事件)
{
  wxPaintDC DC(本);
  
  wxCoord x = 0处;
  wxCoord Y = 0;

  wxSize大小=  - > GetSize();

  (INT I = 0;我<1000; i + +){
      X = rand()函数%size.x + 1;
      Y = rand()的的%size.y + 1;
      dc.DrawPoint(的x,y);
  }
}
main.h
#包括<wx/wx.h>

类MyApp:公共wxApp的
{
  市民:
    虚拟BOOL的OnInit();
};
main.cpp中
的#include“main.h”
#包括“points.h”的

IMPLEMENT_APP(MyApp的)

布尔MyApp的:: OnInit中()
{

    点*分=新点(维先通(“点”));
    点 - >显示(TRUE);

    返回true;
}

一个单一的点可能是很难看到的。因此,我们创建了1000点。每次调整窗口的大小,我们得出1000点以上的客户区窗口。

  wxSize大小=  - > GetSize();

在这里,我们得到的窗口的大小。

 X = rand()函数%size.x + 1;

在这里,我们得到一个随机数取值范围为1至size.x.


积分
图:点

笔是一个基本的图形对象。它是用来画直线,曲线和矩形,椭圆形,多边形或其他形状的轮廓。

 wxPen(常量wxColour颜色,诠释宽度= 1,风格= wxSOLID)

wxPen构造函数有三个参数。颜色,宽度和样式。如下可能的笔styles.Pen样式列表

  • wxSOLID
  • wxDOT
  • wxLONG_DASH
  • wxSHORT_DASH
  • wxDOT_DASH
  • wxTRANSPARENT
pen.h
#包括<wx/wx.h>

Pen类:公共wxFrame
{
市民:
    笔(const的wxString及名称);

    无效的OnPaint(wxPaintEvent事件);

};
pen.cpp
#包括“pen.h”的


笔::钢笔(​​常量wxString及名称)
       :wxFrame(NULL,wxID_ANY,标题,wxDefaultPosition,wxSize(360,180))
{
  这个连接(wxEVT_PAINT,wxPaintEventHandler(钢笔:: OnPaint中));
  - >中心();
}

无效笔:: OnPaint中(wxPaintEvent和事件)
{
  wxPaintDC DC(本);

  wxColour COL1,COL2;

  col1.Set(WXT(“#0c0c0c”));
  col2.Set(WXT(“#000000”));

  wxBrush刷wxColour(255,255,255),(wxTRANSPARENT);
  dc.SetBrush(刷);

  dc.SetPen(wxPen(col1中,1,wxSOLID));
  dc.DrawRectangle(10,15,90,60);

  dc.SetPen(wxPen(col1中,1,wxDOT));
  dc.DrawRectangle(130,15,90,60);

  dc.SetPen(wxPen(col1中,1,wxLONG_DASH));
  dc.DrawRectangle(250,15,90,60);

  dc.SetPen(wxPen(col1中,1,wxSHORT_DASH));
  dc.DrawRectangle(10,105,90,60);

  dc.SetPen(wxPen(col1中,1,wxDOT_DASH));
  dc.DrawRectangle(130,105,90,60);

  dc.SetPen(wxPen(col1中,1,wxTRANSPARENT));
  dc.DrawRectangle(250,105,90,60);
}
main.h
#包括<wx/wx.h>

类MyApp:公共wxApp的
{
  市民:
    虚拟BOOL的OnInit();
};
main.cpp中
的#include“main.h”
#包括“pen.h”的

IMPLEMENT_APP(MyApp的)

布尔MyApp的:: OnInit中()
{
  笔笔=新的钢笔(维先通(“笔”));
  笔 - >显示(TRUE);

  返回true;
}

在我们的例子中,我们得出不同的画笔样式的矩形。最后一个是透明的,不可见的。

 dc.SetPen(wxPen(col1中,1,wxSOLID));
 dc.DrawRectangle(10,15,90,60);

在这里,我们定义了我们的第一个矩形的笔。我们设置笔的颜色COL1(#0c0c0c),1个像素宽,固体。 的DrawRectangle()方法绘制的矩形。


笔
图:笔

地区

地区可以结合起来,以创建更复杂的形状。我们可以用四组操作。 联合相交减去异或。下面的例子显示了所有的四则运算。

Regions.h
#包括<wx/wx.h>

公共类地区:wxFrame
{
市民:
  地区(常量wxString及名称);

  无效的OnPaint(wxPaintEvent事件);

};
Regions.cpp
#包括“Regions.h”的


地区::地区(常量wxString及名称)
       :wxFrame(NULL,wxID_ANY,标题,wxDefaultPosition,wxSize(270,220))
{
  这个连接(wxEVT_PAINT,wxPaintEventHandler(地方区域:: OnPaint中));
  - >中心();
}

无效区域:: OnPaint中(wxPaintEvent和事件)
{
  wxPaintDC DC(本);
  wxColour灰色,白色,红色,蓝色;
  wxColour橙,绿,棕;

  gray.Set(WXT(“#d4d4d4”));
  white.Set(维先通(“#FFFFFF”));
  red.Set(维先通(“#FF0000”));
  orange.Set(WXT(“#fa8e00”));
  green.Set(WXT(“#619e1b的”));
  brown.Set(WXT(“#715b33”));
  blue.Set(WXT(“#0d0060”));
 
  dc.SetPen(wxPen(灰色));

  dc.DrawRectangle(20,20,50,50);
  dc.DrawRectangle(30,40,50,50);

  dc.SetBrush(wxBrush(白));
  dc.DrawRectangle(100,20,50,50);
  dc.DrawRectangle(110,40,50,50); 
  wxRegion region1区域(100,20,50,50);
  wxRegion region2区域(110,40,50,50);
  region1.Intersect(区域2);
  region1.GetBox和wxRect rect1 =();
  dc.SetClippingRegion(区域);
  dc.SetBrush(wxBrush(红色));
  dc.DrawRectangle(rect1);
  dc.DestroyClippingRegion();

  dc.SetBrush(wxBrush(白));
  dc.DrawRectangle(180,20,50,50);
  dc.DrawRectangle(190,40,50,50);
  wxRegion region3(180,20,50,50);
  wxRegion region4(190,40,50,50);
  region3.Union(region4);
  dc.SetClippingRegion(region3);
  region3.GetBox和wxRect rect2 =();
  dc.SetBrush(wxBrush(橙色));
  dc.DrawRectangle(rect2);
  dc.DestroyClippingRegion();

  dc.SetBrush(wxBrush(白));
  dc.DrawRectangle(20,120,50,50);
  dc.DrawRectangle(30,140,50,50);
  :wxRegion region5(20,120,50,50);
  :wxRegion region6(30,140,50,50);
  region5.Xor(region6);
  region5.GetBox和wxRect rect3 =();
  dc.SetClippingRegion(region5);
  dc.SetBrush(wxBrush(绿色));
  dc.DrawRectangle(rect3);
  dc.DestroyClippingRegion();

  dc.SetBrush(wxBrush(白));
  dc.DrawRectangle(100,120,50,50);
  dc.DrawRectangle(110,140,50,50);
  :wxRegion region7(100,120,50,50);
  :wxRegion region8(110,140,50,50);
  region7.Subtract(region8);
  region7.GetBox和wxRect rect4 =();
  dc.SetClippingRegion(region7);
  dc.SetBrush(wxBrush(棕色));
  dc.DrawRectangle(rect4);
  dc.DestroyClippingRegion();

  dc.SetBrush(白色);
  dc.DrawRectangle(180,120,50,50);
  dc.DrawRectangle(190,140,50,50);
  :wxRegion region9(180,120,50,50);
  wxRegion region10(190,140,50,50);
  region10.Subtract(region9);
  wxRect rect5 = region10.GetBox();
  dc.SetClippingRegion(region10);
  dc.SetBrush(wxBrush(蓝色));
  dc.DrawRectangle(rect5);
  dc.DestroyClippingRegion(); 
}
main.h
#包括<wx/wx.h>

类MyApp:公共wxApp的
{
  市民:
    虚拟BOOL的OnInit();
};
main.cpp中
的#include“main.h”
#包括“Regions.h”的

IMPLEMENT_APP(MyApp的)

布尔MyApp的:: OnInit中()
{
  地区地区新的地区(维先通(“区域”));
  地区 - >显示(TRUE);

  返回true;
}


地区
图:地区

梯度

在计算机图形学中,梯度从亮到暗或从一个颜色到另一个的色调是一个光滑的混合。在二维绘图程序和绘图程序,渐变以及用于创建丰富多彩的背景和特殊效果来模拟灯光和阴影。(answers.com)

  的无效GradientFillLinear(常量,常量wxColour initialColour wxRect和正确的, 
       的常量wxColour destColour,wxDirection n方向wxEAST)

此方法填充指定的区域由一个矩形的线性梯度,起始从initialColour和最终衰落到destColour。n方向参数指定的颜色变化的方向,默认值是wxEAST的。

gradient.h
#包括<wx/wx.h>

公共类梯度:wxFrame
{
市民:
  梯度(常量wxString及名称);

  无效的OnPaint(wxPaintEvent事件);

};
gradient.cpp
#包括“gradient.h”的


梯度::的梯度(常量wxString及名称)
       :wxFrame(NULL,wxID_ANY,标题,wxDefaultPosition,wxSize(220,260))
{
  这个连接(wxEVT_PAINT,wxPaintEventHandler(梯度:: OnPaint中));
  - >中心();
}

无效梯度:: OnPaint中(wxPaintEvent和事件)
{
  wxPaintDC DC(本);


  wxColour COL1,COL2;

  col1.Set(WXT(“#e12223”));
  col2.Set(WXT(“#000000”));

  dc.GradientFillLinear(wxRect(20,20,180,40)中,col1,col2上,wxNORTH);
  dc.GradientFillLinear(wxRect(20,80,180,40)中,col1,col2上,wxSOUTH);
  dc.GradientFillLinear(wxRect(20,140,180,40)中,col1,col2上,wxEAST);
  dc.GradientFillLinear(wxRect(20,200,180,40)中,col1,col2上,wxWEST);  
}
main.h
#包括<wx/wx.h>

类MyApp:公共wxApp的
{
  市民:
    虚拟BOOL的OnInit();
};

main.cpp中
的#include“main.h”
#包括“gradient.h”的

IMPLEMENT_APP(MyApp的)

布尔MyApp的:: OnInit中()
{
  梯度毕业=新的梯度(WXT(“梯度));
  研究生 - >显示(TRUE);

  返回true;
}

梯度
图:渐变

形状

形状更复杂的几何对象。在下面的示例中,我们将绘制各种几何形状。

shapes.h
#包括<wx/wx.h>

类形状:公共wxFrame
{
市民:
    的形状(常量wxString标题);

    无效的OnPaint(wxPaintEvent事件);

};
shapes.cpp
#包括“shapes.h”的


的形状::形状(常量wxString及名称)
       :wxFrame(NULL,wxID_ANY,标题,wxDefaultPosition,wxSize(350,300))
{
  这个连接(wxEVT_PAINT,wxPaintEventHandler(型材:: OnPaint中));
  - >中心();
}

无效的形状:: OnPaint中(wxPaintEvent和事件)
{
  wxPaintDC DC(本);
 
  wxPoint线[] = {wxPoint wxPoint(20,260),(100,260), 
          wxPoint wxPoint(20,210),(100,210)};
  wxPoint多边形[] = {wxPoint wxPoint(180,170),(130,140), 
          wxPoint wxPoint(180,140),(220,110),wxPoint(140,100)};
  wxPoint花键[] = {wxPoint wxPoint(280,170),(240,170), 
          wxPoint wxPoint(285,110),(325,110)};
  
  dc.DrawEllipse(20,20,90,60);
  dc.DrawRoundedRectangle(130,20,90,60,10);
  dc.DrawArc(240,40,340,40,290,20);

  dc.DrawPolygon(4,多边形);
  dc.DrawRectangle(20,120,80,50);
  dc.DrawSpline(4样条线);

  dc.DrawLines(4线);
  dc.DrawCircle(170,230,35);
  dc.DrawRectangle(250,200,60,60);
  
}
main.h
#包括<wx/wx.h>

类MyApp:公共wxApp的
{
  市民:
    虚拟BOOL的OnInit();
};
main.cpp中
的#include“main.h”
#包括“shapes.h”的

IMPLEMENT_APP(MyApp的)

布尔MyApp的:: OnInit中()
{

    形状形状=新的形状(维先通(“形状”));
    形状 - >显示(TRUE);

    返回true;
}

形状
图:形状
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值