国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C# > 正文

使用GDI圖形設(shè)備接口進(jìn)行繪圖

2023-05-14 16:26:28
字體:
供稿:網(wǎng)友

GDI是Windows提供的一套函數(shù)和結(jié)構(gòu),以便于我們調(diào)用它們來繪圖。為什么要提供這樣一個(gè)接口呢?

因?yàn)槲覀冇胁煌妮敵鲈O(shè)備,各種顯示器,各種打印機(jī),他們有不同的打印驅(qū)動(dòng)程序,也就是說,我們要針對(duì)不同的設(shè)備編程,要調(diào)用不同的設(shè)備驅(qū)動(dòng)程序嗎?那么,我的顯示器換了,是不是我們的程序就要更換呢?我們并沒有這樣的麻煩,為什么呢?GDI提供這樣一個(gè)平臺(tái),屏蔽了他們的差異。感覺就像Windows 操作系統(tǒng)屏蔽了硬件,Java虛擬機(jī)屏蔽平臺(tái)一樣。我們使用的GDI全部使用設(shè)備上下文(DC)作為顯示設(shè)備的信息來源。因此,我們無(wú)需關(guān)心設(shè)備的特性。

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

為了后面的畫圖型準(zhǔn)備,我們先添加一個(gè)菜單

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

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

//工具條創(chuàng)建
        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};

//創(chuàng)建擴(kuò)展風(fēng)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);
        //設(shè)置按鈕
        t.SetButtons(tool,11);
        //工具條可以停靠在任何位置
        t.EnableDocking(CBRS_ALIGN_ANY);
        //框架接受任意停靠位置
        EnableDocking(CBRS_ALIGN_ANY);
        //執(zhí)行停靠工具條
        DockControlBar(&t,AFX_IDW_DOCKBAR_TOP);

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

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)

我們有消息映射,在添加消息映射處理函數(shù)

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

這時(shí),準(zhǔn)備工作已做好。開始畫圖之前,我們還要講一個(gè)概念——無(wú)效區(qū)域。我們知道,我們的顯示器就是一塊畫布,我們切換窗口,顯示器是不是要重新畫一遍畫布,這個(gè)問題要看情況。因?yàn)楫嬕槐楫嫴迹ㄎ覀円步兄乩L)是很費(fèi)資源的,所以我們就想要重繪一部分區(qū)域,我們?nèi)绾沃酪乩L那部分區(qū)域呢?我們將這個(gè)區(qū)域,設(shè)成要求重繪的矩形區(qū)域之后,重新繪制該區(qū)域。我們把這個(gè)區(qū)域稱為無(wú)效區(qū)域。以后我們要重新繪制什么東東的時(shí)候,就可以將它設(shè)成無(wú)效區(qū)域。

那么將這個(gè)區(qū)域設(shè)成了無(wú)效區(qū)域之后,誰(shuí)來重新繪制它,如何繪制它呢?那么任何影響窗口的操作都會(huì)引發(fā)WM_PAINT消息,那么,誰(shuí)來完成消息映射呢?是ON_WM_PAINT(),我們?cè)谙⒂成湟砑舆@一條,這個(gè)消息映射到了一個(gè)函數(shù),這個(gè)函數(shù)是 OnPaint(),也就是說,我們的畫圖工作都在這里面完成。

我們的目標(biāo)先是畫一條線出來,我們可以想象一下,我們先用鼠標(biāo)點(diǎn)一下,就有一個(gè)起始點(diǎn),鼠標(biāo)不放開,拖動(dòng)鼠標(biāo),會(huì)有一條線跟隨,再點(diǎn)一下有了終止點(diǎn),就可以畫一條線了。我們要做的工作就是將上面的內(nèi)容翻譯成VC代碼。

我們要有兩個(gè)點(diǎn),還要一個(gè)重繪區(qū)域;所以我們?cè)兕恠ample中添加成員變量:

CPoint NewPoint;//一個(gè)終止點(diǎn)
        CPoint OldPoint;//一個(gè)起始點(diǎn)
        RECT r;//需要刷新的矩形區(qū)域

鼠標(biāo)點(diǎn)下時(shí),獲得起始點(diǎn)

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

鼠標(biāo)起來時(shí),得到終止點(diǎn),并繪一條線

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

有了無(wú)效區(qū)域,我們?cè)賮砝L圖了:

void OnPaint()
        {
                //設(shè)備上下文DC的創(chuàng)建,MFC將DC包裝成了幾個(gè)類,其中有類CPaintDC,
                CPaintDC d(this);
                //將坐標(biāo)移動(dòng)到起始點(diǎn)
                d.MoveTo(OldPoint);
                //繪制一條線
                d.LineTo(NewPoint);
        }

這個(gè)時(shí)候,我們就可以試一下,我們自己做的畫線程序了。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 汉沽区| 临武县| 怀柔区| 北票市| 康马县| 中山市| 洪江市| 灵武市| 乌兰察布市| 高要市| 龙川县| 平利县| 琼中| 雅江县| 华蓥市| 广东省| 广昌县| 同江市| 台中县| 十堰市| 嘉黎县| 济阳县| 临安市| 云龙县| 芮城县| 金门县| 富民县| 长顺县| 松滋市| 临海市| 连江县| 休宁县| 泰州市| 云霄县| 定安县| 咸阳市| 天镇县| 泾源县| 成都市| 永年县| 青州市|