1. 程式人生 > 其它 >winapp | 視窗程式的win32子控制元件

winapp | 視窗程式的win32子控制元件

基於上一篇部落格裡的簡單win32app實現:

// windowsapp.cpp : Defines the entry point for the application.
//

#include "stdafx.h"

HINSTANCE g_hInstance;         // 全域性變數程式控制代碼

// 定義子控制元件編號巨集
#define IDC_EDIT_1 0x100
#define IDC_BUTTON_1 0x101
#define IDC_BUTTON_2 0x102


LRESULT CALLBACK WindowProc(HWND hwnd,
							UINT uMsg,
							WPARAM wParam,
							LPARAM LParam){
	// 視窗程式
	// 處理訊息佇列的訊息
	switch (uMsg)
	{
	case WM_CREATE:          // 視窗被創建出來的訊息
		//建立子控制元件
		//建立文字框
		CreateWindow(
			"EDIT",                             // 註冊的類名 這裡是文字框
			"",                 // 視窗名
			WS_CHILD|WS_VISIBLE|WS_VSCROLL|ES_MULTILINE,         // 視窗風格
			0,
			0,                                   // 相對於父視窗的x,y座標
			300,
			300,                                 // 寬高
			hwnd,                                  // 父視窗的控制代碼
			(HMENU)IDC_EDIT_1,                                 // 選單控制代碼如果是子視窗就是身份標識
			g_hInstance,                        // 是屬於哪個模組的
			NULL                              // 附加資料 空
		);
		//建立兩個按鈕
		CreateWindow(
			"BUTTON",                             // 註冊的類名 這裡是文字框
			"設定",                 // 視窗名
			WS_CHILD|WS_VISIBLE,         // 視窗風格
			300,
			0,                                   // 相對於父視窗的x,y座標
			60,
			30,                                 // 寬高
			hwnd,                                  // 父視窗的控制代碼
			(HMENU)IDC_BUTTON_1,                                 // 選單控制代碼
			g_hInstance,                        // 是屬於哪個模組的
			NULL                              // 附加資料 空
		);
		CreateWindow(
			"BUTTON",                             // 註冊的類名 這裡是文字框
			"獲取",                 // 視窗名
			WS_CHILD|WS_VISIBLE,         // 視窗風格
			300,
			100,                                   // 相對於父視窗的x,y座標
			60,
			30,                                 // 寬高
			hwnd,                                  // 父視窗的控制代碼
			(HMENU)IDC_BUTTON_2,                                 // 選單控制代碼
			g_hInstance,                        // 是屬於哪個模組的
			NULL                              // 附加資料 空
		);

		break;
	case WM_COMMAND:    // 按鈕發過來的訊息
		switch (LOWORD(wParam))
		{
		case IDC_BUTTON_1:
			SetDlgItemText(hwnd, IDC_EDIT_1, TEXT("測試"));
			break;
		case IDC_BUTTON_2:
			break;
		}
		break;
	case WM_DESTROY:
		PostQuitMessage(0);    // 讓當前程式退出
		break;
	}

	return DefWindowProc(hwnd, uMsg, wParam, LParam); // 呼叫預設的訊息處理函式
}


int APIENTRY WinMain(HINSTANCE hInstance,           // 控制代碼 模組的起始位置
                     HINSTANCE hPrevInstance,       // 永遠為空
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 	/*
	DWORD dwAddr = (DWORD)hInstance;
	char szOutBuff[0x80];
	sprintf(szOutBuff, "module place: 0x%X \n", dwAddr);   // 列印模組起始地址
	OutputDebugString(szOutBuff);
	*/
	
	// 給全域性變數控制代碼賦值
	g_hInstance = hInstance;

	// 第一步:定義視窗是什麼樣的
	TCHAR className[] = TEXT("My first Window");
	WNDCLASS wndclass = {0};                // 視窗類初始化
	wndclass.hbrBackground = (HBRUSH)COLOR_WINDOW;//背景色
	wndclass.lpszClassName = className;             // 視窗類名
	wndclass.hInstance = hInstance;               // 視窗是屬於哪個程式的
	wndclass.lpfnWndProc = WindowProc;            // 視窗程式(視窗過程函式地址)

	// 第二步:註冊視窗類
	RegisterClass(&wndclass);        // 讓作業系統知道你這個視窗

	// 第三步:建立並顯示視窗
	HWND hwnd = CreateWindow(
		className,                             // 註冊的類名
		TEXT("Mz1小工具"),                 // 視窗名
		WS_OVERLAPPEDWINDOW,                   // 視窗風格
		100,
		100,                                   // 相對於父視窗的x,y座標
		600,
		300,                                 // 寬高
		NULL,                                  // 父視窗的控制代碼
		NULL,                                 // 選單控制代碼
		hInstance,                        // 是屬於哪個模組的
		NULL                              // 附加資料 空
		);

	// 第四步:顯示視窗
	ShowWindow(hwnd, SW_SHOW);         // 預設形式顯示

	// 第五步:接收訊息並處理
	MSG msg;          // 用於接收訊息的結構體
	BOOL bRet; 
	while((bRet = GetMessage( &msg, NULL, 0, 0)) != 0){// 引數2:取哪個視窗的訊息,如果為空,就是取所有的
		if (bRet == -1){
			// handle the error
		}else{
			TranslateMessage(&msg); // 轉換訊息
			DispatchMessage(&msg);   // 分發訊息 給訊息處理函式處理
		}
	}
	return 0;
}