Day1: 最初の Win32 プログラムを手書きする

学習ポイント:

1. この Win32 ウィンドウ プログラムの実装ロジックを理解する

2. Windows のメッセージ ループの仕組みを学ぶ

3. Windows のデータ型を理解する

4. Winmain関数の機能を理解する

まず第一に、この Winodws ウィンドウ プログラムは今後の研究では手書きする必要はありません。ここでの焦点はコードのロジックを学ぶことです。一部のパラメータの意味はまだ明確ではありませんが、公式ドキュメントを通じて問い合わせることができます通常の状況では、これらのパラメータの値は変更されないため、これは焦点ではありません。

コード

//dos main
//
//目的:窗口程序
//1 掌握 C++ 面向对象思想 2 理解消息机制 3 多态性
#include <windows.h>
#include <stdio.h>
LPCTSTR clsName = "My";
LPCTSTR msgName = "欢迎学习";
LRESULT CALLBACK MyWinProc(
	HWND hwnd, // handle to window
	UINT uMsg, // message identifier
	WPARAM wParam, // first message parameter word
	LPARAM lParam // second message parameter long
);
// a 设计一个窗口类 b 注册窗口类 c 创建窗口 d 显示以及更新窗口 e 消息循环
int WINAPI WinMain(
	HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPSTR lpCmdLine,
	int nShowCmdr
)
{
	//a 设计一个窗口类
	// 1 定义和配置窗口对象 WNDCLASS的本质其实是一个结构体
	WNDCLASS wndcls;
	wndcls.cbClsExtra = NULL;
	wndcls.cbWndExtra = NULL;
	wndcls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wndcls.hCursor = LoadCursor(NULL, IDC_ARROW);
	wndcls.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wndcls.hInstance = hInstance;
	//定义交互响应
	wndcls.lpfnWndProc = MyWinProc;//回调
	//定义窗口代号
	wndcls.lpszClassName = clsName;
	wndcls.lpszMenuName = NULL;
	wndcls.style = CS_HREDRAW | CS_VREDRAW;
	// b 注册窗口类
	RegisterClass(&wndcls);
	//c 创建窗口
	HWND hwnd;
	hwnd = CreateWindow(clsName, msgName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
		CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance,
		NULL);
	//d 显示和刷新窗口
	ShowWindow(hwnd, SW_SHOWNORMAL);
	UpdateWindow(hwnd);
	//e 消息循环 GetMessage 只有在接收到 WM_QUIT 才会返回 0
	//TranslateMessage 翻译消息 WM_KEYDOWN 和 WM_KEYUP 合并为 WM_CAHR
	// 这里写成一个死循环
	MSG msg;
	while (GetMessage(&msg, NULL, NULL, NULL))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}

LRESULT CALLBACK MyWinProc(
	HWND hwnd, // handle to window
	UINT uMsg, // message identifier
	WPARAM wParam, // first message parameter word
	LPARAM lParam // second message parameter long
)
{
	//uMsg 消息类型
	int ret;
	HDC hdc;
	switch (uMsg)
	{
	case WM_CHAR:
		char szChar[20];
		sprintf_s(szChar, "您刚才按下了: %c", wParam);
		MessageBox(hwnd, szChar, "char", NULL);
		break;
	case WM_LBUTTONDOWN:
		MessageBox(hwnd, "检测鼠标左键按下", "msg", NULL);
		break;
	case WM_PAINT:
		PAINTSTRUCT ps;
		hdc = BeginPaint(hwnd, &ps);
		TextOut(hdc, 0, 0, "www.baidu.com", strlen("www.baidu.com"));
		EndPaint(hwnd, &ps);
		MessageBox(hwnd, "重绘", "msg", NULL);
		break;
	case WM_CLOSE:
		ret = MessageBox(hwnd, "是否真的结束?", "msg", MB_YESNO);
		if (ret == IDYES)
		{
			DestroyWindow(hwnd);
		}
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hwnd, uMsg, wParam, lParam);
	}
	return 0;
}

操作結果:

ウィンドウクラスを手書きするというアイデア

  1. ウィンドウクラスを設計する
  2. ウィンドウクラスを登録する
  3. ウィンドウを作成する
  4. ウィンドウの表示と更新
  5. メッセージループ

Windowsのデータ型について

Unicode は世界共通の文字エンコーディング標準であり、16 ビット データを使用して文字を表現し、合計 65535 文字を表現できます。

ASNI 文字セット。8 ビット データを使用するか、隣接する 2 つの 8 ビット データを組み合わせて特殊言語文字を表します。バイトが負の場合、次のバイトが結合されて文字を表します。このエンコーディングの文字セットは、「マルチバイト」文字セットとも呼ばれます。

DWORD 32 字节无符号整型数据
DWORD32 32 字节无符号整型数据
DWORD64 64 字节无符号整型数据
HANDLE 对象的句柄,最基本的句柄类型
HICON 图标的句柄
HINSTANCE 程序实例的句柄
HKEY 注册表键的句柄
HMODULE 模块的句柄
HWND 窗口的句柄
INT 32 位符号整型数据类型
INT_PTR 指向 INT 类型数据的指针类型
INT32 32 位符号整型
INT64 64 位符号整型
LONG32 32 位符号整型
LONG64 64 位符号整型
LPARAM 消息的 L 参数
WPARAM 消息的 W 参数
LPCSTR Windows,ANSI,字符串常量
LPCTSTR 根据环境配置,如果定义了 UNICODE 宏,则是 LPCWSTR 类型,否则是 LPCSTR 类型
LPCWSTR UNICODE 字符串常量
LPDWORD 指向 DWORD 类型数据的指针
LPSTR Window,ANSI,字符串变量
LPTSTR 根据环境配置,如果定义了 UNICODE,则是 LPWSTR 类型,否则是 LPSTR 类型
LPWSTR UNICODE 字符串变量
SIZE_T 表示内存大小,以字节为单位,其最大值是 CPU 最大寻址范围
TCHAR 如果定义了 UNICODE,则为 WCHAR,否则为 CHAR
WCHAR 16 位 Unicode 字符

