Win32 API 菜单和控件

控件

控件概念

控件: 特殊的一类”子”窗口,系统已经定义好了窗口类型
创建方式和创建窗口类似,调用CreateWindow,每个控件都有自己的ID
控件事件发生后,会向所在的父窗口发送通知消息
可以使用SendMessage和PostMessage给控件发送消息
注意: 创建窗口时必须添加两个属性

  • WS_CHILD:控件是放在我们的窗口上的,自然要作为窗口的子窗口,WS_CHILDWINDOW也一样
  • WS_VISIBLE:设置可见

创建控件函数

HWND WINAPI CreateWindow( 类名, 显示内容,  风格,  int x,   int y,   
               int nWidth,  int nHeight,  父窗口,  控件ID,  
               HINSTANCE hInstance,  LPVOID lpParam  );

按钮

窗口类名 BUTTON

按钮分类:

  • 下压式按钮 BS_PUSHIBUTTON / BS_DEFPUSHIBUTTON
  • 复选框 BS_CHECKBOX(点击选择时,需要自己维护选择状态) / BS_AUTOCHECKBOX(点击选择时,系统自动维护选择状态) / BS_3STATE(变灰的三种状态) / BS_AUTO3STATE(自动处理的三种状态)
  • 单选框 BS_RADIOBUTTON / BS_AUTORADIOBUTTON
  • 分组框 BS_GROUPBOX

按钮消息: WM_COMMAND

  • LOWORD(wParam) 保存的是按钮ID
  • HIWORD(wparam) 通知码BN_CLICKED
  • lParam 子窗口句柄
    在这里插入图片描述
    设置按钮文本
  • WM_SETTEXT
  • SetWindowText

Demo

// ButtonDemo.cpp : 定义应用程序的入口点。
//

#include "framework.h"
#include "ButtonDemo.h"

#define MAX_LOADSTRING 100

#define DN_ID_PUSH_BUTTON					WM_USER + 1
#define DN_ID_DEF_PUSH_BUTTON				DN_ID_PUSH_BUTTON + 1
#define DN_ID_CHECK_BOX						DN_ID_DEF_PUSH_BUTTON + 1
#define DN_ID_AUTO_CHECK_BOX				DN_ID_CHECK_BOX + 1
#define DN_ID_3_STATE						DN_ID_AUTO_CHECK_BOX + 1
#define DN_ID_AUTO_3_STATE					DN_ID_3_STATE + 1
#define DN_ID_RADIO_BUTTON					DN_ID_AUTO_3_STATE + 1
#define DN_ID_AUTO_RADIO_BUTTON				DN_ID_RADIO_BUTTON + 1
#define DN_ID_GROUP_BOX						DN_ID_AUTO_RADIO_BUTTON + 1

// 全局变量:
HINSTANCE hInst;                                // 当前实例
WCHAR szTitle[MAX_LOADSTRING];                  // 标题栏文本
WCHAR szWindowClass[MAX_LOADSTRING];            // 主窗口类名
HWND g_hPushButton;
HWND g_hDefPushButton;
HWND g_hCheckBox;
HWND g_hAutoCheckBox;
HWND g_h3State;
HWND g_hAuto3State;
HWND g_hRadioButton;
HWND g_hAutoRadioButton;
HWND g_hGroupBox;


// 此代码模块中包含的函数的前向声明:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
void				CreateButton(HWND hwnd, HINSTANCE hInstance);


int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: 在此处放置代码。

    // 初始化全局字符串
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_BUTTONDEMO, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    // 执行应用程序初始化:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }

    HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_BUTTONDEMO));

    MSG msg;

    // 主消息循环:
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return (int) msg.wParam;
}



//
//  函数: MyRegisterClass()
//
//  目标: 注册窗口类。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEXW wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_BUTTONDEMO));
    wcex.hCursor        = LoadCursor(nullptr, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = MAKEINTRESOURCEW(IDC_BUTTONDEMO);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassExW(&wcex);
}

//
//   函数: InitInstance(HINSTANCE, int)
//
//   目标: 保存实例句柄并创建主窗口
//
//   注释:
//
//        在此函数中,我们在全局变量中保存实例句柄并
//        创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   hInst = hInstance; // 将实例句柄存储在全局变量中

   HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

   if (!hWnd)
   {
      return FALSE;
   }

   CreateButton(hWnd, hInstance);

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

