




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Windows的圖形設備介面及windows繪圖Windows圖形設備介面(GDI)是為與設備無關的圖形設計的。所謂設備的無關性,就是操作系統遮罩了硬體設備的差異,因而設備無關性能使用戶編程時無需考慮特殊的硬體設置一、圖形設備按口(GDI)GDI負責系統與用戶或繪圖程式之間的資訊交換,並控制在輸出設備上顯示圖形或文字,是Windows系統的重要組成部分Windows支持與設備無關的圖形利用GDI和Windows設備驅動程式開發人員只要建立與輸出設備的關聯,讓系統加載相應的設備驅動程式即可1.
GDI的一些基本概念
設備描述表即為設備環境的屬性的集合應用程式與輸出設備之間的橋樑Win系統外設直接訪問不允許統一的設備環境(DC)提供使應用程式與設備相連用戶為確保圖形輸出的設備無關性應用程式設備描述表及其屬性通過設備描述表的句柄來間接地存取應用程式每一次圖形操作均參照設備描述表中的屬性執行2.圖形刷新圖形刷新是繪圖過程中必須考慮的重要問題刷新請求對刷新請求的回應刷新方法包括(1)刷新請求
應用程式在窗口中繪製了一個橢圓,顏色列表框覆蓋了橢圓的一部分關閉顏色選框後,應用程式需要恢複被覆蓋部分的顏色和形狀窗口大小的調整窗口移動被覆蓋後的恢復(2)系統對刷新請求的回應
當用戶區的內容需要刷新時,系統向應用程式消息佇列發送WM_PAINT消息,系統在應用程式的消息佇列中加入該消息,以通知窗口函數執行刷新處理三種刷新窗口移動後的刷新被覆蓋區域的刷新對象穿越後的刷新(系統自動完成)用戶區移動或顯示用戶窗口大小改變程式通過滾動條滾動窗口窗口被另一個窗口覆蓋的恢復如下拉式菜單關閉等游標穿過用戶區圖示拖過用戶區窗口被另一個窗口覆蓋的區域稱為無效區域。
Windows系統為每個窗口建立了一個PAINTSTRUCT結構,該結構中包含了包圍無效區域的一個最小矩形的結構RECT,應用程式可以根據這個無效矩形執行刷新操作。
typedefstructtagPAINTSTRUCT{HDChdc; //設備環境句柄
BOOLfErase; //一般取真值,表示擦除無效矩形的背景
RECT
rcPaint; //無效矩形標識
BOOLfRestore; //系統保留
BOOLfIncUpdate; //系統保留
BYTErgbReserved[32];//系統保留
}PAINTSTRUCT;rcPaint為標準的RECT數據結構,其作用是標識無效矩形,它包含了無效矩形的左上角和右下角的座標常用的Windows應用程式刷新窗口的方法保存副本。刷新時將副本拷貝到相應的窗口中記錄事件。刷新時重新執行這個曾經發生的事件重新繪製。將圖形繪製處理程式放在消息WM_PAINT回應模組中,刷新時重繪圖形(3)有效的刷新方法3.獲取設備環境的方法獲取設備環境是應用程式輸出圖形的先決條件,常用的兩種方法是調用函數BeginPaint或GetDC(1)調用BeginPaint函數
應用程式回應WM_PAINT消息進行圖形刷新時,主要通過調用BeginPaint函數獲取設備環境
hdc=BeginPaint(hwnd,&ps);//ps為PAINTSTRUCT類型結構定義方式為:PAINTSTRUCTps;
系統獲取設備環境的同時填寫ps結構,以標識無效矩形區由BeginPaint函數獲取的設備環境要用EndPaint函數釋放BOOLEndPaint(HWNDhwnd,PAINTSTRUCT&ps)(2)調用GetDC函數
如果繪圖工作並非由WM_PAINT消息驅動,則調用GetDC函數獲取設備環境。hdc=GetDC(hwnd);
由GetDC函數獲取的設備環境必須用ReleaseDC函數釋放
voidReleaseDC(HWNDhwnd);4.映像模式 映像模式定義了將邏輯單位轉化為設備的度量單位以及設備的x方向和y方向,程式員可在一個統一的邏輯坐標系中操作而不必考慮輸出設備的坐標系情況窗口:對應邏輯坐標系上程式員設定的區域視口:對應實際輸出設備上程式員設定的區域窗口和視口如何映射?缺省的映射模式將窗口中的對稱圖形映射到視口時仍為對稱圖形按照窗口和視口的座標比例進行映射坐標系統邏輯坐標系統設備坐標系統螢幕坐標系統窗口坐標系統用戶區坐標系統
應用程式可獲取設備環境的當前映像模式,並根據需要設置映像模式。相關函數設置設備環境的映像模式SetMapMode(hdc,nMapMode);
nMapMode為映像模式的整型識別字獲取當前設備環境的映像模式nMapMode=GetMapMode(hdc);窗口區域的定義由SetWindowExtEx函數完成,其函數原型形為:BOOLSetWindowExtEx(HDChdc, intnHeight,nWidth,//以邏輯單位表示的窗口區域高寬度
LPSIZElpSize,//函數調用前窗口區域尺寸的SIZE結構地址);視口區域的定義由SetViewportExtEx函數完成,函數原型為:BOOLSetViewportExtEx(HDChdc, intnHeight,nWidth,//以物理設備單位表示的新視口區域高寬度LPSIZElpSize );只有在映射模式為MM_ANISOTROPIC和MM_ISOTROPIC時才有意義視口的缺省原點和窗口的缺省原點均為(0,0)。可通過調用函數SetViewportOrgEx和SetWindowOrgEx設定窗口與視口的原點。SetWindowOrgEx函數的原形為:BOOLSetWindowOrgEx(HDChdc,intX,Y, //以邏輯單位表示的窗口原點座標LPPOINTlpPoint //函數調用前原點座標的POINT結構的地址);只有在映射模式為MM_ANISOTROPIC和MM_ISOTROPIC時才有意義二、繪圖工具與顏色1.畫筆(1)畫筆的創建使用畫筆之前必須事先定義一個畫筆句柄。形式如下:HPENhP;然後調用函數GetStockObject獲取Windows系統定義的四種畫筆例如獲取畫筆BLACK_PEN的形式如下:
hP=GetStockObject(BLACK_PEN);WHITE_PENBLACK_PENDC_PENNULL_PEN畫筆的操作創建畫筆將畫筆選入設備環境刪除畫筆(2)創建新畫筆,形式如下:hP=CreatePen(intnPenStyle, //確定畫筆樣式intnWidth, //畫筆寬度COLORREFrgbColor//畫筆顏色);創建畫筆後,必須調用SelectObject函數將其選入設備環境。
SelectObject(hdc,hP);//hP為所創建或獲取的畫筆句柄不再使用當前畫筆時,需刪除畫筆,以免占記憶體
DeleteObject(hP);PS_DASH: 虛線 PS_DASHDOT: 點劃線 PS_DASHDOTDOT: 雙點劃線PS_DOT: 點線 PS_INSIDEFRAME: 實線PS_NULL: 無 PS_SOLID: 實線2.畫刷畫刷的創建與應用與畫筆很相似,操作畫刷也包括創建、選入設備環境和刪除。(1)畫刷的創建使用畫刷需事先定義一個畫刷句柄。形式如下:
HBRUSH
hBr;//hBr為畫刷句柄
然後調用函數GetStockObject獲取Windows系統提供的7種畫刷
hBr=(HBRUSH)GetStockObject(nBrushStyle)畫刷樣式BLACK_BRUSH 黑色畫刷DKGRAY_BRUSH 深灰色畫刷GRAY_BRUSH 灰色畫刷HOLLOW_BRUSH 虛畫刷LTGRAY_BRUSH 亮灰色畫刷NULL_BRUSH 空畫刷 WHITE_BRUSH 白色畫刷指定顏色畫刷如何獲得?可調用函數CreateSolidBrush和CreateHatchBrush創建畫刷,hBr=CreateSolidBrush(rgbColor);
創建具有指定顏色的單色畫刷創建指定陰影圖案和顏色的畫刷(2)選入設備環境
創建畫刷後,通過SelectObject(hdc,hBr);將其選入設備環境(3)
刪除畫刷不使用畫刷時,可用DeleteObject(hBr);刪除畫刷,釋放記憶體hBr=CreateHatchBrush(intnHctchStyle,
COLORREFrgbColor );HS_BDIAGONAL45度從左上到右下HS_DIAGCROSS45度叉線 HS_FDIAGONAL45度從左下到右上HS_CROSS
垂直相交的陰影線HS_HORIZONTAL水準陰影線HS_VERTICAL 垂直陰影線3.顏色
Windows使用宏RGB定義繪圖的顏色,其形式為:
RGB(nRed,nGreen,nBlue)
紅色值藍色值綠色值RGB(255,0,0)RGB(0,255,0)RGB(0,0,255)三、常用繪圖函數1.設置畫筆當前位置的函數MoveToEx,
BOOL
MoveToEx(HDChdc,intX,Y, //X、Y分別為新位置的邏輯座標
LPPOINTlpPoint //存放原畫筆位置的POINT結構地址)2.從當前位置向指定座標點畫直線的函數LineToEx,BOOLLineToEx(HDChdc,intX,intY)//X和Y為線段的終點座標3.從當前位置開始,依次用線段連接lpPoints中指定的各點BOOLPolyline
(HDChdc,LPPOINTlpPoints,//指向包含各點座標的POINT結構數組的指針
intnCount //nCount為POINT數組中點的個數)4.繪製橢圓弧線的函數Arc,BOOLArc(HDChdc,intX1,intY1, //邊框矩形左上角的邏輯座標intX2,intY2, //邊框矩形右下角的邏輯座標intX3,intY3, //橢圓弧起始點座標intX4,intY4 //橢圓弧終止點座標)(x1,y1)(x2,y2)(x3,y3)(x4,y4)所畫曲線5.繪製餅圖,並用當前畫刷進行填充BOOLPie(HDChdc,intX1,intY1, //邊框矩形左上角的邏輯座標intX2,intY2, //邊框矩形右下角的邏輯座標intX3,intY3, //橢圓弧起始經線的確定點座標intX4,intY4 //橢圓弧終止經線的確定點座標)(x1,y1)(x2,y2)(x3,y3)(x4,y4)所填區域6.繪製矩形,並用當前畫刷進行填充BOOLRectangle(HDChdc,intX1,intY1,intX2,intY2)(X1,Y1)和(X2,Y2)分別為矩形的左上角和右下角的邏輯座標7.繪製圓角矩形,並用當前畫刷填充BOOLRoundRect(HDChdc,intX1,intY1,intX2,intY2,
intnHeight,intnWidth)圓角的高度和寬度8.繪製橢圓,並用當前畫刷填充
BOOLEllipse(HDChdc,intX1,intY1,intX2,intY2)9.繪製多邊形,並用當前畫刷填充
BOOLPolygon(HDChdc,LPPOINTlpPoints,intnCount)包含各點座標的POINT數組的地址多邊形點的個數四、應用實例【例4-1】利用繪圖函數創建填充區。共有三個填充圖形,第一個是用深灰色畫刷填充帶圓角的矩形,第二個是採用亮灰色畫刷填充一個橢圓型圖,第三個是用虛畫刷填充餅形圖。#include<windows.h>#include<stdlib.h>#include<string.h>longWINAPIWndProc
( HWNDhWnd, UINTiMessage, UINTwParam, LONGlParam );使用虛畫刷填充時,看不出填充效果!!!BOOLInitWindowsClass(HINSTANCEhInstance);BOOLInitWindows(HINSTANCEhInstance,intnCmdShow);intWINAPIWinMain //主函數
(HINSTANCEhInstance, HINSTANCEhPrevInstance, LPSTRlpCmdLine,
intnCmdShow){ MSGMessage; if(!InitWindowsClass(hInstance)) returnFALSE; if(!InitWindows(hInstance,nCmdShow)) returnFALSE;
while(GetMessage(&Message,0,0,0)) //消息迴圈
{
TranslateMessage(&Message); DispatchMessage(&Message); } returnMessage.wParam;}longWINAPIWndProc(HWNDhWnd,UINTiMessage, UINTwParam,LONGlParam){HDChDC; //定義指向設備的句柄
HBRUSHhBrush; //定義指向畫刷的句柄
HPENhPen; //定義指向畫筆的句柄
PAINTSTRUCTPtStr;//定義指向包含繪圖資訊的結構體變數消息處理函數switch(iMessage) //處理消息{caseWM_PAINT:
//處理繪圖消息
hDC=BeginPaint(hWnd,&PtStr);
SetMapMode(hDC,MM_ANISOTROPIC);
//設置映像模式
hPen=(HPEN)GetStockObject(BLACK_PEN); //黑色畫筆
hBrush=(HBRUSH)GetStockObject(DKGRAY_BRUSH);//畫刷
SelectObject(hDC,hBrush);//選擇畫刷
SelectObject(hDC,hPen);//選擇畫筆
RoundRect(hDC,50,120,100,200,15,15);//繪製圓角矩形
hBrush=(HBRUSH)GetStockObject(LTGRAY_BRUSH);//採用亮灰色畫刷下麵只改變畫刷,不改變筆
SelectObject(hDC,hBrush); //選擇畫刷
Ellipse(hDC,150,50,200,150); //繪製橢圓
hBrush=(HBRUSH)GetStockObject(HOLLOW_BRUSH);//虛畫刷
SelectObject(hDC,hBrush); //選擇畫刷
Pie(hDC,250,50,300,100,250,50,300,50); //繪製餅形
EndPaint(hWnd,&PtStr); //結束繪圖
return0;caseWM_DESTROY:
//結束應用程式
PostQuitMessage(0);return0;default: //其他消息處理程式
return(DefWindowProc(hWnd,iMessage,wParam,lParam));}}BOOLInitWindows(HINSTANCEhInstance,intnCmdShow)//初始化窗口{ HWNDhWnd;
hWnd=CreateWindow("WinFill",//生成窗口
"填充示例程式",
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if(!hWnd) returnFALSE; ShowWindow(hWnd,nCmdShow); //顯示窗口
UpdateWindow(hWnd); returnTRUE;}BOOLInitWindowsClass(HINSTANCEhInstance) //定義窗口類{WNDCLASSWndClass;WndClass.cbClsExtra=0;WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH));WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);WndClass.hIcon=LoadIcon(NULL,"END");WndClass.hInstance=hInstance;WndClass.lpfnWndProc=WndProc;WndClass.lpszClassName="WinFill";WndClass.lpszMenuName=NULL;WndClass.style=CS_HREDRAW|CS_VREDRAW;returnRegisterClass(&WndClass);}例4-2:應用畫筆和畫刷等工具繪製如圖所示的圖形1…#include<windows.h>2…#include<stdlib.h>3…#include<string.h>4…
longWINAPIWndProc(HWNDhWnd,UINTiMessage,UINTwParam,LONGlParam);5…BOOLInitWindowsClass(HINSTANCEhInstance);6…BOOLInitWindows(HINSTANCEhInstance,intnCmdShow);7…//主函數8…intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow)9…{ MSGMessage;10… if(!InitWindowsClass(hInstance)) returnFALSE;11… if(!InitWindows(hInstance,nCmdShow)) returnFALSE;12… while(GetMessage(&Message,0,0,0)) //消息迴圈13… { TranslateMessage(&Message);14… DispatchMessage(&Message);}15… returnMessage.wParam;}longWINAPIWndProc(HWNDhWnd,UINTiMessage,UINTwParam,LONGlParam)1…{HDChDC; //定義設備環境句柄2…HBRUSHhBrush; //定義畫刷的句柄3…HPENhPen; //定義畫筆的句柄4…PAINTSTRUCTPtStr; //定義指向包含繪圖資訊的結構體變數
//定義一個POINT數組,包括6個點
5…POINTpoints[6]={{100,212},{70,227},{70,250},{130,250},{130,227},{100,212}};6…switch(iMessage) //處理消息
7…{
caseWM_PAINT: //處理繪圖消息
8… hDC=BeginPaint(hWnd,&PtStr);9… hPen=(HPEN)GetStockObject(NULL_PEN);//獲取系統定義的空畫筆10… SelectObject(hDC,hPen); //選擇畫筆11… hBrush=(HBRUSH)GetStockObject(BLACK_BRUSH);//獲取系統定義的畫刷12… SelectObject(hDC,hBrush); //選擇畫刷13… LineTo(hDC,50,50); //畫線14… DeleteObject(hPen); //刪除畫筆15… hPen=CreatePen(PS_SOLID,2,RGB(255,0,0));//創建畫筆16… SelectObject(hDC,hPen); //選擇畫筆
//畫一個三角形17… LineTo(hDC,150,50);18… LineTo(hDC,100,137);19… LineTo(hDC,50,50);1… Polyline(hDC,points,6);
//畫一個五邊形2… Arc(hDC,63,137,138,212,100,137,100,137); //畫一個圓3… Pie(hDC,213,137,288,212,240,137,260,137); //畫一個圓餅4… Rectangle(hDC,213,212,287,250); //畫一個長方形5… RoundRect(hDC,213,100,287,137,20,20);//畫一個圓角長方形6… DeleteObject(hPen);//刪除畫筆7… DeleteObject(hBrush);//刪除畫刷8… EndPaint(hWnd,&PtStr);//結束繪圖9… return0;10…caseWM_DESTROY://結束應用程式11… PostQuitMessage(0);12… return0;13…default://其他消息處理程式14… return(DefWindowProc(hWnd,iMessage,wParam,lParam));}}BOOLInitWindows(HINSTANCEhInstance,intnCmdShow)//初始化窗口{ HWNDhWnd; hWnd=CreateWindow("WinFill", //生成窗口
"填充示例程式",
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if(!hWnd) returnFALSE; ShowWindow(hWnd,nCmdShow); //顯示窗口
UpdateWindow(hWnd); returnTRUE;}BOOLInitWindowsClass(HINSTANCEhInstance) //定義窗口類{WNDCLASSWndClass;WndClass.cbClsExtra=0;WndClass.cbWndExtra=0;WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH));WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);WndClass.hIcon=LoadIcon(NULL,"END");WndClass.hInstance=hInstance;WndClass.lpfnWndProc=WndProc;WndClass.lpszClassName="WinFill";WndClass.lpszMenuName=NULL;WndClass.style=CS_HREDRAW|CS_VREDRAW;returnRegisterClass(&WndClass);}【例4-3】設置映射與使用映射模式。程式的初始階段按模式MM_TEXT繪圖,用戶單擊滑鼠以改變映射模式,單擊左鍵,產生WM_LBUTTONDOWN消息,通知應用程式設置映射模式為ISOTROPIC,並調用InvalidateRect函數刷新用戶區,在用戶單擊滑鼠右鍵時,產生WM_RBUTTONDOWN消息,應用程式將映射模式設置成ANSIOTROPIC,同時刷新用戶區。LRESULTCALLBACKWndProc(…,…,…,…){HDChdc;PAINTSTRUCTps;HBRUSHhB1,hB2;switch(message){caseWM_LBUTTONDOWN: //單擊滑鼠左鍵的消息
nMode=MM_ISOTROPIC; //更改映射模式為MM_ISOTROPIC InvalidateRect(hwnd,NULL,1); //刷新用戶區
break;caseWM_RBUTTONDOWN: //單擊滑鼠右鍵消息
nMode=MM_ANISOTROPIC; //更改顯示模式為MM_ANISOTROPIC InvalidateRect(hwnd,NULL,1); //刷新用戶區
break;caseWM_PAINT: hdc=BeginPaint(hwnd,&ps); //取得設備環境句柄
SetMapMode(hdc,nMode); //設置映射模式
SetWindowExtEx(hdc,150,150,NULL); //設置窗口區域
SetViewportExtEx(hdc,150,100,NULL); //設置視口區域
SetViewportOrgEx(hdc,150,60,NULL); //設置視口原點
hB1=(HBRUSH)GetStockObject(WHITE_BRUSH);//定義白色畫刷
hB2=(HBRUSH)GetStockObject(BLACK_BRUSH);//定義黑色畫刷
SelectObject(hdc,hB1); //將黑白刷選入設備環境
RoundRect(hdc,0,0,150,150,30,30); //繪製圓角矩形並填充
SelectObject(hdc,hB2); //更改當前畫刷為黑色畫刷
Ellipse(hdc,0,10,150,140); //繪製橢圓並填充
EndPaint(hwnd,&ps); //釋放設備環境句柄
DeleteObject(hB1); //刪除畫刷句柄
DeleteObject(hB2); break;caseWM_DESTROY: PostQuitMessage(0); break;default: returnDefWindowProc(hwnd,message,wParam,lParam);}return0;}【例4-4】編寫一個程式,在螢幕上出現一個圓心沿正弦曲線軌跡移動的實心圓,而且,每隔四分之一週期,圓的填充色和圓的周邊顏色都發生變化,同時,圓的半徑在四分之一週期之內由正弦曲線幅值的0.2倍至0.6倍線性增長。(1)正弦曲線是此題的基礎。在WndMain()函數消息迴圈前,生成正弦曲線各點的座標。把正弦曲線一個週期的橫坐標分成100個等分點,存儲在數組lpSin[100]中,100個點的座標計算如下:for(intj=0;j<100;j++) //生成正弦曲線的點座標
{
lpSin[j].x=(long)(j*2*Pi/100*60); lpSin[j].y=(long)(dfRange*sin(j*2*Pi/100));}(2)動態顯示圓在正弦曲線上移動數組lpSin[100]的長度為100設定圓在正弦曲線移動時共有100個位置數組中每一個值是圓移動時圓心的座標每四分之一週期有25個位置i<=25 處於第1個1/4週期,創建紅色畫筆和畫刷;25<i<50 處於第2個1/4週期,創建綠色畫筆和畫刷;50<i<75 處於第3個1/4週期,創建藍色畫筆和畫刷;75<i<100 處於第4個1/4週期,創建黃色畫筆和畫刷;if(i<=25) //第一個1/4週期{
hPen=CreatePen(PS_DASH,1,RGB(255,0,0));
hBrush=CreateHatchBrush(HS_BDIAGONAL,RGB(255,0,0));lRadious=(long)(dfRange*0.2+i%25*dfRange*0.4/25);//計算半徑}在消息WM_PAINT處理程式中,調用函數BeginPaint()獲得設備環境句柄。由此經過線性差分計算圓半徑的大小lRadious,第1個1/4週期的程式代碼如下:創建的畫筆和畫刷選入設備環境後,調用函數Ellipse(…)繪製圓形下麵這段代碼是動態顯示的關鍵:
Sleep(100); //停0.1秒
if(i<100)InvalidateRect(hWnd,NULL,1);//刷新用戶區調用Sleep(100)函數使程式暫停0.1秒。所含參數100代表暫停的時間,使用毫秒作單位。i<100時調用函數刷新用戶區發送WM_PAINT消息消息發到的窗口的句柄代表刷新整個用戶區代表清除用戶區中所有的顯示內容#include<windows.h>#include<stdlib.h>#include<string.h>#include<math.h>#definePi3.1415926longWINAPIWndProc(HWNDhWnd,UINTiMessage, UINTwParam,LONGlParam);doubledfTheta=0,dfRange=100.0; //正弦曲線的角度變數.longi=0,j=0;longlCentreX=0,lCentreY=0,lRadious=(long)(0.2*dfRange); //定義圓心座標和圓半徑.POINTlpSin[100]; //定義正弦曲線的點座標.intWINAPIWinMain(…,…,…,...){ ……//填寫窗口類屬性
if(!RegisterClass(&WndClass)) //註冊窗口. { MessageBeep(0); returnFALSE;}hWnd=CreateWindow
("SIN", //窗口類名. "4_6", //標題名.
WS_OVERLAPPEDWINDOW, //帶標題欄,最大/小按鈕的窗口
CW_USEDEFAULT, //窗口左上角座標. 0,
CW_USEDEFAULT, //採用缺省的寬度和高度. 0,
NULL, //無父窗口.
NULL, //無主菜單.
hInstance, //當前實例句柄.
NULL);.
ShowWindow(hWnd,nCmdShow); //顯示窗口.
UpdateWindow(hWnd); //更新並繪製用戶區.1. for(intj=0;j<100;j++) //生成正弦曲線的點座標.2. {3. lpSin[j].x=(long)(j*2*Pi/100*60);4. lpSin[j].y=(long)(dfRange*sin(j*2*Pi/100));5. }
6. while(GetMessage(&Message,0,0,0))7. {8. TranslateMessage(&Message); //消息迴圈.9. DispatchMessage(&Message);10. }11. returnMessage.wParam;}longWINAPIWndProc(HWNDhWnd,UINTiMessage, UINTwParam,LONGlParam){1. HDChDC; //定義設備環境句柄.2. HBRUSHhBrush; //定義畫刷句柄3. HPENhPen; //定義畫筆句柄4. PAINTSTRUCTPtStr;//定義包含繪圖資訊的結構體變數5. switch(iMessage){6.caseWM_PAINT: //處理繪圖消息7.
hDC=BeginPaint(hWnd,&PtStr); //獲得設備環境指針8.
SetWindowOrgEx(hDC,-200,-200,NULL);//設置原點座標9.
hPen=CreatePen(PS_DASH,1,RGB(255,0,0)); //建新畫筆10.
SelectObject(hDC,hPen); //選入畫筆11.
Polyline(hDC,lpSin,100); //繪製正弦曲線if(i<=25)//第一個1/4週期.{
hPen=CreatePen(PS_DASH,1,RGB(255,0,0)); hBrush=CreateHatchBrush(HS_BDIAGONAL,RGB(255,0,0)); lRadious=(long)(dfRange*0.2+i%25*dfRange*0.4/25);//計算半徑}elseif(i<=50)//第二個1/4週期.{
hPen=CreatePen(PS_DASH,1,RGB(0,255,0));
hBrush=CreateHatchBrush(HS_DIAGCROSS,RGB(0,255,0));
lRadious=(long)(dfRange*0.2+i%25*dfRange*0.4/25);}elseif(i<=75)//第三個週期.{
hPen=CreatePen(PS_DASH,1,RGB(0,0,255));
hBrush=CreateHatchBrush(HS_CROSS,RGB(0,0,255));
lRadious=(long)(dfRange*0.2+i%25*dfRange*0.4/25);}else//第四個週期.{
hPen=CreatePen(PS_DASH,1,RGB(255,255,0));
hBrush=CreateHatchBrush(HS_VERTICAL,RGB(255,255,0));
lRadious=(long)(dfRange*0.2+i%25*dfRange*0.4/25);}1.
SelectObject(hDC,hBrush); //選入畫刷.2.
SelectObject(hDC,hPen); //選入畫筆.3.
lCentreX=lpSin[i].x; //圓心x座標.4.
lCentreY=lpSin[i].y; //圓心y座標.5. Ellipse(hDC,lCentreX-lRadious,lCentreY-lRadious, lCentreX+lRadious,lCentreY+lRadious);//畫圓6. i++;7. DeleteObject(hPen); //刪除畫筆8. DeleteObject(hBrush); //刪除畫刷9. EndPaint(hWnd,&PtStr); //刪除設備環境指針10. Sleep(100); //停0.1秒11. if(i<100)InvalidateRect(hWnd,NULL,1); //刷新用戶區12. return0;13. caseWM_DESTROY: //關閉窗口.14. PostQuitMessage(0); return0;15. default:16. return(DefWindowProc(hWnd,iMessage,wParam,lParam));}}【例4-5】繪圖與刷新。制訂一種重新繪製圖形的刷新方式,將圖形繪製模組放在消息WM_PAINT的處理過程中,當窗口需要刷新時,通知窗口函數重新繪製圖形以完成刷新工作。本例要求先使用畫筆和畫刷繪製一個矩形,然後使用紅色網格繪製一個橢圓,再使用綠色點劃線繪製橢圓的軸線。#include<windows.h>#include<string.h>#include<stdlib.h>#include<stdio.h>LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInst,
LPSTRlpszCmdLine, intnCmdShow){HWNDhwnd; MSGMsg; WNDCLASSwndclass;charlpszClassName[]="基本繪圖";
charlpszTitle[]="My_Drawing";wndclass.style=0;
……
//填寫屬性
wndclass.lpszClassName=lpszClassName;if(!RegisterClass(&wndclass)) {MessageBeep(0);returnFALSE;}hwnd=CreateWindow(…,………,…);ShowWindow(hwnd,nCmdShow); UpdateWindow(hwnd);while(GetMessage(&Msg,NULL,0,0)) {TranslateMessage(&Msg);DispatchMessage(&Msg);}returnMsg.wParam;}LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,
WPARAMwParam,LPARAMlParam){HDChdc;PAINTSTRUCTps;HPENhP; //定義畫筆句柄
HBRUSHhB; //定義畫刷句柄
switch(message){
caseWM_PAINT: //通過回應WM_PAINT消息完成繪圖工作
hP=CreatePen(PS_DASHDOT,1,RGB(0,255,0));//自定義綠筆
//所畫線條為點劃線,寬度為1
hB=CreateHatchBrush(HS_CROSS,RGB(255,0,0));//紅色網狀
hdc=BeginPaint(hwnd,&ps);//取得設備環境句柄
SetMapMode(hdc,MM_TEXT); //設置映射模式,用缺省模式
//使用當前缺省畫筆、畫刷進行繪圖
Rectangle(hdc,130,60,270,200); //繪製矩形,並填充
SelectObject(hdc,hB); //更新畫刷,用“紅色網狀”
Ellipse(hdc,130,70,270,190);//繪製橢圓,並填充
SelectObject(hdc,hP); //更新畫筆,選“自定義綠筆”
MoveToEx(hdc,100,130,NULL);/
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 计算机基础知识点更新的试题及答案
- 西北大学《诊断学(一)》2023-2024学年第二学期期末试卷
- 2024-2025学年贵州省黔东南州凯里六中学初三全真四模英语试题试卷含答案
- 福建省福州市第一中学2024-2025学年高中毕业班第三次诊断性测试语文试题试卷含解析
- 湖北师范大学文理学院《数字影像合成》2023-2024学年第二学期期末试卷
- 2025【店铺转让合同范本】商业转让合同模板
- 宠物营养对免疫系统的影响及试题答案
- 张家口市阳原县文职辅警招聘考试真题
- 学校食堂等集中用餐单位落实“日管控 周排查月调度”风险防控机制指引(试行)
- 2025年全国爱卫生日健康教育宣传主题班会课件
- 中式烹调师初级试卷
- 高考倒计时60天课件
- 幼儿园绘本故事:《十二生肖》 课件
- (完整版)人教版小学3-6年级英语单词表-可直接打印
- 机电安装总进度计划横道图
- 起重吊装作业安全综合验收记录表
- 园林绿化工程监理实施细则(完整版)
- 梦想(英语演讲稿)PPT幻灯片课件(PPT 12页)
- 中国联通员工绩效管理实施计划方案
- 法院刑事审判庭速裁庭廉政风险防控责任清单
- IEC60335-1(中文)
评论
0/150
提交评论