Windows程式設計學習筆記--第一個Windows程式以及寬字元集(瞭解)

來源:互聯網
上載者:User


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 ;        }        















相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.