void CreateButton(HWND hwnd, HINSTANCE hInstance)
{
	//分组框
	g_hGroupBox = CreateWindow(_T("BUTTON"), _T("GroupBox"), WS_VISIBLE | WS_CHILD | BS_GROUPBOX,
		20, 20, 200, 500, hwnd, (HMENU)(DN_ID_GROUP_BOX), hInstance, NULL);

	g_hPushButton = CreateWindow(L"BUTTON", L"PushButotn", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
		50, 50, 80, 30, hwnd, (HMENU)(DN_ID_PUSH_BUTTON), hInstance, NULL);

	g_hDefPushButton = CreateWindow(_T("BUTTON"), _T("DefPushButotn"), WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
		50, 100, 150, 30, hwnd, (HMENU)(DN_ID_DEF_PUSH_BUTTON), hInstance, NULL);

	g_hCheckBox = CreateWindow(_T("BUTTON"), _T("CheckBox"), WS_VISIBLE | WS_CHILD | BS_CHECKBOX,
		50, 150, 150, 30, hwnd, (HMENU)(DN_ID_CHECK_BOX), hInstance, NULL);

	g_hAutoCheckBox = CreateWindow(_T("BUTTON"), _T("AutoCheckBox"), WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX,
		50, 200, 150, 30, hwnd, (HMENU)(DN_ID_AUTO_CHECK_BOX), hInstance, NULL);

	g_h3State = CreateWindow(_T("BUTTON"), _T("3State"), WS_VISIBLE | WS_CHILD | BS_3STATE,
		50, 250, 150, 30, hwnd, (HMENU)(DN_ID_3_STATE), hInstance, NULL);

	g_hAuto3State = CreateWindow(_T("BUTTON"), _T("Auto3State"), WS_VISIBLE | WS_CHILD | BS_AUTO3STATE,
		50, 300, 150, 30, hwnd, (HMENU)(DN_ID_AUTO_3_STATE), hInstance, NULL);
	//单选框
	g_hRadioButton = CreateWindow(_T("BUTTON"), _T("RadioButton"), WS_VISIBLE | WS_CHILD | BS_RADIOBUTTON,
		50, 350, 150, 30, hwnd, (HMENU)(DN_ID_RADIO_BUTTON), hInstance, NULL);
	//单选框自动改变状态
	g_hAutoRadioButton = CreateWindow(_T("BUTTON"), _T("AutoRadioButton"), WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON,
		50, 400, 150, 30, hwnd, (HMENU)(DN_ID_AUTO_RADIO_BUTTON), hInstance, NULL);

}


//
//  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目标: 处理主窗口的消息。
//
//  WM_COMMAND  - 处理应用程序菜单
//  WM_PAINT    - 绘制主窗口
//  WM_DESTROY  - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 分析菜单选择:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
			case DN_ID_PUSH_BUTTON:  //按钮单机事件的处理
				SendMessage((HWND)lParam, WM_SETTEXT, NULL, (WPARAM)_T("我被单击了"));
				break;
			case DN_ID_DEF_PUSH_BUTTON://按钮单机事件的处理
				SetWindowText((HWND)lParam, _T("我被单击了"));
				break;
			case DN_ID_RADIO_BUTTON:  //单选框
			{
				//获取单选框选中状态
				LRESULT nRet = SendMessage(g_hRadioButton, BM_GETCHECK, 0, 0);
				if (nRet == BST_CHECKED) //如果为选中状态
				{
					SendMessage(g_hRadioButton, BM_SETCHECK, BST_UNCHECKED, 0); //设置为未选中
				}
				else if (nRet == BST_UNCHECKED) //如果为未选中状态
				{
					SendMessage(g_hRadioButton, BM_SETCHECK, BST_CHECKED, 0); //设置为选中状态
				}
				else if (nRet == BST_INDETERMINATE)  //为置灰状态
				{
				}
			}
				break;
			case DN_ID_CHECK_BOX:	//复选框
			{
				HWND hCheckBox = GetDlgItem(hWnd, DN_ID_CHECK_BOX);  //根据id或者控件句柄
				LRESULT nRet = SendMessage(hCheckBox, BM_GETCHECK, 0, 0);
				if (nRet == BST_CHECKED) //如果为选中状态
				{
					SendMessage(hCheckBox, BM_SETCHECK, BST_UNCHECKED, 0); //设置为未选中
				}
				else if (nRet == BST_UNCHECKED) //如果为未选中状态
				{
					SendMessage(hCheckBox, BM_SETCHECK, BST_CHECKED, 0); //设置为选中状态
				}
				else if (nRet == BST_INDETERMINATE)  //为置灰状态
				{
				}
			}
				break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            // TODO: 在此处添加使用 hdc 的任何绘图代码...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// “关于”框的消息处理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

