/* 头文件 */
#include <windows.h>
/* 全局变量 */
WCHAR g_lpszClassName[] = L"CLASSNAME";
WCHAR g_lpszWindowName[] = L"哈喽,新的征程";
HINSTANCE g_hInstance; // 窗口实例句柄 全局存储变量
// 标识符
#define HDC_EDIT 101 // 编辑框
#define HDC_BOTTON1 102 // 按钮一
#define HDC_BOTTON2 103 // 按钮二
/* 函数声明 */
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
/* 应用程序主函数 */
INT APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, INT nCmdShow)
{
g_hInstance = hInstance;
/* 1.设计一个窗口类 */
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX); // 结构体的大小
wcex.style = CS_HREDRAW | CS_VREDRAW; // 指定大小改变就水平|垂直重画
wcex.cbClsExtra = 0; // 类的额外内存
wcex.cbWndExtra = 0; // 窗口的额外内存
wcex.hInstance = hInstance; // 实例句柄
wcex.lpfnWndProc = WndProc; // 窗口回调函数指针
wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION); // 使用预定义图标(大图标)
wcex.hCursor = LoadCursor(NULL, IDC_ARROW); // 使用预定义光标
wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);// 使用系统颜色
wcex.lpszMenuName = NULL; // 的指定菜单
wcex.lpszClassName = g_lpszClassName; // 窗口类的名称
wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION); // 类的小图标
/* 2.注册这个窗口类 */
if (RegisterClassEx(&wcex) == ((ATOM)0))
{
MessageBox(NULL, L"注册窗口类失败!", L"错误", MB_YESNO | MB_ICONERROR);
exit(-1);
}
/* 3.创建窗口 */
HWND hWnd = CreateWindowExW(NULL, g_lpszClassName, g_lpszWindowName, \
WS_OVERLAPPEDWINDOW, 0, 0, 600, 600, NULL, NULL, hInstance, NULL);
if (hWnd == NULL)
{
MessageBox(NULL, L"创建窗口失败!", L"错误", MB_YESNO | MB_ICONERROR);
exit(-1);
}
// HWND hwndButton = CreateWindowEx(
// 0,
// L"BUTTON", // Predefined class; Unicode assumed
// L"1", // Button text
// WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, // Styles
// 10, // x position
// 10, // y position
// 100, // Button width
// 100, // Button height
// hWnd, // Parent window
// NULL, // No menu.
// (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE),
// NULL); // Pointer not needed.
// CreateWindowEx(0, L"BUTTON", L"天天", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
// 20, 20, 30, 30, hwndButton, NULL, (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE), NULL);
// hwndButton = CreateWindowEx(0, L"BUTTON", L"2", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
// 110, 10, 100, 100, hWnd, NULL, (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE), NULL);
// CreateWindowEx(0, L"BUTTON", L"弟弟", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
// 20, 20, 30, 30, hwndButton, NULL, (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE), NULL);
/* 4.更新显示窗口 */
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
/* 5.应用程序消息循环 */
MSG msg = { 0 };
BOOL bRet;
/* GetMessage 发生错误会返回-1 */
while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
{
if (bRet != -1)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
// /* 应用程序消息处理回调函数 */
// 窗口回调函数 1.窗口句柄 2.消息 3、4.随着不同的消息而改变用法
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg) // 分支不同的消息处理
{
case WM_DESTROY: // 当我们点击×后,结束这个进程
PostQuitMessage(0);
break;
case WM_COMMAND: // 鼠标点击一个按钮
switch(LOWORD(wParam)) // 标识符保存在wParam 的低位中 前16位
{
case HDC_BOTTON1: // 第一个按钮
SetDlgItemText(hWnd, HDC_EDIT, TEXT("浪子花梦")); // 设置编程框中的内容
break;
case HDC_BOTTON2:
TCHAR TsTr[128];
GetDlgItemText(hWnd, HDC_EDIT, TsTr, 128); // 获取编程框中的内容
MessageBox(hWnd, TsTr, TsTr, MB_OK); // 使用消息盒子弹出内容
break;
}
break;
case WM_CREATE: // 窗口刚创建发出来的消息 我们来创建子窗口(控件)
// 各种参数可以查阅资料
// 编辑框控件 一些功能设置 风格 大小
CreateWindow(L"EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE,
0, 500, 600, 100, hWnd, (HMENU)HDC_EDIT, g_hInstance, NULL);
// 第一个按钮
CreateWindow(L"BUTTON", TEXT("设置"), WS_CHILD | WS_VISIBLE,
0, 0, 90, 40, hWnd, (HMENU)HDC_BOTTON1, g_hInstance, NULL);
// 第二个按钮
CreateWindow(L"BUTTON", TEXT("获取"), WS_CHILD | WS_VISIBLE,
0, 40, 90, 40, hWnd, (HMENU)HDC_BOTTON2, g_hInstance, NULL);
default:
break;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam); // 默认返回
}