一、Windows程序的Hello world
#include<windows.h>
int WINAPI WinMain(
HINSTANCE hInstance, //程序实例句柄
HINSTANCE hPreHinstance, //上一个程序的实例句柄(被遗弃,参数始终为NULL)
LPSTR lpCmdeLine, //命令行参数
int nCmdeShow //显示方式
)
{
MessageBoxA(0,"12333","Caption",MB_OK);
return 0;
//以上函数,如果忘记参数和返回值是什么
//可以用鼠标双击想要查看的函数,然后按F1,就可以打开微软文档了
}
这是第一个Windows程序,Winmain函数必须写这些参数,不能省略。MessageBox函数有MessageBoxA和MessageBoxW,分别使用ANSI和Unicode字符集。
当然,如果使用VS2022,直接编译运行,会出现这样的错误:
就是提示找不到main的入口。因为VS2022默认是启动控制台的,我们需要右击解决方案,然后点击属性:
在子系统这里选择窗口。就可以正常编译运行程序了。
二、Windows程序的字符串处理
字符类型有CHAR和WCHAR,分别是用1字节代表一个字符和2字节代表一个字符。还有TCHAR,这个字符串的类型有可能是CHAR或者WCHAR,由环境决定,需要引入tchar.h头文件。
微软对这两种字符串类型进行了统一,所以有_T(“”)这样的字符串。
#include<windows.h>
#include<tchar.h>
int WINAPI WinMain(
HINSTANCE hInstance, //程序实例句柄
HINSTANCE hPreHinstance, //上一个程序的实例句柄(被遗弃,参数始终为NULL)
LPSTR lpCmdeLine, //命令行参数
int nCmdeShow //显示方式
)
{
CHAR str1[] = "456789";
WCHAR str2[] = L"88888";
TCHAR str3[] = _T("787979");
//在前面加相应的表示符,那么这个字符串就是WCHAR或者TCHAR类型的了
MessageBox(0,str3,str3,MB_OK);
return 0;
}
三、Windows窗口程序
#include<windows.h>
#include<tchar.h>
LRESULT CALLBACK Wndproc(
_In_ HWND hwnd,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
)
{
switch (uMsg)
{
case WM_CREATE:
MessageBoxW(hwnd, L"Create", L"Atten", MB_OK);
break;
case WM_CLOSE:
MessageBoxW(hwnd, L"Close", L"Atten", MB_OK);
DestroyWindow(hwnd);
PostQuitMessage(0);
break;
}
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
//然而,并不是所有的消息都需要你亲自处理;对于许多常见的消息,Windows 提供了默认的处理行为。
//DefWindowProcW 函数就是用来提供这些默认行为的。
}
//以上是回调函数,就是告诉程序接收到相应的事件,应该执行什么操作
int WINAPI WinMain(
HINSTANCE hInstance, //程序实例句柄
HINSTANCE hPreHinstance, //上一个程序的实例句柄(被遗弃,参数始终为NULL)
LPSTR lpCmdeLine, //命令行参数
int nCmdeShow //显示方式
)
{
//1、创建一个窗口类
WNDCLASS myclass = { 0 };
myclass.lpszClassName = L"study"; //写win程序都用unicode字符,这样能表示的字符多点
myclass.lpfnWndProc = Wndproc; //这个填回调函数
//2、注册窗口类
RegisterClassW(&myclass); //就是告诉操作系统我创建了这么一个窗口,用于和操作系统交互
//3、创建窗口
HWND hwindow = CreateWindowW(
myclass.lpszClassName,
L"study",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL,
NULL,
hInstance,
myclass.lpfnWndProc
);//这些参数按F1看看或者问文心一言吧
//4、显示窗口
ShowWindow(hwindow,SW_SHOWNORMAL);
//5、获取消息
MSG msg = { 0 };
while (GetMessageW(&msg,0,0,0))
{
DispatchMessageW(&msg); //分发消息给消息处理函数
}
//以上是对所有消息进行处理,如果没有消息处理的代码,程序会闪退
return 0;
}