亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

使用GDI圖形設備接口進行繪圖

2023-05-14 16:26:28
字體:
來源:轉載
供稿:網友

GDI是Windows提供的一套函數和結構,以便于我們調用它們來繪圖。為什么要提供這樣一個接口呢?

因為我們有不同的輸出設備,各種顯示器,各種打印機,他們有不同的打印驅動程序,也就是說,我們要針對不同的設備編程,要調用不同的設備驅動程序嗎?那么,我的顯示器換了,是不是我們的程序就要更換呢?我們并沒有這樣的麻煩,為什么呢?GDI提供這樣一個平臺,屏蔽了他們的差異。感覺就像Windows 操作系統屏蔽了硬件,Java虛擬機屏蔽平臺一樣。我們使用的GDI全部使用設備上下文(DC)作為顯示設備的信息來源。因此,我們無需關心設備的特性。

在圖形繪制當中,提供了一個叫做設備上下文(DC)的結構,是一個GDI提供的接口供我們來訪問設備,所有的繪圖都是通過設備上下文來進行。因此,同一應用程序可以在配有不同的類型顯示器的計算機上使用。應用程序不需要針對所有顯示器進行更改。

為了后面的畫圖型準備,我們先添加一個菜單

五個菜單的資源ID分別為ID_DRAW_LINE和ID_DRAW_RECT,ID_DRAW_ROUND_RECT和ID_DRAW_CIRCLE和ID_DRAW_CURVE。

添加好菜單,我們還要修改一下工具條,在OnCreateClient中,用下列代碼修改原有的工具條代碼

//工具條創建
        UINTtool[]= {0,ID_DISPLAY_DOWN,ID_DISPLAY_UP,ID_DISPLAY_RIGHT,
        ID_DISPLAY_LEFT,0,ID_DRAW_LINE,ID_DRAW_RECT,
        ID_DRAW_ROUND_RECT,ID_DRAW_CIRCLE,ID_DRAW_CURVE};

//創建擴展風ge的工具條
        t.CreateEx(this,TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP| CBRS_GRIPPER |       CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);

//工具條加載圖片
        t.LoadBitmap(IDB_BITMAP1);
        //設置按鈕
        t.SetButtons(tool,11);
        //工具條可以??吭谌魏挝恢?br />        t.EnableDocking(CBRS_ALIGN_ANY);
        //框架接受任意??课恢?br />        EnableDocking(CBRS_ALIGN_ANY);
        //執行??抗ぞ邨l
        DockControlBar(&t,AFX_IDW_DOCKBAR_TOP);

在前面的基礎之上,我們有添加了五個工具條按鈕。再在消息映射中添加如下代碼

ON_COMMAND(ID_DRAW_LINE,line)
        ON_COMMAND(ID_DRAW_RECT,rect)
        ON_COMMAND(ID_DRAW_ROUND_RECT,round_rect)
        ON_COMMAND(ID_DRAW_CIRCLE,circle)
        ON_COMMAND(ID_DRAW_CURVE,curve)

我們有消息映射,在添加消息映射處理函數

void line()
        {
                ::MessageBox(0,"line","消息",MB_OK);
        }
        void rect()
        {
                ::MessageBox(0,"rect","消息",MB_OK);
        }
        void round_rect()
        {
                ::MessageBox(0,"round_rect","消息",MB_OK);
        }
        void circle()
        {
                ::MessageBox(0,"circle","消息",MB_OK);
        }
        void curve()
        {
                ::MessageBox(0,"curve","消息",MB_OK);
        }

這時,準備工作已做好。開始畫圖之前,我們還要講一個概念——無效區域。我們知道,我們的顯示器就是一塊畫布,我們切換窗口,顯示器是不是要重新畫一遍畫布,這個問題要看情況。因為畫一遍畫布(我們也叫重繪)是很費資源的,所以我們就想要重繪一部分區域,我們如何知道要重繪那部分區域呢?我們將這個區域,設成要求重繪的矩形區域之后,重新繪制該區域。我們把這個區域稱為無效區域。以后我們要重新繪制什么東東的時候,就可以將它設成無效區域。

那么將這個區域設成了無效區域之后,誰來重新繪制它,如何繪制它呢?那么任何影響窗口的操作都會引發WM_PAINT消息,那么,誰來完成消息映射呢?是ON_WM_PAINT(),我們在消息映射要添加這一條,這個消息映射到了一個函數,這個函數是 OnPaint(),也就是說,我們的畫圖工作都在這里面完成。

我們的目標先是畫一條線出來,我們可以想象一下,我們先用鼠標點一下,就有一個起始點,鼠標不放開,拖動鼠標,會有一條線跟隨,再點一下有了終止點,就可以畫一條線了。我們要做的工作就是將上面的內容翻譯成VC代碼。

我們要有兩個點,還要一個重繪區域;所以我們再類sample中添加成員變量:

CPoint NewPoint;//一個終止點
        CPoint OldPoint;//一個起始點
        RECT r;//需要刷新的矩形區域

鼠標點下時,獲得起始點

void OnLButtonDown(UINT i,CPoint p)//添加的消息處理函數
        {
                OldPoint=p;// 獲得起始點
        }

鼠標起來時,得到終止點,并繪一條線

void OnLButtonUp(UINT i,CPoint p)
        {
                NewPoint=p;// 獲得終止點
                //由起始點和終止點得到一個矩形
                r.left=OldPoint.x;
                r.top=OldPoint.y;
                r.right=NewPoint.x;
                r.bottom=NewPoint.y;
                //調用窗體的設置無效區域方法
                CWnd::InvalidateRect(&r,TRUE);
        }

有了無效區域,我們再來繪圖了:

