tft每日頭條

 > 生活

 > mfc簡單繪圖程序

mfc簡單繪圖程序

生活 更新时间:2024-07-02 06:24:07

早期開發圖形程序都是直接針對具體設備進行的,要開發一個圖形軟件必須先了解是什麼型号的顯示卡或者打印機,根據每個廠家提供的接口編寫不同的代碼來開發。進入Windows等圖形界面的操作系統時代,操作系統通過對驅動程序的統一管理,将設備接口細節隐藏于操作系統内部。程序員在編寫圖形程序時,隻要調用一個公用的虛拟設備即可,這個虛拟設備也就是DC(Device Context)。

在Windows應用程序中,設備環境(DC,繪圖模式)與圖形對象協同進行繪圖顯示工作。就像畫家繪圖一樣,設備環境(繪圖模式)好比是畫家的畫布,圖形對象好比是畫家的畫具,畫家可以使用不同的畫布、不同的畫筆、畫刷、顔料等,畫出不同載體、不同色彩、不同線條的畫。

MFC繪圖類包括繪圖環境類和繪圖對象類。

1 繪圖環境類(繪圖模式)

繪圖環境類是MFC對GDI三類繪圖模式函數封裝成CDC及三種派生類。

CDC派生類封裝的GDI函數及功能說明:

a) CPaintDC類,封裝了BeginPaint和EndPaint函數。

用于标準客戶區繪圖,窗口刷新時不消失,在WM_PAINT消息下使用。

b) CWindowDC類,封裝了GetWindowDC和ReleaseDC函數。

mfc簡單繪圖程序(MFC三種繪圖模式六種圖形對象)1

2 繪圖對象類

使用GDI對象可以改變線條的顔色、大小,可以使用填充顔色,改變字體,顯示一張位圖等。不過,GDI對象是要通過DC才能發生作用的。要使用這些GDI對象,必須使用SelectObject函數将其選入DC中。

主要有六種,全部由CGdiObject類派生:

CPen-畫筆,用于修飾線條 的顔色、寬度和線型(實線、虛線或點劃線等);

