设备上下文
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)。
简单的行
我们开始画线。
#包括<wx/wx.h> 公共类线:wxFrame { 市民: 线(常量wxString及名称); 无效的OnPaint(wxPaintEvent事件); };
#包括“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); }
#包括<wx/wx.h> 类MyApp:公共wxApp的 { 市民: 虚拟BOOL的OnInit(); };
的#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()方法画一条线。
绘制文本
在窗口中绘制一些文本是很容易的。
#包括<wx/wx.h> 公共类文本:wxFrame { 市民: 文本(常量wxString及名称); 无效的OnPaint(wxPaintEvent事件); };
#包括“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); }
#包括<wx/wx.h> 类MyApp:公共wxApp的 { 市民: 虚拟BOOL的OnInit(); };
的#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坐标。
#包括<wx/wx.h> 公共类积分:wxFrame { 市民: 点(常量wxString及名称); 无效的OnPaint(wxPaintEvent事件); };
#包括“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); } }
#包括<wx/wx.h> 类MyApp:公共wxApp的 { 市民: 虚拟BOOL的OnInit(); };
的#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
#包括<wx/wx.h> Pen类:公共wxFrame { 市民: 笔(const的wxString及名称); 无效的OnPaint(wxPaintEvent事件); };
#包括“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); }
#包括<wx/wx.h> 类MyApp:公共wxApp的 { 市民: 虚拟BOOL的OnInit(); };
的#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()方法绘制的矩形。
地区
地区可以结合起来,以创建更复杂的形状。我们可以用四组操作。 联合,相交,减去和异或。下面的例子显示了所有的四则运算。
#包括<wx/wx.h> 公共类地区:wxFrame { 市民: 地区(常量wxString及名称); 无效的OnPaint(wxPaintEvent事件); };
#包括“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(); }
#包括<wx/wx.h> 类MyApp:公共wxApp的 { 市民: 虚拟BOOL的OnInit(); };
的#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的。
#包括<wx/wx.h> 公共类梯度:wxFrame { 市民: 梯度(常量wxString及名称); 无效的OnPaint(wxPaintEvent事件); };
#包括“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); }
#包括<wx/wx.h> 类MyApp:公共wxApp的 { 市民: 虚拟BOOL的OnInit(); };
的#include“main.h” #包括“gradient.h”的 IMPLEMENT_APP(MyApp的) 布尔MyApp的:: OnInit中() { 梯度毕业=新的梯度(WXT(“梯度)); 研究生 - >显示(TRUE); 返回true; }
形状
形状更复杂的几何对象。在下面的示例中,我们将绘制各种几何形状。
#包括<wx/wx.h> 类形状:公共wxFrame { 市民: 的形状(常量wxString标题); 无效的OnPaint(wxPaintEvent事件); };
#包括“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); }
#包括<wx/wx.h> 类MyApp:公共wxApp的 { 市民: 虚拟BOOL的OnInit(); };
的#include“main.h” #包括“shapes.h”的 IMPLEMENT_APP(MyApp的) 布尔MyApp的:: OnInit中() { 形状形状=新的形状(维先通(“形状”)); 形状 - >显示(TRUE); 返回true; }