天天看點

MingW環境下的windows程式設計

一般在進行windows程式設計時都使用vc++精簡版,其插入菜單,圖檔等資源等更簡單,且vc中對中文有更好的支援,win7下安裝的Mingw中文并不能很好地顯示,有光标顯示的位置和光标實際位置不符的問題。

MingW建立windows程式的工程,在new時要選擇projects中的win32 application

windows程式設計基礎:

windows程式設計的核心是消息驅動,要了解消息機制。

WinMain函數,該函數是windows程式的入口函數,在其中建立了視窗類(WNDCLASSEX)對象,并對其進行了各種設定,包括視窗類的名字(lpszClassName),所屬執行個體句柄的設定,消息處理函數的設定,視窗類圖示,菜單,滑鼠,背景色等等的設定。然後注冊該視窗類。

接着用上面注冊的視窗類來建立視窗,使用CreateWindow函數,其中的參數需要指定,視窗類名,視窗标題,視窗風格,視窗的坐标和長寬,執行個體句柄等等。接着用ShowWindow(hwnd, nWinMode);UpdateWindow(hwnd);來顯示視窗,接着是處理使用者的消息,TranslateMessage用來翻譯(解析)消息,DispatchMessage用來派發消息到相應的消息隊列。

WindowFunc(名字可以不一樣)是消息處理函數,其中主要是一個swich語句塊,各種消息都有相應的辨別符,其中WM_PAINT是重繪消息,當視窗被遮擋後重制或重新顯示時,都會被執行。若不處理這個消息,則視窗很可能不能正常顯示。

switch的結尾一般是這兩句:

case WM_DESTROY: PostQuitMessage(0);    break;

default: return DefWindowProc(hwnd, message, wParam, lParam);

當你點選視窗右上角的叉就會發出WM_DESTROY消息,PostQuitMessage(0);隻是直接發送一個消息到處理函數(不經過消息隊列)進行處理,真正進行退出程式操作的是DefWindowProc中進行的。

插入資源:

在vc++中給程式插入資源是可以直接在直接在菜單欄中選擇插入->資源,就可以友善地可視化地建立各種資源。MingW中必須要自己手動編寫資源檔案,點選File -> New -> ResourceScript來建立資源腳本檔案。資源檔案放在MingW工程中的Resource Files檔案夾中。MingW中工程的目錄結構如下:

MingW環境下的windows程式設計

以菜單的資源腳本檔案為例,代碼如下:

// Menu.rc
#include "Menu.h"

// Menu
MYMENU MENU DISCARDABLE 
BEGIN
    POPUP "檔案&F"
    BEGIN
		MENUITEM "OpenFile",	IDM_FILE_OPEN
		MENUITEM "Exit",	IDM_EXIT
		POPUP "1h&H"
		BEGIN
			MENUITEM "2",102
		END
		
    END

	POPUP "圖象變換&T"
	BEGIN
		MENUITEM "負像",			IDM_INVERT
		MENUITEM "仿射變換",		IDM_F
	END
	
    MENUITEM "幫助&H",				IDM_HELP
END
           

首先是菜單的名字:MYMENU,接下去一個begin,end語句塊來對這個菜單進行定義,POPUP指定彈出菜單。彈出菜單隻負責彈出子菜單項不會執行功能,是以它不需要指定标志符,接下去的begin,end語句指定改彈出菜單要彈出的菜單項,該菜單項也可以是彈出菜單,即彈出菜單可以嵌套,這就是多級菜單。MENUITEM指定點選後會執行特定功能的菜單項,這些菜單項都要有一個标志符,辨別符是一個整數,一般标志符會定義在頭檔案中,比如這裡Menu.h,代碼如下:

// Menu.h
#define IDM_FILE			100
#define IDM_FILE_OPEN		101
#define IDM_EXIT			102

#define IDM_TRANS			200
#define IDM_INVERT			201
#define IDM_F				202

#define IDM_HELP			300
           

在資源檔案中要使用這些标志符,則要在頭部include相應的頭檔案。

要注意這些菜單名字中&後的字母表示該菜單的快捷鍵,若是頂級菜單,按alt+該字母等于點選該菜單,若是子菜單,則在父菜單打開的情況下直接按該字母就相當于點選該菜單。

雙緩沖技術:

雙緩沖技術是windows程式設計中常用的消除閃爍的方法。所謂雙緩沖技術就是應用程式在記憶體中建立一個和螢幕相相容的圖形裝置上下文。該上下文實際上處理一個儲存在記憶體中的BMP圖檔對象,這樣就容許應用程式緩慢地在這個BMP上繪制圖形。應用程式繪制完畢,就用WIN32API函數 BitBlt來将BMP圖檔填充到顯存中,BitBlt函數速度非常快,足以在螢幕的重新整理周期内完成繪圖,這樣能基本上避免閃爍。但雙緩沖也有缺點,首先增加程式複雜度,其次要消耗一些記憶體,還有它讓整個繪圖時間變長,導緻使用者進行滾動時會産生“界面沉重感”,有“慣性”,此外還讓人偷懶而不注意繪圖操作的優化。