網頁

搜尋此網誌

2010年2月2日 星期二

Windows Programming 視窗程式設計

談談Microsoft Windows視窗程式設計,想要在Windows作業系統上開發視窗程式,主要有幾個方法:
  1. 使用Windows API
  2. 使用MFC(Microsoft Foundation Classes)
  3. 使用Windows Forms
以系統的視野(view)來看:Windows API最底層,MFC中間,Windows Forms最上層,開發與使用程度來說是Windows Forms最簡單方便,最底層的Windows API則是最不容易使用(但還是可以用,基礎是最重要)。

此篇主要討論利用Windows API開發視窗應用程式的觀念,不例外的推薦一書:
Jeffrey Richter, Christophe Nasarre 著,葛子昂、周靖、廖敏 譯,Windows應用程式開發經典,台北:悅知文化,2009。

Windows視窗程式設計可以參考MSDN的資料,這些都是基本觀念,值得一看,所謂「Basic is important」。
  1. What Is a Window?:http://msdn.microsoft.com/en-us/library/ff381403(VS.85).aspx
  2. WinMain: The Application Entry Point:http://msdn.microsoft.com/en-us/library/ff381406(VS.85).aspx
  3. Module 1. Your First Windows Program:http://msdn.microsoft.com/en-us/library/ff381409(VS.85).aspx
其中有個重要的觀念:Window Handles(控制代碼)

Windows are objects — they have both code and data — but they are not C++ classes.

Instead, a program references a window by using a value called a handle(控制代碼). A handle is an opaque type. Essentially, it is just a number that the operating system uses to identify an object. You can picture Windows as having a big table of all the windows that have been created. It uses this table to look up windows by their handles. (Whether that's exactly how it works internally is not important.) The data type for window handles is HWND, which is usually pronounced "aitch-wind." Window handles are returned by the functions that create windows: CreateWindow and CreateWindowEx.

在Windows視窗程式設計當中,Windows提供一系列的核心物件(Kernel Object)讓我們使用,這稱為平台叫用(Platform Invocation, P/Invoke),也就是Windows API,為了使用這些核心物件,呼叫時必須指定核心物件,而這些控制代碼(Handel)就是代表這些核心物件的識別名稱(32位元的Windows是一組32位元的資料,而64位元的Windows是一組64位元的資料),有點類似C/C++的指標。

平台叫用可以參考:
注意到,這裡的Windows物件不是物件導向的物件觀念,Windows物件類似C/C++的結構(Structure),用於表示記憶體中的一塊資料。

另外,Windows視窗程式設計是事件驅動()的方式,觀念和一般傳統的程序程式設計有些差異,都是依賴訊息(Message)溝通,參考:
  1. About Messages and Message Queues:http://msdn.microsoft.com/en-us/library/ms644927(VS.85).aspx
  2. Window Procedures:http://msdn.microsoft.com/en-us/library/ms632593(VS.85).aspx
若是使用.Net Framework開發應用程式的話,而必須使用P/ Invoke平台呼叫,兩者的資料類型不太一樣,請參考Platform Invoke Data Types:http://msdn.microsoft.com/en-us/library/ac7ay120.aspx

Unmanaged type in Wtypes.h Unmanaged C language type Managed class name Description
HANDLE void* System..::.IntPtr 32 bits on 32-bit Windows operating systems, 64 bits on 64-bit Windows operating systems.
BYTE unsigned char System..::.Byte 8 bits
SHORT short System..::.Int16 16 bits
WORD unsigned short System..::.UInt16 16 bits
INT int System..::.Int32 32 bits
UINT unsigned int System..::.UInt32 32 bits
LONG long System..::.Int32 32 bits
BOOL long System.Int32 32 bits
DWORD unsigned long System..::.UInt32 32 bits
ULONG unsigned long System..::.UInt32 32 bits
CHAR char System..::.Char Decorate with ANSI.
LPSTR char* System..::.String or System.Text..::.StringBuilder Decorate with ANSI.
LPCSTR Const char* System..::.String or System.Text..::.StringBuilder Decorate with ANSI.
LPWSTR wchar_t* System..::.String or System.Text..::.StringBuilder Decorate with Unicode.
LPCWSTR Const wchar_t* System..::.String or System.Text..::.StringBuilder Decorate with Unicode.
FLOAT Float System..::.Single 32 bits
DOUBLE Double System..::.Double 64 bits

附註:Windows系統的實用工具,請參考Windows Sysinternals http://technet.microsoft.com/en-us/sysinternals/default.aspx

沒有留言:

張貼留言

熱門文章