1. 程式人生 > >Windows資料型別以及寬字元

Windows資料型別以及寬字元

Windows API自行定義了一些關鍵字,用來定義Windows中函式中的有關引數和返回值的大小和意義,通常將它們看作Windows的資料型別。其中較常用的有:

關鍵字                 型別                            說明

BOOL                   邏輯型別                     等價於int

BOOLEAN            邏輯型別                     等價於BYTE

BYTE                   位元組                            等價於unsigned char

CHAR                   字元                            等價於char

DOUBLE        雙精度                  等價於double

DWORD               雙字                            等價於unsigned long

FLOAT                 浮點數                  等價於float

HANDLE              控制代碼                            等價於void

INT                      整數                            等價於int

LONG                  長整數                  等價於long

SHORT                 短整數                  等價於short

UCHAR                 無符號字元           等價於unsigned char

UINT                    無符號整數           等價於unsigned int

ULONG                無符號長整數              等價於unsigned long

USHORT               無符號短整數              等價於unsigned short

VOID                   空的、無定義              等價於void

WCHAR                雙位元組碼                     等價於unsigned short

wchar_t                雙位元組碼                     等價於unsigned short

WORD                 字                         等價於unsigned short

WPARAM             訊息引數                     等價於UINT

LPARAM              訊息引數                     等價於LONG

LRESULT             訊息返回值           等價於LONG

HINSTANCE         例項控制代碼                     等價於unsigned long

HWND                 視窗控制代碼                     等價於unsigned long

HDC                     裝置環境控制代碼              等價於unsigned long

TCHAR                 字元                            等價於char

LPSTR                 字元指標                     等價於char *

LPCSTR               常量字元指標              等價於const char *

LPTSTR               字元指標                     等價於TCHAR *

LPCTSTR             常量字元指標              等價於const TCHAR *

LPVOID               無型別指標           等價於void *

       LPCVOID             無型別常量指標    等價於const void *

其中控制代碼(handle)是Windows程式設計的一個關鍵性的概念,編寫Windows應用程式總是要和各種控制代碼打交道。所謂控制代碼,就是一個4位元組長的唯一的數,用以標識許多不同的物件型別,如視窗、選單、記憶體、畫筆、畫刷、電話線路等。

由於Windows是一個多工作業系統,它可以同時執行多個程式或一個程式的多個副本。這些執行的程式稱為一個例項。為了對同一程式的多個副本進行管理,Windows引入了例項控制代碼。Windows為每個應用程式建立一張表,例項控制代碼就好象是這張表的一個索引。

Windows不僅使用控制代碼來管理例項,也用它來管理視窗、點陣圖、字型、元檔案、圖示等系統資源。

Windows NT系統支援Unicode。所謂Unicode,即統一雙位元組內碼。我們知道,計算機中的西文資訊使用單位元組內碼(8位2進位制碼,即ASCII碼)。為了處理象中文這樣的大字符集,國內、臺灣和日本等使用漢字的國家各自定義了不同的雙位元組內碼標準,如大陸的GB碼、臺灣的BIG5碼和日本的JIS碼等。但不同的內碼系統不能通用,例如以BIG5碼輸入的文字在GB碼系統下不可辨認。因此,國際標準化組織提出了通用的大字符集標準,這就是Unicode碼。為了在應用程式中使用Unicode碼,就必須使用wchar_t或WCHAR代替char和CHAR型別處理字元。但因目前僅Windows NT支援Unicode,所以為了使所開發的應用程式具有一定的通用性,可用TCHAR型別代替CHAR或WCHAR型別。TCHAR型別可根據需要自動定義為CHAR或WCHAR型別。

寬字元其實也沒有什麼神祕,又叫做Unicode。就是人家一個char字元佔用一個位元組而寬字元佔用兩個。為了顯示中文。
Ascii碼沒有中文,因為計算機不是中國發明的,以前Ascii碼足夠了,但是中國人開始使用計算機了,於是要有中文(其它國家的我們不考慮),將兩個Ascii合併在一起顯示一箇中文。

許多函式需要寬字元作為引數,這時候你直接在該函式後面加上一個‘A’表示非寬字元版本。
       如:MessageBox需要寬字元,裡那麼我們就使用 MessageBoxA 函式。
       寬字元:MessageBox(NULL,TEXT("我是內容"),TEXT("我是標題"),MB_OK);
      非寬字元:MessageBoxA(NULL,"我是內容","我是標題",MB_OK);

多種方法:
       001.將你的字串放入 TEXT() 裡面,就是寬字元版本了。
       002.在你的字串前面加上‘L’即可,如:L"我是內容"。
       003.將你的字串放入 _T() 裡面,就是寬字元版本了,(需要tchar.h 標頭檔案)
      也就是說,以下是相同的:

#include<tchar.h>
MessageBox(NULL,TEXT("我是內容"),TEXT("我是標題"),MB_OK);
    MessageBox(NULL,L"我是內容",L"我是標題"MB_OK);
    MessageBox(NULL,_T("我是內容"),_T("我是標題"),MB_OK);

在VS2010裡面,你可以直接使用 TCHAR 定義寬字元,使用char定義非寬字元。
       TCHAR File[255];
       char file[255];
       然後在需要的時候可以進行轉換:
      寬字元轉普通字元:WideCharToMultiByte(); 
      普通字元轉寬字元:MultiByteToWideChar(); 
      詳細引數可以在百度百科找到。 
      初學的話可以直接:
      寬字元轉普通字元 
      WideCharToMultiByte(0,0,File,255,file,255,0,0);
      普通字元轉寬字元:
      MultiByteToWideChar(0,0,file,255,File,255);
      要轉化的放前面,轉化後的放後面,那些數字是轉化個數,其它置0.
     加入標頭檔案 tchar.h
    寬字元版本字元處理函式。
   如:
    strlen() //測字串長度 ,不適用於寬字元 
   它的替代品是: wcslen() ,_tcslen(),lstrlen()等…… 
   printf() 成了 wprintf()
   strcpy() 成了 _tcscpy ()
   strcmp() 成了 _tcscmp()
…… ……
簡單的例子:

#include<windows.h>

#include <tchar.h> 

<strong><span style="font-size:18px;">#include <stdio.h>
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
   { 
   int x, y;
   TCHAR String[255];
   x = GetSystemMetrics (SM_CXSCREEN) ; //螢幕的寬 
   y= GetSystemMetrics (SM_CYSCREEN) ; //螢幕的高 
   wsprintf(String, TEXT ("你的螢幕寬 %d pixels 高 %d pixels……不信量一量 "),x,y); 
   MessageBox(NULL,String,TEXT("測量測量……"),MB_OK);
   return 0 ; //這個不解釋……
   }</span></strong>