1.“Hello World” c語言 版本
#include <stdio.h>int main (){ printf ("hello, world\n") ; return 0 ;}
(摘自P先生的書)
/*------------------------------------------------------------------HelloMsg.c -- Displays "Hello, Windows 98!" in a message box (c) Charles Petzold, 1998--------------------------------------------------------------------*/#include <windows.h>int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){MessageBox (NULL, TEXT ("Hello, Windows 98!"), TEXT ("HelloMsg"), 0);return 0 ;}
它有一個include聲明、一個程式進入點、一個函數呼叫和一個return語句。
WINDOWS.H是主要的含入檔案,它包含了其它Windows表標頭檔,這些表標頭檔的某些也包含了其它表標頭檔。這些表標頭檔中最重要的和最基本的是:
程式進入點
正如在C程式中的進入點是函數main一樣,Windows程式的進入點是WinMain,總是像這樣出現:
這就是第一個Windows程式。
經典的Hello World。
3.關於字元集
c語言的版本:
Windows版本:
寬字元
C中的寬字元基於wchar_t資料型態,它在幾個表標頭檔包括WCHAR.H中都有定義,像這樣:
注意緊接在第一個引號前面的大寫字母L(代表「long」)。這將告訴編譯器該字串按寬字元儲存-即每個字元佔用2個位元組。通常,指標變數p要佔用4個位元組,而字串變數需要14個位元組-每個字元需要2個位元組,末尾的0還需要2個位元組。
,sizeof (a) 將返回14。索引數組a可得到單獨的字元。a[1] 的值是寬字元「e」,或者0x0065。
您還可在單個字元文字前面使用L首碼,來表示它們應解釋為寬字元。如下所示:
小問題:
寬字元集的字串處理函數:
size_t __cdecl strlen (const char *) ;
而wcslen函數則說明如下:
size_t __cdecl wcslen (const wchar_t *) ;
這時我們知道,要得到寬字元串的長度可以呼叫
iLength = wcslen (pw) ;
函數將返回字串中的字元數6。請記住,改成寬位元組後,字串的字元長度不改變,只是位組長度改變了。
您熟悉的所有帶有字串參數的C執行時期連結庫函數都有寬字元版。例如,wprintf是printf的寬字元版。這些函數在WCHAR.H和含有標準函數說明的表標頭檔中說明。
Then “L” Problem:
現在開始討論字串文字中的L問題。如果定義了_UNICODE標識符,那麼一個稱作__T的宏就定義如下:
#define __T(x) L##x
在Win32 console程式中使用哪個宏,取決於您喜歡簡潔還是詳細。基本地,必須按下述方法在_T或_TEXT宏內定義字串文字:
_TEXT ("Hello!")
這樣做的話,如果定義了_UNICODE,那麼該串將解釋為寬字元的組合,否則解釋為8位的字元字串。
最後:
正如前面談到的,Microsoft C包括寬字元和需要字串參數的C語言執行時期連結庫函數的所有普通版本。不過,Windows複製了其中一部分。例如,下面是Windows定義的一組字串函數,這些函數用來計算字串長度、複製字串、連接字串和比較字串:
ILength = lstrlen (pString) ; pString = lstrcpy (pString1, pString2) ; pString = lstrcpyn (pString1, pString2, iCount) ; pString = lstrcat (pString1, pString2) ; iComp = lstrcmp (pString1, pString2) ; iComp = lstrcmpi (pString1, pString2) ;
這些函數與C連結庫中對應的函數功能相同。如果定義了UNICODE標識符,那麼這些函數將接受寬字元串,否則只接受常規字串。寬字元串版的lstrlenW函數可在Windows 98中執行。
雖然Windows程式中可以使用大多數C的執行時期連結庫-實際上,許多程式寫作者更願意使用C記憶體管理和檔案I/O函數而不是Windows中等效的函數-Windows對標準輸入和標準輸出沒有概念。在Windows程式中可使用fprintf,而不是printf。
還有一個好訊息,那就是仍然可以使用sprintf及sprintf系列中的其它函數來顯示文字。這些函數除了將內容格式化輸出到函數第一個參數所提供的字串緩衝區以外,其功能與printfI相同。然後便可對該字串進行操作(例如將其傳給MessageBox)。
程式2-1所示的SCRNSIZE程式展示了如何?MessageBoxPrintf函數,該函數有許多參數並能像printf那樣編排它們的格式。
程式2-1 SCRNSIZE SCRNSIZE.C /*--------------------------------------------------------------------------- SCRNSIZE.C -- Displays screen size in a message box (c) Charles Petzold, 1998 ----------------------------------------------------------------------------*/ #include <windows.h> #include <tchar.h> #include <stdio.h> int CDECL MessageBoxPrintf (TCHAR * szCaption, TCHAR * szFormat, ...) { TCHAR szBuffer [1024] ; va_list pArgList ; // The va_start macro (defined in STDARG.H) is usually equivalent to: // pArgList = (char *) &szFormat + sizeof (szFormat) ; va_start (pArgList, szFormat) ; // The last argument to wvsprintf points to the arguments _vsntprintf ( szBuffer, sizeof (szBuffer) / sizeof (TCHAR), szFormat, pArgList) ; // The va_end macro just zeroes out pArgList for no good reason va_end (pArgList) ; return MessageBox (NULL, szBuffer, szCaption, 0) ; } int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { int cxScreen, cyScreen ; cxScreen = GetSystemMetrics (SM_CXSCREEN) ; cyScreen = GetSystemMetrics (SM_CYSCREEN) ; MessageBoxPrintf ( TEXT ("ScrnSize"), TEXT ("The screen is %i pixels wide by %i pixels high."), cxScreen, cyScreen) ; return 0 ; }