変数内のいくつかの一般的な接頭辞の意味は次のとおりです。

a 数组 array 
b 布尔值 bool
by 无符号字符(字节) 
c 字符(字节)
cb 字节计数 
rgb 保存颜色值的长整
cx,cy 短整型(计算 x,y 的长度) 
dw 无符号长整型
fn 函数 
h 句柄
i 整形(integer) 
m_ 类的数据成员 memb
n 短整型或整型 
np 近指针
p 指针(pointer) 
l 长整型(long)
lp 长指针 
s 字符串 string
sz 以零结尾的字符串 
tm 正文大小
w 无符号整型 
x,y 无符号整型(表示 x,y 的坐标

備考: これらは覚える必要はなく、頻繁に使用することで徐々に覚えられます。データ型の定義は VS の Alt + G で表示でき、その本質は依然として C++ の基本データ構造です。

例: ハンドル HANDLE

 その本質は実際には Void ポインターであり、他のものについても同様です。

APIとSDKについて

API : Application Programming Interface アプリケーション プログラミング インターフェイス。

SDK : Software Development Kit ソフトウェア開発キット。通常、API インターフェイス ドキュメント、サンプル ドキュメント、ヘルプ ドキュメント、ユーザー マニュアル、関連ツールなどが含まれます。

窓とハンドルについて

ウィンドウは、ユーザー入力を受け取り、プログラム出力を表示する画面上の領域です。タイトル バー、メニュー バー、ツールバー、コントロールなどを含めることができます。

ハンドル (リソース番号、セカンダリ ポインタ、ドアノブ)、ウィンドウ ハンドル、ファイル ハンドル、データベース接続ハンドル。

ウィンドウとハンドルの関係:

C++ ウィンドウ クラス オブジェクトとウィンドウは同じものではありません。両者の唯一の関係は、ウィンドウ ハンドル変数が C++ ウィンドウ クラス オブジェクト内で定義され、C++ ウィンドウ クラス オブジェクトに関連するウィンドウのハンドルが格納されることです。ウィンドウが破棄されると、対応する C++ ウィンドウ クラス オブジェクトが破棄されるかどうかは、そのライフ サイクルが終了するかどうかによって決まります。ただし、C++ ウィンドウ クラス オブジェクトが破棄されると、関連するウィンドウも破棄されます。2 つの違いは単純に次のとおりです。

  • ライフサイクル ウィンドウ クラス オブジェクト サイクル > ウィンドウ
  • m_wndはウィンドウクラス内で定義されています

補足: ウィンドウオブジェクトがメモリ上に生成されると、識別子としてハンドル値が返されます。

Windows メッセージ ループ メカニズム

私のブログを参照してください: Day1: Windows メッセージ ループ メカニズム

使用するヘッダファイルについて

Windows.h は、Windows オペレーティング システムのコア ヘッダー ファイルであり、オペレーティング システム関連の多くの関数、データ型、および定数を定義します。windows.hヘッダー ファイルをインクルードすると、そこで定義されている関数と型を使用して Windows オペレーティング システムと対話し、ウィンドウ管理、ファイル操作、プロセス管理、メモリ管理などのさまざまなシステム レベルの操作を実行できます。

以下の機能が実現できます。

  • ウィンドウとメッセージの処理: ウィンドウの作成と管理、ウィンドウ メッセージの処理、ウィンドウ プロシージャなどを含みます。
  • ファイルとファイル システム: ファイルの作成、読み取り、書き込み、削除、名前変更、パス解決、ファイル属性の取得などの操作が含まれます。
  • プロセスとスレッド: プロセスとスレッドの作成、終了、同期、通信などの操作が含まれます。
  • メモリ管理: メモリの割り当て、解放、読み取りおよび書き込み操作、および仮想メモリ管理機能を含みます。
  • システム情報と設定: システム情報の取得、レジストリ操作、環境変数管理などを含みます。
  • ネットワークと通信: ネットワークソケット操作、ネットワークプロトコル、通信の関連機能を含みます。

#include <stdio.h>C 言語で使用される、標準の入出力関数を含むヘッダー ファイルです。stdio.h ヘッダー ファイルは、入出力操作のための多数の関数と定数を定義します。

WinMain関数について

Winmain 関数はプログラムのエントリ ポイントです。

すべての Windows プログラムには、  WinMain または wWinMainという名前のエントリ ポイント関数が含まれています。

公式ドキュメントによると、パラメータの意味は次のとおりです。

WinMain 関数の意味は、C++ プログラムの Main 関数であり、プログラムの開始点です。

補充する

このプログラムを書いたときに C++ の空のプロジェクトを作成したので、プログラム完成後にプロジェクトのプロパティを変更する必要があり、合計 2 か所あります。

おすすめ

転載: blog.csdn.net/qq_61553520/article/details/130883222