麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > 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);
        //工具條可以停靠在任何位置
        t.EnableDocking(CBRS_ALIGN_ANY);
        //框架接受任意停靠位置
        EnableDocking(CBRS_ALIGN_ANY);
        //執行停靠工具條
        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);
        }

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 色妞欧美| 免费专区 - 91爱爱 | 一区二区三区在线观看av | 鲁丝一区二区三区不属 | 黑色丝袜美美女被躁视频 | 亚洲一区二区三区在线看 | 成年免费观看视频 | 动漫孕妇被羞羞视频 | 国产jjizz一区二区三区视频 | 羞羞网站 | 天天看天天摸天天操 | 一级电影免费 | 成年免费视频黄网站在线观看 | 成人nv在线观看 | 哪里可以看免费的av | 久久精品之 | 成人资源在线 | 9191色 | 免费人成年短视频在线观看网站 | xxx日本视频 | 特级毛片免费视频 | 主人在调教室性调教女仆游戏 | 日本一区二区久久 | 99爱视频在线 | 人人做人人看 | 日韩黄在线观看 | 中国黄色一级生活片 | 国产亚洲精品久久午夜玫瑰园 | 亚洲国产精久久久久久久 | 羞羞的视频在线免费观看 | 午夜视频亚洲 | 黄色小视频免费在线观看 | 久草在线观看福利 | 欧产日产国产精品99 | 精品一区二区在线播放 | 欧美a视频 | 一区二区免费看 | 91av大片| 国产精品视频一区二区三区四 | 羞羞答答视频 | 欧美另类综合 |