在这里插入图片描述

编辑框

窗口类名 EDIT

分类:

  • 文字编辑框:显示单行文字/显示多行文字
  • 密码编辑框:ES_PASSWORD,显示密码

窗口风格
在这里插入图片描述
通知消息

在WM_COMMAND case下 处理这个参数
if (HIWORD(wParam) == EN_CHANGE && LOWORD(wParam) == nEditID)

WM_GETTEXT —获取编辑框文本
wPararm - buffer 的大小 lPararm – buffer的首地址
SendMessage( (WPARAM) wParam, // number of characters to copy

WM_GETTEXTLENGTH-获取文本长度
SendMessage( (WPARAM) 0, (LPARAM) 0)

WM_SETTEXT设置内容
wParam – 没用,lParam – 准备设置内容的buffer的首地址
补充:
· SendMessage( hWndEdit, WM_CUT, 0, 0 );
· SendMessage( hWndEdit, WM_COPY, 0, 0 );
· SendMessage( hWndEdit, WM_CLEAR, 0, 0 )

静态框

窗口名称 STATIC 用来用来显示文字,加载图片(设置属性 SS_ICON/SS_BITMAP)

窗口消息: sendMessage 发送到控件即可 例如 STM_SETICON

组合框

组合框分类
简单组合框 CBS_SIMPLE (可以输入可以选择)
下拉式组合框 CBS_DROPDOWN (可以输入,可以选择)
下拉式列表组合框 CBS_DROPDOWNLIST (只可以选择不可以输入)

组合框发送消息
CB_ADDSTRING ----添加项(WPARAM—没用 LPARAM----字符串指针)
CB_INSERTSTRING 添加项
CB_DELETESTRING 删除制定项
CB_RESETCONTENT 清除所有项
CB_SETCURSEL 设置当前项
CB_GETCURSLE 获取当前项
CB_FINDSTRING 查找某项字符串
CB_GETLBTEXTLEN 获取选择的字符长度
CB_GETLBTEXT 获取选项的一个字符内容
CB_DIR 在组合框中显示制定路径下的文件和目录名字
CB_SETITENDATA 将数据保存到指定选项中
CB_GETITEMDATA 从指定选项中获取数据

菜单

获取菜单句柄
::LoadMenu( 程序实例instance,资源句柄 );
资源句柄使用MAKEINTRESOURCE(菜单ID);ID在resource.h里定义好了.
这个函数返回的是一个菜单句柄

hwnd = CreateWindowEx ( 
       0,   
       szClassName,         
       "Code::Blocks Template Windows App", 
       WS_OVERLAPPEDWINDOW,  
       CW_USEDEFAULT,       
       CW_USEDEFAULT,       
       544,                  
       375,                  
       HWND_DESKTOP,        
       LoadMenu(hThisInstance,MAKEINTRESOURCE(IDR_MENU)), // MENU 
       hThisInstance,       /* Program Instance handler */ 
       NULL                 
       ); 

注册窗口类是提供菜单句柄

ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEXW wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_BUTTONDEMO));
    wcex.hCursor        = LoadCursor(nullptr, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszMenuName = NULL;//MAKEINTRESOURCEW(IDC_BUTTONDEMO);  //获取菜单句柄
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassExW(&wcex);
}

手动添加

HMENU CreateMyMenu()
{
	HMENU hRoot = CreateMenu();
	HMENU pop1 = CreatePopupMenu();

	AppendMenu(hRoot, MF_POPUP, (UINT_PTR)pop1, L"文件");
	// 一种方法是使用AppendMenu函数  
	AppendMenu(pop1, MF_STRING, DN_ID_MENU_OPEN, L"打开");

	// 另一种方法是使用InsertMenuItem函数  
	MENUITEMINFO mif;
	mif.cbSize = sizeof(MENUITEMINFO);
	mif.cch = 100;
	mif.dwItemData = NULL;
	mif.dwTypeData = (TCHAR*)L"保存";
	mif.fMask = MIIM_ID | MIIM_STRING | MIIM_STATE;
	mif.fState = MFS_ENABLED;
	mif.fType = MIIM_STRING;
	mif.wID = DN_ID_MENU_SAVE;

	InsertMenuItem(pop1, DN_ID_MENU_SAVE, FALSE, &mif);

	return hRoot;
}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   hInst = hInstance; // 将实例句柄存储在全局变量中

   HMENU hRoot = CreateMyMenu();
   HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, hRoot, hInstance, nullptr);

   if (!hWnd)
   {
      return FALSE;
   }

   CreateButton(hWnd, hInstance);

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

