windows程式設計(9):簡單的GDI對象

來源:互聯網
上載者:User

第一個要介紹的是畫筆。

通常我們理解的劃線,應該是在劃線函數中指明,我這條線畫出來應該有多寬,線的類型是什麼(比如虛線,點劃線,實現)等等。而且很多地方就是這樣做的,比如開源電腦視覺庫OpenCV,Matlab等等中就是這樣。但是Windows程式設計卻是另一種思路:我先設計一個畫筆,這根筆決定了我劃線的顏色,粗細,線型等等。然後選擇這根筆,最後劃線。這樣做好處其實也很多,大家如果習慣了word或者visio裡面的繪圖的話,也不難理解這樣做的方便之處。

舉一個例子:

#include <windows.h>#include <math.h>#define NUM 1000#define TWOPI (2*3.14159)#define LOGWIDE 4000#define LOGHIGH 3000LRESULT CALLBACK WndProc (HWND,UINT,WPARAM,LPARAM);int WINAPI WinMain(HINSTANCE hInstance,//當前執行個體控制代碼   HINSTANCE hPrevInstance, //先前執行個體控制代碼   LPSTR lpCmdLine,//命令列   int iCmdShow)//顯示狀態{static TCHAR szAppName[] = TEXT("畫圖");//視窗控制代碼HWND hwnd;//訊息MSG msg;//視窗類別WNDCLASS wndclass;//視窗風格:當移動視窗或者改變大小時重繪視窗wndclass.style   =  CS_HREDRAW | CS_VREDRAW;//指明回呼函數wndclass.lpfnWndProc   = WndProc;//額外的位元用來確認下一個視窗類別的位置,暫時不用wndclass.cbClsExtra    = 0;//額外的位元用來確認下一個視窗執行個體的位置,暫時不用wndclass.cbWndExtra    = 0;//執行個體控制代碼wndclass.hInstance     = hInstance;//裝載表徵圖wndclass.hIcon   = LoadIcon(NULL, IDI_APPLICATION);//裝載游標wndclass.hCursor       = LoadCursor(NULL,IDC_ARROW);//背景為白色wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);//菜單:暫時沒有wndclass.lpszMenuName  = NULL;//視窗類別名wndclass.lpszClassName = szAppName;//註冊視窗if(!RegisterClass(&wndclass)){return -1;}//建立視窗hwnd = CreateWindow(szAppName,//視窗類別的名稱,必須是已經註冊的TEXT("我的畫圖"),//視窗標題WS_OVERLAPPEDWINDOW,//視窗風格CW_USEDEFAULT,//X座標CW_USEDEFAULT,//Y座標CW_USEDEFAULT,//寬度CW_USEDEFAULT,//高度NULL,//父視窗控制代碼NULL,//菜單視窗控制代碼hInstance,//進階版本的windos忽略NULL);//顯示視窗//ShowWindow(hwnd,SW_SHOWNA);ShowWindow (hwnd, iCmdShow);//更新視窗UpdateWindow(hwnd);//訊息迴圈while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);//將訊息給視窗DispatchMessage(&msg);}return msg.wParam;}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){HDC hdc;HPEN hPen;PAINTSTRUCT ps;int i;static int cxClient,cyClient;POINT apt[NUM];switch(message){case WM_SIZE:cxClient = LOWORD(lParam);cyClient = HIWORD(lParam);return 0;case WM_PAINT:hdc = BeginPaint(hwnd,&ps);for(i = 0; i < 256;i++){/*//建立畫筆:參數為:畫筆風格,畫筆寬度,畫筆顏色hPen = CreatePen(PS_SOLID,i,RGB(i,0,0));SelectObject(hdc,hPen);MoveToEx(hdc,300,200,NULL);LineTo(hdc,300,500);DeleteObject(hPen);Sleep(10);*/MoveToEx(hdc,0,cyClient/2,NULL);LineTo(hdc,cxClient,cyClient/2);MoveToEx(hdc,0,cyClient/2,NULL);//畫正弦曲線for(i = 0; i < NUM;i++){hPen = CreatePen(PS_SOLID,(int)(i/10),RGB((int)(i/4),0,0));SelectObject(hdc,hPen);apt[i].x = i * cxClient / NUM;apt[i].y = (int)(cyClient /2*(1-sin(TWOPI *i/NUM)));LineTo(hdc,apt[i].x,apt[i].y);DeleteObject(hPen);//Sleep(10);}}EndPaint(hwnd,&ps);return 0;case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc(hwnd,message,wParam,lParam);}

 

