20170903WindowsPrj02_03_GDI

GDI:

畫畫軟件講解:

1:GDI裏面各種要做的非常多,每次使用GDI函數都需要GetDc,最後都需要回收,因此,完全可以封裝一個自己的類,創建窗口,構造對象的時候就創建好Dc,之後一直用。
2:畫線,可以通過記錄整個鼠標移動過程的方式,每次更新的時候,按照這個步驟重畫,也可以直接記錄一整張圖,每次衝刺年畫一個圖,再畫當前畫的,就好了。
3:要實現鉛筆的功能,只需要在WM_MOUSEMOVE裏面將每次移動的點用線連接起來,而不是一直畫點,這樣會不連續

4:雙緩衝繪圖:每次頁面刷新的時候,是一個一個的畫出來的,導致最後看起來頁面非常的閃,雙緩衝就是現在一個內存Dc上面畫完,花完之後直接拿過來,一次性顯示出來,這就算是雙緩衝。不同需求可能有三緩衝,多緩衝等,因爲繪圖過程非常多,比較複雜。一般在貼圖的時候,才需要緩衝,一般的簡單的畫,是不需要使用緩衝的。

Win32封裝:

1:在使用Win32的時候,消息非常多,就鼠標消息和鍵盤消息而言, 我們可以做一定的封裝,以鼠標消息爲例:
    按照程序需要實現的功能,將鼠標消息分成不同種,都繼承於一個基類,當切換功能的時候,只需要重新new一個該功能的鼠標操作對象,在系統的回調函數裏面就不需要對鼠標消息進行更改就能直接使用,在軟件需要添加功能的時候,同樣的,只需要多寫一個子類即可,修改和維護都非常方便。
    多鼠標消息的封裝就只是對鼠標消息的處理和記錄,不可以在這裏面去繪圖,處理外部的一些事情。
    同樣的,也可以對繪圖,鍵盤消息等進行封裝,因爲在Win32的回調函數裏面,這幾個消息往往一寫就是上千行,在做稍微大一點的程序的時候,就會顯得非常亂。

2:GDI API:
    1:CreateCompatibleDC,創建一個兼容DC,但是兼容DC只能是雙色的DC,也就是說,只能是黑白的圖,雙緩衝的時候,會用到兼容DC。
    2:CreateCompatibleBitmap:一般用於給創建的兼容DC創建一個兼容的BitMap,供兼容DC使用。
    3:BitBlt:用於從指定的源設備上下文像素矩形到目標設備上下文的顏色數據的位塊傳輸。可以將兼容DC的內容,拷貝到要顯示的DC上面的一個地方去。
    4:StretchBlt:與BitBlt類似,用於拷貝,但是,它可以改變原來的形狀,拷貝從源矩形成目標矩形,拉伸或壓縮位圖以適應目標矩形的尺寸,必要的位圖。系統根據目標設備上下文中設置的拉伸模式來拉伸或壓縮位圖。

打開文件對話框的創建:

函數示例:
			OPENFILENAME ofn = { 0 };
			ofn.lStructSize = sizeof(OPENFILENAME);
			ofn.lpstrFile = g_PicFilePath;
			ofn.nMaxFile = MAX_PATH;
			ofn.hwndOwner = hWnd;
			ofn.lpstrFilter = TEXT("位圖(*.bmp)\0*.bmp\0");	// 顯示\0過濾器\0顯示\0過濾器\0  最後\0結尾
			ofn.nFilterIndex = 1;
			ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST;

			if (GetOpenFileName(&ofn))
			{
				//打開成功後,對文件的處理
			}

    OPENFILENAME是打開文件對話框需要傳遞的結構體,用於指定打開文件的一些屬性,限制

Win32加載圖片:

1:加載圖片可以使用LoadBiMap,也可以使用LoadImage。後者功能更強大。
			HBITMAP SelBitmap = (HBITMAP)LoadImage(hInst, g_PicFilePath, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE);
			BITMAP bmp;
			GetObject(SelBitmap, sizeof(BITMAP), &bmp);

2:從HBITMAO中獲取到的BITMAP對象,可以衝BITMAP中獲取到位圖的長寬等信息,具體如下:
typedef struct tagBITMAP {
  LONG   bmType;//必須爲0
  LONG   bmWidth;//寬
  LONG   bmHeight;//高
  LONG   bmWidthBytes;//一橫排圖像佔用的的字節數
  WORD   bmPlanes;//色彩數
  WORD   bmBitsPixel;//指示像素顏色需要的位數
  LPVOID bmBits;//指向該位圖的指針。
} BITMAP, *PBITMAP;

3:LoadImage:
HANDLE WINAPI LoadImage(
  _In_opt_ HINSTANCE hinst,//模塊句柄,就是主函數傳進來的當前進程的實例句柄。
  _In_     LPCTSTR   lpszName,//圖片的路徑和圖片名
  _In_     UINT      uType,//圖片類型
  _In_     int       cxDesired,//指定圖標寬度
  _In_     int       cyDesired,//高度
  _In_     UINT      fuLoad//指定圖標屬性,可以輸一系列的組合
);

    1:圖片類型:只能爲IMAGE_BITMAP,IMAGE_CURSOR,或者IMAGE_ICON三種,指定加載的圖標類型。
    2:圖標屬性:可以指定圖片爲黑白,彩色,從文件加載等屬性。

控件:

控件種類:

1:在MSDN的Desktop technologies->Desktop App UI->Windows Controls裏面,可以查看Windows提供的所有控件,他們均可以在Win32裏面使用。
2:在Win32界面使用這些控件可以使用CreateWindow來創建,然後使用ShowWindow使控件顯示出來,在控件創建的時候,會指定創建窗口(每個控件都是一個窗口)的屬性,其中有一個HMENU的參數,適用於指定這個控件的ID,爲之後處理這個控件的消息使用的。
3:使用示例:
	HWND hButton7 = CreateWindow(L"BUTTON", L"7", WS_CHILD, 2, ParanH + 2, wx - 4, wy - 4, hWnd, (HMENU)IDC_NUM7, hInst, NULL);//裏面的參數需在外部定義
	ShowWindow(hButton7, SW_SHOW);

4:在響應這些控件的消息的時候,可能一個控件有多種消息需要響應,也需要獲取這些控件傳遞給消息函數的參數,例如位置,鼠標鍵盤消息,具體的參考MSDN的例子。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章