自定义控件类

自定义按钮

// CustomWidget.cpp : 定义应用程序的入口点。
//

#include "framework.h"
#include "CustomWidget.h"

#define MAX_LOADSTRING 100

// 全局变量:
HINSTANCE hInst;                                // 当前实例
WCHAR szTitle[MAX_LOADSTRING];                  // 标题栏文本
WCHAR szWindowClass[MAX_LOADSTRING];            // 主窗口类名

// 此代码模块中包含的函数的前向声明:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: 在此处放置代码。

    // 初始化全局字符串
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_CUSTOMWIDGET, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    // 执行应用程序初始化:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }

    HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_CUSTOMWIDGET));

    MSG msg;

    // 主消息循环:
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return (int) msg.wParam;
}

LRESULT CALLBACK MyBtnProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
	case WM_CREATE:
	{

	}
	break;
	case WM_PAINT:
	{
		PAINTSTRUCT ps;
		HDC hdc = BeginPaint(hWnd, &ps);
		
		RECT rect = { 0 };
		GetWindowRect(hWnd, &rect);
		int nWidth = rect.right - rect.left;
		int nHegiht = rect.bottom - rect.top;

		TCHAR szTitle[256] = { 0 };
		int nTextCount = GetWindowText(hWnd, szTitle, 256);

		SetBkColor(hdc, RGB(0, 0, 0));// 设置当前背景颜色
		HBRUSH hbrush = CreateSolidBrush(RGB(0, 255, 0));//创建画刷
		HBRUSH oldhbrush = (HBRUSH)SelectObject(hdc, hbrush);//选入设备环境
		RoundRect(hdc, 2, 2, nWidth - 4, nHegiht - 4, nWidth / 10, nHegiht / 10);//画图
		SelectObject(hdc, oldhbrush);//恢复先前画刷
		DeleteObject(hbrush);//删除画刷

		hbrush = (HBRUSH)GetStockObject(NULL_BRUSH);
		oldhbrush = (HBRUSH)SelectObject(hdc, hbrush);//选入设备环境
		SetTextColor(hdc, RGB(255, 0, 0));
		SetBkColor(hdc, RGB(0, 0, 0));
		SetBkMode(hdc, TRANSPARENT);    // 设置透明
		TextOut(hdc, 10, nHegiht / 4, szTitle, nTextCount);
		SelectObject(hdc, oldhbrush);//恢复先前画刷

		EndPaint(hWnd, &ps);
	}
	break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}

	return 0;
}

//
//  函数: MyRegisterClass()
//
//  目标: 注册窗口类。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEXW wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_CUSTOMWIDGET));
    wcex.hCursor        = LoadCursor(nullptr, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = MAKEINTRESOURCEW(IDC_CUSTOMWIDGET);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    RegisterClassExW(&wcex);

	WNDCLASSEXW wcMyBtn = { 0 };
	wcMyBtn.cbSize = sizeof(WNDCLASSEX);
	//wcMyBtn.style = CS_HREDRAW | CS_VREDRAW;
	wcMyBtn.lpfnWndProc = MyBtnProc;
	wcMyBtn.hInstance = hInstance;
	wcMyBtn.lpszClassName = _TEXT("MyBtn");

	ATOM ret = RegisterClassExW(&wcMyBtn);
	return ret;
}

//
//   函数: InitInstance(HINSTANCE, int)
//
//   目标: 保存实例句柄并创建主窗口
//
//   注释:
//
//        在此函数中,我们在全局变量中保存实例句柄并
//        创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   hInst = hInstance; // 将实例句柄存储在全局变量中

   HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

//
//  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目标: 处理主窗口的消息。
//
//  WM_COMMAND  - 处理应用程序菜单
//  WM_PAINT    - 绘制主窗口
//  WM_DESTROY  - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
	case WM_CREATE:
	{
		HWND hBtn = CreateWindow(_T("MyBtn"), _T("自定义按钮"), WS_VISIBLE | WS_CHILD,
			20, 20, 100, 60, hWnd, (HMENU)567, hInst, NULL);
		OutputDebugString(_TEXT("MainWindow Create"));
	}
	break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            // TODO: 在此处添加使用 hdc 的任何绘图代码...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值