還是畫正弦曲線,但是每畫一筆,我都要改變線的寬度和顏色,其中(i/10)和(i/4)僅僅是為了讓寬度和顏色的變化不會太快。

然後要介紹的是關於寫字方面的內容DrawText。

首先要明白,你在視窗上寫字DrawText時,要注意3中顏色:第一是背景的顏色,這通過wndclass.hbrBackground = (HBRUSH) GetStockObject (GRAY_BRUSH);改變;第二是你寫的那些字顏色,通過SetTextColor(hdc,RGB(255,0,0));改變;第三是你寫的那些字的背景顏色,就是說你寫的那些字,佔用了一個個方格,這些格子的背景是什麼顏色的,這通過SetBkColor(hdc,RGB(128,128,128));來改變。但在通常情況下,我們把字的背景設為透明SetBkMode(hdc,TRANSPARENT);,讓它隨著視窗顏色變化而變化。下面我們看看這個簡單的程式:

#include <windows.h>#include <math.h>LRESULT CALLBACK WndProc (HWND,UINT,WPARAM,LPARAM);int WINAPI WinMain(HINSTANCE hInstance,//當前執行個體控制代碼   HINSTANCE hPrevInstance, //先前執行個體控制代碼   LPSTR lpCmdLine,//命令列   int iCmdShow)//顯示狀態{static TCHAR szAppName[] = TEXT("畫圖");//視窗控制代碼HWND hwnd;//訊息MSG msg;//視窗類別WNDCLASS wndclass;//視窗風格:當移動視窗或者改變大小時重繪視窗wndclass.style   =  CS_HREDRAW | CS_VREDRAW;//指明回呼函數wndclass.lpfnWndProc   = WndProc;//額外的位元用來確認下一個視窗類別的位置,暫時不用wndclass.cbClsExtra    = 0;//額外的位元用來確認下一個視窗執行個體的位置,暫時不用wndclass.cbWndExtra    = 0;//執行個體控制代碼wndclass.hInstance     = hInstance;//裝載表徵圖wndclass.hIcon   = LoadIcon(NULL, IDI_APPLICATION);//裝載游標wndclass.hCursor       = LoadCursor(NULL,IDC_ARROW);//背景為白色//wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);//背景為灰色wndclass.hbrBackground = (HBRUSH) GetStockObject (GRAY_BRUSH);//菜單:暫時沒有wndclass.lpszMenuName  = NULL;//視窗類別名wndclass.lpszClassName = szAppName;//註冊視窗if(!RegisterClass(&wndclass)){return -1;}//建立視窗hwnd = CreateWindow(szAppName,//視窗類別的名稱,必須是已經註冊的TEXT("我的畫圖"),//視窗標題WS_OVERLAPPEDWINDOW,//視窗風格CW_USEDEFAULT,//X座標CW_USEDEFAULT,//Y座標CW_USEDEFAULT,//寬度CW_USEDEFAULT,//高度NULL,//父視窗控制代碼NULL,//菜單視窗控制代碼hInstance,//進階版本的windos忽略NULL);//顯示視窗//ShowWindow(hwnd,SW_SHOWNA);ShowWindow (hwnd, iCmdShow);//更新視窗UpdateWindow(hwnd);//訊息迴圈while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);//將訊息給視窗DispatchMessage(&msg);}return msg.wParam;}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){HDC hdc;HPEN hPen;PAINTSTRUCT ps;int i;static int cxClient,cyClient;RECT rect;switch(message){case WM_SIZE:cxClient = LOWORD(lParam);cyClient = HIWORD(lParam);return 0;case WM_PAINT:hdc = BeginPaint(hwnd,&ps);//設定背景顏色//SetBkColor(hdc,RGB(128,128,128));//將背景模式:透明SetBkMode(hdc,TRANSPARENT);//將背景模式:不透明//SetBkMode(hdc,OPAQUE);//設定字的顏色SetTextColor(hdc,RGB(255,0,0));//擷取客戶區座標GetClientRect(hwnd,&rect);  DrawText(hdc,TEXT("Hello, Windows7!"),-1,&rect,DT_SINGLELINE | DT_CENTER | DT_VCENTER);  EndPaint(hwnd,&ps);return 0;case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc(hwnd,message,wParam,lParam);}

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.