void OnPaint()
        {
                //設備上下文DC的創建,MFC將DC包裝成了幾個類,其中有類CPaintDC,
                CPaintDC d(this);
                //將坐標移動到起始點
                d.MoveTo(OldPoint);
                //繪制一條線
                d.LineTo(NewPoint);
        }

這個時候,我們就可以試一下,我們自己做的畫線程序了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久琪琪电影院| 国产精品网站视频| 国产成人拍精品视频午夜网站| 久久久久久久久中文字幕| 午夜精品久久久久久99热| 国内精品免费午夜毛片| 中文国产成人精品久久一| 日韩在线欧美在线| 国产成人精品视频| 亚洲视频精品在线| 成人精品网站在线观看| 亚洲精品成人久久| 欧美日本高清一区| 亚洲国产精品中文| 欧美高清视频在线播放| 日韩激情视频在线| 亚洲国产精品一区二区三区| 韩国精品久久久999| 国产精品久久久久久久久久小说| 不卡av电影院| 日韩精品亚洲精品| 成人免费视频网| 日韩美女主播视频| 裸体女人亚洲精品一区| 欧美激情videoshd| 亚洲福利影片在线| 91免费综合在线| 国产精品国产亚洲伊人久久| 18久久久久久| 欧美性精品220| 国产精品xxx视频| 久久人体大胆视频| 3344国产精品免费看| 91性高湖久久久久久久久_久久99| 亚洲国产精品国自产拍av秋霞| 中文字幕在线国产精品| 成人精品久久久| 亚洲最新中文字幕| 日韩一中文字幕| 久久在线精品视频| 欧美日韩aaaa| 亚洲国产黄色片| 91精品国产99| 欧美成年人在线观看| 欧美高清性猛交| 久久精品国产99国产精品澳门| 色777狠狠综合秋免鲁丝| 亚洲成色999久久网站| 亚洲另类xxxx| 久久成人人人人精品欧| 国产精品免费久久久久影院| 国产精品一区二区性色av| 欧美精品免费在线观看| 97久久精品视频| 久久影视电视剧免费网站清宫辞电视| 欧美性猛交xxxx免费看| 欧美激情精品久久久| 高清欧美性猛交xxxx黑人猛交| 国产成人在线播放| 日韩视频在线一区| 国产精品香蕉在线观看| 精品久久久久久久久久久久久| 国产精品久久久久av免费| 国产一区二区三区直播精品电影| 日韩中文字幕视频在线观看| 亚洲国产精品久久久久久| 国产欧美日韩丝袜精品一区| 日韩av网址在线观看| 欧美中文字幕第一页| 日韩精品在线影院| 国产午夜精品一区二区三区| 97婷婷大伊香蕉精品视频| 亚洲天堂日韩电影| 国产成人自拍视频在线观看| 久久香蕉频线观| 久久久久久成人精品| 欧美中文在线观看| 欧美日韩视频在线| 欧美国产视频一区二区| 久久久综合av| 91欧美精品午夜性色福利在线| 成人av色在线观看| 中文字幕精品一区二区精品| 精品国偷自产在线视频| 97国产成人精品视频| 亚洲精品中文字幕av| 中文字幕精品网| 亚洲一级片在线看| 国产精品h片在线播放| 精品国产欧美一区二区五十路| 日韩激情片免费| 国产精品视频区1| 久久久久久久久久久91| 国产精品成人一区二区三区吃奶| 久久国产精品偷| 国产精品va在线播放我和闺蜜| 在线丨暗呦小u女国产精品| 亚洲激情免费观看| 亚洲欧洲第一视频| 亚洲第一精品久久忘忧草社区| 一级做a爰片久久毛片美女图片| 亚洲人成在线观看| 亚洲va欧美va国产综合剧情| 另类天堂视频在线观看| 色妞在线综合亚洲欧美| 国产欧美日韩中文字幕| 欧美大尺度激情区在线播放| 国产精品久久久久999| 精品国产精品三级精品av网址| 国产精品入口日韩视频大尺度| 日韩经典中文字幕| 欧美性xxxxx| 91深夜福利视频| 欧美综合第一页| 国产美女精品免费电影| 亚洲热线99精品视频| 亚洲精品国偷自产在线99热| 日本久久久久久久久| 国产日韩亚洲欧美| 成人美女av在线直播| 亚洲欧美日韩视频一区| 91精品久久久久久久久久久久久| 日韩在线观看网址| 久久久视频在线| 理论片在线不卡免费观看| 亚洲精品一区二区在线| 国产成人精品免高潮在线观看| 国产精品一区二区三区成人| 精品国产一区二区三区久久久| 欧美精品在线观看91| 中文字幕无线精品亚洲乱码一区| 高潮白浆女日韩av免费看| 国产亚洲精品久久久优势| 国产亚洲精品久久久久久777| 亚洲免费av电影| 亚洲人成电影网站色| 97视频在线观看视频免费视频| 欧美亚洲国产视频| 国产精品夜色7777狼人| 国产欧美精品日韩精品| 国产香蕉一区二区三区在线视频| 国产69精品久久久久99| 欧美激情一区二区三区久久久| 欧美精品videosex极品1| 国产精品69精品一区二区三区| 亚洲最大成人在线| 久久99青青精品免费观看| 久久久久久久久久久久久久久久久久av| 成人国产亚洲精品a区天堂华泰| 日韩激情第一页| 日韩电影第一页| 欧美大全免费观看电视剧大泉洋| 亚洲国产另类久久精品| 久久久亚洲国产天美传媒修理工| 中文字幕精品一区二区精品| 日韩电影在线观看永久视频免费网站| 久久躁狠狠躁夜夜爽| 一区二区三区国产视频| 国产成人av网址| 久久国产一区二区三区| 色综合久久88色综合天天看泰| 国产剧情久久久久久| 美女福利精品视频| 成人黄色激情网|