GDI 基礎程式設計(1)

2021-06-05 00:37:01 字數 3601 閱讀 1440

首先是在我的vs2008裡面配置gdi+庫,以及初始化gdi+lib,參見

然後進行一些比較基礎的gdi+畫筆、影象處理(詳細請見注釋)

; 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);

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.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)

////this->redrawwindow();

// enum linejoin;

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]=;

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()函式中

最後執行效果如下:(按照繪製的先後順序,開始畫的被覆蓋住了)

GDI程式設計基礎

視口是基於裝置的採用的是裝置座標 單位 畫素 視窗是基於程式的採用的是邏輯座標 單位 畫素 公釐 厘公尺等 在預設的對映模式下,視口是與視窗等同的。但是如果改變其對映模式,則其對應的單位則不相同。如果將對映模式改為mm loenglish或mm lometric等,則1個裝置座標並不對應乙個邏輯座標...

GDI 程式設計基礎簡介

今天準備重新對gdi的知識進行回顧一下,以便加深認識。在進行windows程式設計時,可能經常會用到裝置描述表的型別控制代碼,例如,最廠家的hdc,它就是影象裝置描述型別控制代碼。因為gdi的繪圖函式基本上都是有狀態的,因此gdi所有的函式都要求乙個這樣的圖形裝置描述型別的控制代碼 hdc。而乙個影...

GDI程式設計注意點 1

textout的屬於比較老的文字輸出函式,但是簡單的文字輸出和格式控制使用它非常方便,廢話不多說,基本用法如下 void drawarea1 cdchandle mydc,point ptlefttop,point ptrightbottom 效果如下 可以看到,1.使用setbkmode決定背景是...