Windows圖形界面:Windows程序設計筆記——一、第一個Windows程序

1.動態鏈接

早期,windows的主要部分只需在三個動態鏈接庫中實現,代表了windows的三個主要子系統:Kernel(內核) User(用戶) GDI。

Kernel:內存管理,文件I/O,任務管理等

User:用戶界面,負責所有的窗口管理

GDI:圖形設備接口,負責在屏幕或打印機上顯示文本和圖形

在windows程序中,調用windows函數和調用C語言庫函數(如strlen),沒什麼區別。最主要的區別在於C語言庫函數的機器代碼會直接鏈接到你的程序代碼中,而windows函數則是放在你的程序之外的dll中。

2.頭文件

windows.h是一個重要的包含文件,它囊括了若干其他windows頭文件,其中某些頭文件又包含另外的一些頭文件。下列幾個是最重要也是最基本的頭文件:

  • windef.h 基本數據類型定義文件
  • winnt.h 支持Unicode的類型定義
  • winbase.h 內核函數
  • winuser.h 用戶圖形界面函數
  • wingdi.h 圖形設備接口函數

這些頭文件定義了windows的所有數據類型、函數調用、數據結構以及常量標識符

3.程序入口

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MessageBox(NULL, TEXT("Hello Windows!"), TEXT("HelloMsg"), 0);
    return 0;
}

windows程序的入口是WinMain

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)

在WinBase.h中聲明如下

WinMain (
    _In_ HINSTANCE hInstance,
    _In_opt_ HINSTANCE hPrevInstance,
    _In_ LPSTR lpCmdLine,
    _In_ int nShowCmd
    );

絕大部分windows程序在命名上都採用“匈牙利標記法”系統。變量名前有一個短前綴,用以表示該變量的數據類型。i表示int,sz“以零結尾的字符串”(String Terminated with a Zero),LP代表常指針(Long Pointer)。

#define WINAPI   __stdcall

這條語句規定了一種函數調用的約定,表明如何生成在堆棧中放置函數調用參數的機器代碼。

WinMain的第一個參數一般叫做實例句柄(Instance Handle).在Windwos程序中,句柄無非就是一個數值,程序裏用它來標識某些東西。比如我們這個例子中,這個句柄就唯一標識了我們這個程序。

實際上在某些Windows程序中,把句柄當作參數調用是必須的。比如早期的Windows版本中,當多路併發運行同一個程序時,就需要爲那個程序創建多個實例。同一個程序的所有實例都共享代碼一起只讀存儲(即菜單或者對話框模板之類的資源)。一個程序可以通過查看hPreInstance參數從而知道是否有其他的實例正在運行。它也可以因此跳過某些零散雜務步驟,把一些數據從前一個實例搬到自己的數據區來。在32位Windows中,這一概念已不再採用,因此WinMain的第二個參數通常總是NULL。

WinMain的第三個參數是用來運行程序的命令行(Command Line)。有些Windows程序在啓動時用它來把文件裝入內存。

WinMain的第四個參數用來指示程序最初如何顯示:或正常顯示,或最大化到全屏,或最小化顯示在任務欄。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章