CBrush-畫刷,用于修飾一個閉合圖形内部的填充内容(填充顔色、填充線條以及平鋪位圖;

CFont-字體,用于修飾輸出文字的樣式、高度、粗細以及字間距等;

CBitmap-位圖,用于顯示和處理點陣圖像;

CRgn-區域,用于修飾輸出圖像的不規則邊界,如橢圓或多邊形等;

CPalette-調色闆,用于修飾輸出圖像的色調,如16色或256色等;

顔色變量和處理函數:

typedef DWORD COLORREF;

COLORREF c1 = RGB(255,255,255);

一般按如下步驟使用GDI對象:

a、創建或得到一個GDI對象;

b、使用dc.SelectObject函數把GDI對象選入DC;

c、使用DC進行繪圖或文字輸出;

d、恢複DC原來的GDI對象并删除剛新創建的GDI對象;

綜合DC和GDI對象的使用步驟,則繪圖的完整步驟為:

I 獲取或者創建一個DC,也就是創建一個繪圖模式或環境;

II 獲取或者創建一個GDI對象(Pen, Brush等);

III 使用dc.SelectObject函數把GDI對象選入DC;

IV 使用DC進行繪圖或文字輸出;

V 恢複DC原來的GDI對象并删除剛新創建的GDI對象,如pen.DeleteObject();

VI 釋放或删除設備描述表DC;

其中,I和VI,II和IV是對應的。

2.1 CPen類(畫筆)

畫筆決定了線條的顔色、寬度和線型(實線、點線或點劃線等)。Windows使用當前在設備描述表中已選擇的畫筆來畫線。程序中可以選擇Windows的預定義畫筆,也可以選擇自定義的畫筆。

預定義畫筆有三種:BLACK_PEN(黑色筆) 、WHITE_PEN(白色筆)和NULL_PEN(空筆),這些都在windows.h中已經定義好了,程序員可使用GetStockObject函數來選擇其中的一種,系統缺省的畫筆為黑色筆。Windows.h包含了HPEN的數據類型定義,使用該類型可以定義畫筆句柄的變量。

僅靠系統提供的預定義畫筆遠遠不能滿足需求,應用程序可根據實際需要創建一種自定義的邏輯畫筆。其步驟一般為:首先用CreatePen或CreatePenIndirect函數建立一支畫筆,再調用SelectObject函數将其選入設備描述表,此後就可使用該畫筆在選定的設備描述表中進行繪圖操作。任何時候某一設備描述表隻能有一支畫筆被選入作為當前畫筆,當一支畫筆被選入時,原先已選入的畫筆便不再有效。完成繪圖操作後,可以通過調用DeleteObject來釋放已建立的畫筆。

函數CreatePen()

HPEN CreatePen(int fnPenStyle,int nWidth,COLORREF clrref);

該函數創建一個邏輯畫筆。其中fnPenStyle參數指定畫筆的線型,該參數可取由windows.h定義的七個标識符之一,其含義為:

PS_SOLID 實線

PS_DASH 虛線

PS_DOT 點線

PS_DASHDOT 夾一點虛線

PS_DASHDOTDOT 夾二點虛線

PS_NULL 無

PS_INSIDEFRAME 線畫在所有構件框架内

nWidth參數是用邏輯單位表示的畫筆的寬度;

clrref參數是一個COLORREF類型的顔色值,指定畫筆的顔色,可用宏指令RGB構造這個值,如:clrref=RGB(byRed,byGreen,byBlue);

實例

void CPenDlg::OnPaint() { CPaintDC dc(this); // 繪圖模式之一(标準客戶區繪圖),另外還有CWindowDC(非客戶區)、CClientDC(臨時客戶區) dc.TextOut(20,20,"默認畫筆:黑色,寬度為1"); dc.MoveTo(20,60); dc.LineTo(120,60); dc.TextOut(20,80,"通過構造函數創建畫筆:CPen pn1(PS_SOLID,4,RGB(255,0,0));"); CPen pn1(PS_SOLID,4,RGB(255,0,0)); CPen *pOldPen = dc.SelectObject(&pn1); //選擇的是新建畫筆,返回的是之前的舊畫筆 dc.MoveTo(20,120); dc.LineTo(120,120); dc.TextOut(20,140,"通過CreatePen函數創建畫筆:pn2.CreatePen(PS_DASHDOT,1,RGB(0,0,255));"); CPen pn2; pn2.CreatePen(PS_DASHDOT,1,RGB(0,0,255)); dc.SelectObject(&pn2); dc.MoveTo(20,180); dc.LineTo(120,180); dc.TextOut(20,200,"畫一個矩形dc.Rectangle(20,240,140,300); 右上、右下角坐标 "); dc.SelectObject(pOldPen); // 選擇默認畫筆 dc.Rectangle(20,240,140,300); dc.TextOut(20,320,"畫一個無邊框的矩形:CPen pn3(PS_NULL,1,RGB(0,0,0));"); CPen pn3(PS_NULL,1,RGB(0,0,0)); dc.SelectObject(&pn3); dc.Rectangle(20,360,140,420); dc.TextOut(20,440,"等價的無邊框矩形的畫法:dc.FillSolidRect(20,440,120,60,RGB(255,255,255));右上角坐标,長,寬"); dc.FillSolidRect(20,480,120,60,RGB(255,255,255)); //右上角坐标,長,寬 dc.SelectObject(pOldPen); // 恢複默認畫筆 }

運行效果:

mfc簡單繪圖程序(MFC三種繪圖模式六種圖形對象)2

2.2 CBrush(刷子)

當我們在繪制一些區域圖形時,其内部往往需要以某種圖案進行填充,這就需要選定"刷子"作為繪圖工具。Windows系統不僅為用戶提供了預定義刷子,而且還允許應用程序自定義刷子。

Windows系統中預定義的刷子有如下七種:

BLACK_BRUSH 黑色刷子

DKGRAY_BRUSH 深灰色刷子

GRAY_BRUSH 灰色刷子

HOLLOW_BRUSH 中空刷子,畫邊界而不填充

LTGRAY_BRUSH 淺灰色刷子

NULL_BRUSH 空刷子

WHITE_BRUSH 白色刷子

應用程序可以調用GetStockObject函數選用其中一個,系統缺省的刷子是白色刷子。Window.h包含了HBRUSH數據類型的定義,使用該類型就可定義刷子句柄的變量。

僅靠這七種刷子往往不能滿足要求,應用程序通過調用如下幾種函數創建邏輯刷子,這些函數返回值均為刷子句柄。

CreateHatchBrush()

HBRUSH CreateHatchBrush(int fnStyle, COLORREF clrref);

該創建一個帶陰影的邏輯刷子。

FnStyle指定的陰影格式如下:

HS_BDLAGONAL 45度向上斜線組成的陰影圖案(自左到右)

HS_CROSS 水平和垂直交叉組成的陰影圖案

HS_DIAGCROSS 45度斜線交叉組成的陰影圖案

HS_FDIAGONAL 45度向下斜線組成的陰影圖案(自左到右)

HS_HORZONA 水平線組成的陰影圖案

HS_VERTICAL 垂直線組成的陰影圖案

Clrref是具有COLORREF類型定義的刷子顔色值,可用宏指令RGB構造這個值。

函數CreateSolidBrush()

HBRUSH CreateSolidBrush(COLORREF clrre);

該函數創建的是一種實心顔色的邏輯刷子。clrre含義同上。

同樣,使用創建刷子的函數時,要檢查其返回,确保它是一個有效的句柄。

一旦創建了繪圖工具之後,可以SelectObject函數把它選擇到顯示緩沖區裡。

在使用顯示緩沖區之前,并不一定非要創建和選擇繪圖工具,Windows為每個顯示緩沖區提供默認的繪圖工具。例如:黑色筆,白色刷子和系統字體。

DeleteObject函數用來删除不再需要的繪圖工具,但不能删除一個已選進顯示緩沖區的繪圖工具,而是應該使用SelectObject函數恢複原有的繪圖工具,然後再删除需要删除的工具。

實例:

void CBrushDlg::OnPaint() { CPaintDC dc(this); // device context for painting dc.Rectangle(20,20,120,100); CBrush br1(RGB(0,0,255)); CBrush *pOldBrush = dc.SelectObject(&br1); dc.Ellipse(140,20,240,100); CBrush br2(HS_FDIAGONAL,RGB(255,0,0)); dc.SelectObject(&br2); CPen pen(PS_SOLID,3,RGB(255,0,0)); CPen *pOldPen = dc.SelectObject(&pen); dc.RoundRect(260,20,300,100,25,25); CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP1); CBrush br3(&bmp); dc.SelectObject(&br3); CPen pen2(PS_SOLID,3,RGB(240,240,240)); dc.SelectObject(&pen2); POINT pt[] = {{40,120},{160,120},{240,240},{20,240}}; dc.Polygon(pt,4); CBrush br4; LOGBRUSH lb = {BS_NULL}; br4.CreateBrushIndirect(&lb); dc.SelectObject(pOldPen); dc.SelectObject(&br4); dc.Chord(CRect(140,120,350,240),CPoint(260,240),CPoint(140,100)); dc.SelectObject(pOldBrush); dc.SelectObject(pOldPen); }

運行效果:

mfc簡單繪圖程序(MFC三種繪圖模式六種圖形對象)3

2.3 CFont(字體)

Windows是使用定義好的與設備無關的字符集,Windows的"文本"字符也是圖形,所以屏幕上所顯示的用打印機或繪圖儀等輸出品的文本完全一樣,做到"所見即所得"。

文本繪制函數有:

TextOut 以當前的字體寫一字符串

DrawText 在一個特定矩形區中繪制某一格式的文本

ExtTextOut 在一個特定矩形區中,以當前字體寫一字符串

GrayString 用灰色文本寫一字符串

TabbedTextOut 寫一帶擴展字符的字符串

要輸出文本就離不開字體。獲取字體的相關信息可以使用函數:

BOOL GetTextMetrics( LPTEXTMETRIC lpMetrics )

結構TEXTMETRIC的定義如下所示:

typedef struct tagTEXTMETRIC { // tm LONG tmHeight; //字符高度 LONG tmAscent; //字符上部高度(基線以上) LONG tmDescent; //字符下部高度(基線以下) LONG tmInternalLeading; //由tmHeight定義的字符高度的頂部空間數目 LONG tmExternalLeading; //加在兩行之間的空間數目 LONG tmAveCharWidth; //平均字符寬度 LONG tmMaxCharWidth; //最寬字符的寬度 LONG tmWeight; //字體的粗細輕重程度 LONG tmOverhang; //加入某些拼接字體上的附加高度 LONG tmDigitizedAspectX; //字體設計所針對的設備水平方向 LONG tmDigitizedAspectY; //字體設計所針對的設備垂直方向 BCHAR tmFirstChar; //為字體定義的第一個字符 BCHAR tmLastChar; //為字體定義的最後一個字符 BCHAR tmDefaultChar; //字體中所沒有字符的替代字符 BCHAR tmbreakChar; //用于拆字的字符 BYTE tmItalic; //字體為斜體時非零 BYTE tmUnderlined; //字體為下劃線時非零 BYTE tmStruckOut; //字體被删去時非零 BYTE tmPitchAndFamily; //字體間距(低4位)和族(高4位) BYTE tmCharSet; //字體的字符集 } TEXTMETRIC;

GDI字體族和字樣表如下表所示:

字體族 字體族常量 字樣說明

Dontcare FF_DONTCARE System 當不能提供字體信息或字體并不

重要時使用

Decorative FF_DECORATIVE Symbol 新奇字體

Modern FF_MODERN Courer,ModernIerminal 筆畫大小固定的字體,但襯線可有可無

Roman FF_ROMAN Roman,TimeRoman 有襯線的、筆畫大小可變的羅馬字體

Script FF_SCRIPT Script 仿手寫體

Swiss FF_SWISS Helvetical,System 無襯線的、筆畫大小可變的字體

CreateFontIndirect函數

HFONT CreateFontIndirect(

CONST LOGFONT *lplf // pointer to logical font structure

);

參數lplf是LOGFONT結構的指針。結構中含有邏輯字體的特征信息。該函數用lplf所指的LOGFONT結構中的信息創建一種邏輯字體。LOGFONT結構的定義如下:

typedef struct tagLOGFONT { // lf LONG lfHeight; //字高度 LONG lfWidth; //字符平均寬度 LONG lfEscapement; //行與水平頁角度 LONG lfOrientation; //基線與水平角度 LONG lfWeight; //筆劃的粗細 BYTE lfItalic; //非零為斜體 BYTE lfUnderline; //非零為下劃線 BYTE lfStrikeOut; //非零為中劃線 BYTE lfCharSet; //指定字符集 BYTE lfOutPrecision; //輸出精度 BYTE lfClipPrecision; //裁剪精度 BYTE lfQuality; //輸出質量 BYTE lfPitchAndFamily; //字體的字距和族 TCHAR lfFaceName[LF_FACESIZE]; //含字體名的字符串 } LOGFONT;

函數SetTextAlign

大多數文本函數傳遞的參數表都要求有一個點坐标參數以定義寫文本的參考點。當前文本對齊屬性規定了字符串如何相對于所傳遞的坐标進行寫。SetTextAlign函數用以設置當前文本對齊屬性。

UINT SetTextAlign( HDC hdc, // handle to device context UINT fMode // text-alignment flag );

該函數設置文本對齊方式。Hdc是參數描述表,fuAlign是文本對齊方式

實例:

void CFontDlg::OnPaint() { CPaintDC dc(this); // device context for painting dc.TextOut(10,10,"使用默認字體輸出文字!"); CFont* pFont = GetFont(); CreateFont(&dc); CreateColor(&dc); Others(&dc, pFont); Width(&dc, pFont); Weight(&dc, pFont); Escape(&dc, pFont); Height(&dc, pFont); Normal(&dc, pFont); } void CFontDlg::Normal(CDC* pDC, CFont *pFont) { pFont = pDC->SelectObject(pFont); pDC->TextOut(10,30,"使用對話框字體輸出!"); pDC->SelectObject(pFont); } void CFontDlg::Height(CDC* pDC, CFont *pFont) { LOGFONT lf; pFont->GetLogFont(&lf); lf.lfHeight*=2; CFont font; font.CreateFontIndirect(&lf); pFont = pDC->SelectObject(&font); pDC->TextOut(10,50,"測試字符的高度加倍!"); pDC->SelectObject(pFont); } void CFontDlg::Weight(CDC* pDC, CFont *pFont) { LOGFONT lf; pFont->GetLogFont(&lf); lf.lfWeight=700; CFont font; font.CreateFontIndirect(&lf); pFont = pDC->SelectObject(&font); pDC->TextOut(10,80,"測試粗體字!"); pDC->SelectObject(pFont); } void CFontDlg::Width(CDC* pDC, CFont *pFont) { LOGFONT lf; pFont->GetLogFont(&lf); lf.lfWeight=lf.lfHeight; CFont font; font.CreateFontIndirect(&lf); pFont = pDC->SelectObject(&font); pDC->TextOut(10,100,"測試字體的寬度!"); pDC->SelectObject(pFont); } void CFontDlg::Others(CDC* pDC, CFont *pFont) { LOGFONT lf; pFont->GetLogFont(&lf); lf.lfItalic = TRUE; lf.lfUnderline = TRUE; lf.lfStrikeOut = TRUE; CFont font; font.CreateFontIndirect(&lf); pFont = pDC->SelectObject(&font); pDC->TextOut(10,120,"測試斜體、下劃線和删除線!"); pDC->SelectObject(pFont); } void CFontDlg::Escape(CDC* pDC, CFont *pFont) { LOGFONT lf; pFont->GetLogFont(&lf); lf.lfEscapement = 200; CFont font; font.CreateFontIndirect(&lf); pFont = pDC->SelectObject(&font); pDC->TextOut(10,180,"測試字符串的傾斜度!"); pDC->SelectObject(pFont); } void CFontDlg::CreateColor(CDC* pDC) { COLORREF oldText = pDC->SetTextColor(RGB(255,0,0)); pDC->TextOut(10,200,"字體顔色"); COLORREF oldBack = pDC->SetBkColor(RGB(0,0,255)); pDC->TextOut(80,200,"背景顔色"); int nOldMode=pDC->SetBkMode(TRANSPARENT); pDC->TextOut(150,200,"背景透明"); pDC->SetTextColor(oldText); pDC->SetBkColor(oldBack); pDC->SetBkMode(nOldMode); } void CFontDlg::CreateFont(CDC* pDC) { CFont ft1; ft1.CreatePointFont(100,"幼圓"); CFont* pOldFont = pDC->SelectObject(&ft1); pDC->TextOut(10,220,"簡單創建字體的方法"); pDC->SelectObject(pOldFont); LOGFONT lf={20}; lf.lfCharSet=GB2312_CHARSET; lf.lfWeight=400; strcpy(lf.lfFaceName,"隸書"); CFont ft2; ft2.CreateFontIndirect(&lf); pDC->SelectObject(&ft2); pDC->TextOut(10,240,"完整創建字體的方法"); }

運行效果:

mfc簡單繪圖程序(MFC三種繪圖模式六種圖形對象)4

2.4 CBitmap類(位圖)

void CBitmapDlg::OnPaint() { CPaintDC dc(this); // device context for painting CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP1); BITMAP bm; bmp.GetBitmap(&bm); CDC mdc; mdc.CreateCompatibleDC(&dc); mdc.SelectObject(&bmp); dc.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&mdc,0,0,SRCCOPY); //從1/3的位置開始輸出右下角2/3大小的圖片 dc.BitBlt(bm.bmHeight 10,10,bm.bmWidth*2/3,bm.bmHeight*2/3,&mdc,bm.bmWidth/3,bm.bmHeight/3,SRCCOPY); //使用默認算法将圖像壓縮一半 dc.StretchBlt(10,bm.bmWidth 10,bm.bmWidth/2,bm.bmHeight/2,&mdc,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY); //更換壓縮算法提高壓縮後的圖像品質 dc.SetStretchBltMode(COLORONCOLOR); dc.StretchBlt(bm.bmWidth/2 20,bm.bmHeight 10,bm.bmWidth/2,bm.bmHeight/2,&mdc,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY); //左右對稱壓縮 dc.StretchBlt(bm.bmWidth 30,bm.bmHeight 10,bm.bmWidth/2,bm.bmHeight/2,&mdc,bm.bmWidth,0,-bm.bmWidth,bm.bmHeight,SRCCOPY); } 運行效果:

mfc簡單繪圖程序(MFC三種繪圖模式六種圖形對象)5

2.5 CRgn類(區域)

void CRgnDlg::OnPaint() { CPaintDC dc(this); CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP1); BITMAP bm; bmp.GetBitmap(&bm); int cx = bm.bmWidth; int cy = bm.bmHeight; CDC mdc; mdc.CreateCompatibleDC(&dc); mdc.SelectObject(&bmp); POINT pts[] = {{20,16},{110,56},{114,16},{166,52},{250,20},{240,100},{250,180},{150,160},{32,180},{52,100}}; CRgn rg1; rg1.CreatePolygonRgn(pts,sizeof(pts)/sizeof(POINT),WINDING); dc.SelectObject(&rg1); dc.BitBlt(0,0,cx,cy,&mdc,0,0,SRCCOPY); CRgn rg2; int nLeft = cx-50; int nTop = cy - 50; rg2.CreateRoundRectRgn(nLeft,nTop,nLeft cx,nTop cy,32,32); dc.SelectObject(&rg2); dc.BitBlt(nLeft,nTop,cx,cy,&mdc,0,0,SRCCOPY); }

運行效果:

mfc簡單繪圖程序(MFC三種繪圖模式六種圖形對象)6

附:通過HDC句柄調用GDI函數的三種繪圖模式

// DC32.cpp : Defines the entry point for the application. #include "stdafx.h" #include "resource.h" #include <stdio.h> // GDI函數通過HDC句柄來調用 #if 1 //消息回調函數 窗口客戶區繪圖 BeginPaint(hwndDlg,&ps);窗口刷新時不消失,在WM_PAINT消息下使用,封裝成CPaintDC類 BOOL CALLBACK dlgFunc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_COMMAND: switch(wParam) { case IDCANCEL: EndDialog(hwndDlg,IDCANCEL); break; } case WM_PAINT: //窗口客戶區繪圖 { PAINTSTRUCT ps; //獲取與容器客戶區關聯的繪圖句柄 HDC hdc=BeginPaint(hwndDlg,&ps); //畫兩個矩形 Rectangle(hdc,0,0,40,40); Rectangle(hdc,80,80,120,120); //畫一條線 MoveToEx(hdc,20,20,NULL); LineTo(hdc,100,100); EndPaint(hwndDlg,&ps); } break; } return FALSE; } #endif #if 0 //消息回調函數 非窗口客戶區繪圖 ;窗口刷新時不消失,在WM_NCPAINT消息下使用,封裝成CWindowDC類 BOOL CALLBACK dlgFunc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_COMMAND: switch(wParam) { case IDCANCEL: EndDialog(hwndDlg,IDCANCEL); break; } case WM_NCPAINT: { HDC hdc = GetWindowDC(hwndDlg); RECT rect; GetWindowRect(hwndDlg,&rect); //獲取整個窗口的空間區域 //畫兩個矩形 Rectangle(hdc,0,0,rect.right-rect.left,rect.bottom-rect.top); char str[222]; sprintf(str,"非客戶空間(%d,%d,%d,%d)",rect.left,rect.top,rect.right,rect.bottom); SetTextColor(hdc,RGB(255,0,0)); TextOut(hdc,5,5,str,strlen(str)); ReleaseDC(hwndDlg,hdc); return TRUE; } case WM_MOVE: SendMessage(hwndDlg,WM_NCPAINT,0,0); InvalidateRect(hwndDlg,NULL,TRUE); return TRUE; } return FALSE; } #endif #if 0 //消息回調函數 臨時客戶區繪圖 ;窗口刷新時消失,任何時候都可以使用,封裝成GetDC類 BOOL CALLBACK dlgFunc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_COMMAND: switch(wParam) { case IDCANCEL: EndDialog(hwndDlg,IDCANCEL); break; } case WM_LBUTTONDOWN: HDC hdc = GetDC(hwndDlg); int x = LOWORD(lParam); int y = HIWORD(lParam); // 畫一個圓形 Ellipse(hdc,x-10,y-10,x 10,y 10); ReleaseDC(hwndDlg,hdc); return TRUE; } return FALSE; } #endif //測試坐标系轉換 void ScreenToClient(HWND hwndParent, RECT &rect) { POINT lt = {rect.left,rect.top}; POINT rb = {rect.right,rect.bottom}; ScreenToClient(hwndParent,&lt); ScreenToClient(hwndParent,&rb); rect.left = lt.x; rect.top = rb.x; rect.bottom = rb.y; } #if 0 //消息回調函數 測試坐标系轉換 BOOL CALLBACK dlgFunc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_COMMAND: switch(wParam) { case IDCANCEL: EndDialog(hwndDlg,IDCANCEL); break; } case WM_SETCURSOR: //當鼠标靠近或者切換到不同的控件時回調 { HWND hwnd = (HWND)wParam; if(hwnd != GetDlgItem(hwndDlg,IDOK)) return TRUE; RECT rect; GetWindowRect(hwnd,&rect); //獲取按鈕的屏幕坐标 ScreenToClient(hwndDlg,rect); rect.left -=100; rect.right -= 100; MoveWindow(hwnd,rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,TRUE); return TRUE; } break; } return FALSE; } #endif int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { //MessageBox(NULL,"first program","note",0); DialogBox(hInstance,(LPCTSTR)ws,NULL,dlgFunc); return 0; }

運行效果:

mfc簡單繪圖程序(MFC三種繪圖模式六種圖形對象)7

-End-

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved