天天看點

2021-08-02 第一個win32程式和視窗應用

今天開始win32的學習,不出意外的話每天一更,整理自己的學習内容。

#include <Windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR lpCmdLine, int nCmdShow)
{
	//先說一下主函數的差別
//WinMain:視窗應用程式(GUI應用程式)的入口函數 ,不能缺少,不能改名字
//main:    控制台黑視窗應用程式(CUI應用程式)入口函數
	//函數的調用約定:
//WINAPI :  宏定義
//實際上就是:     __stdcall
//C語言函數預設調用約定是: __cdecl
//Windows API函數嘴遵守 __stdcall 調用約定,必須顯示的加上。

//__cdecl 和 __stdcall
//1、定義了函數參數的入棧順序
//2、由調用函數還是被調用函數來彈出棧(清理棧)
//__cdecl 和 __stdcall入棧方式:從右往左入棧
// CALLBACK 、APIENTRY  =》    __stdcall

//接下來看WinMain函數參數
//第一個參數:HINSTANCE:應用程式執行個體句柄類型
//DECLARE_HANDLE(HINSTANCE);  宏函數
//#define DECLARE_HANDLE(HINSTANCE) 
//struct HINSTANCE__
//{
//	int unused;
//}; 
//typedef struct HINSTANCE__*   HINSTANCE;
//HINSTANCE:結構體指針
//hInstance:目前應用程式執行個體句柄,(了解為:代表着目前這個應用程式,本質:程式的基位址)
//第二個參數:hPreInstance :目前應用程式前一個執行個體句柄,在32位應用程式以及往後,這個參數沒有使用了,為NULL值,在16位機器應用程式上使用
//第三個參數:LPSTR:字元串類型
//typedef CHAR*   NPSTR, * LPSTR, * PSTR;
//CHAR* => LPSTR
//typedef char CHAR;
//char <=>  CHAR
//LPSTR <=> char*
//即指令行參數,傳遞一個字元串過來
//第四個參數:視窗的顯示方式

//MessageBox函數彈出一個消息提示框
MessageBox(NULL, L"這是我的第一個Windows視窗", L"溫馨提示", MB_OK);
/*函數原型
	int WINAPI MessageBox(
  _In_opt_  HWND hWnd,
  _In_opt_  LPCTSTR lpText,
  _In_opt_  LPCTSTR lpCaption,
  _In_      UINT uType
);
*/
	//第一個參數:父視窗句柄
	//HWND :視窗句柄類型(唯一的标記一個視窗,相當于視窗為ID)
	//HWND
	//DECLARE_HANDLE(HWND);
	/*
	struct HWND__
	{
		int unused;
	}; 
	typedef struct HWND__*   HWND;
	*/	
	//第二個參數:要顯示的文本
	//LPCTSTR
	//typedef LPCWSTR PCTSTR, LPCTSTR;
	//typedef  CONST WCHAR *LPCWSTR, *PCWSTR;	
	//#define CONST               const
	//CONST <=> const
	//typedef wchar_t WCHAR;    // wc,   16-bit UNICODE character
	//wchar_t <=> WCHAR
	//wchar_t:寬字元,一個字元,占用兩個位元組
	//char:窄字元,一個字元占用一個位元組
	//CONST WCHAR * <=> LPCWSTR <=> LPCTSTR <=> const wchar_t*
	//L:告訴編譯器字元串是采用寬字元串編碼,Unicode編碼
	//第三個參數:消息框的标題
	//LPCTSTR  
	//第四個參數:按鈕與圖示的組合
	

}

           

圖為MessageBox的第四個參數的幾種常用形式

2021-08-02 第一個win32程式和視窗應用