基础
软件为Visual Studio 2013,中途函数遇到问题,可试试在项目属性中将Unicode字符集改为多字节字符集
1.主函数
//_In_ 修饰 数据要进入到函数里面,如后缀包括 _opt_,则表示该参数可能为空,其余与没有包括_opt_的相同
//HINSTANCE void *
//LPSTR CHAR *
//HANDLE void * 句柄
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,//当前实例句柄
_In_opt_ HINSTANCE hPrevInstance,//父实例句柄
_In_ LPTSTR lpCmdLine,//命令行
_In_ int nCmdShow//显示方式
)
{
//安全检查等级,可以忽略
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
// TODO: 在此放置代码
MSG msg;
HACCEL hAccelTable;
// 初始化全局字符串
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_WIN32PROJECT2, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
// 执行应用程序初始化:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WIN32PROJECT2));
// 主消息循环:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}
Windows中“HANDLE”通常和其他名词连用,使用前缀“H”。
在Windows中因为字符串编码不同,一般使用_T("");输入文本。
2.注册窗口类
ATOM MyRegisterClass(HINSTANCE hInstance)
{
//后缀ex的,一般为扩展
//窗口类的结构变量 窗口类,用一个结构体存放
WNDCLASSEX wcex;
//结构体的第一个成员为size,一般都是自身结构体的内存大小
wcex.cbSize = sizeof(WNDCLASSEX);
//窗口的风格 CS_HREDRAW 水平刷新 CS_VREDRAW垂直刷新
wcex.style = CS_HREDRAW | CS_VREDRAW;
//增加风格用|隔开
/* 窗口其他风格
CS_BYTEALIGNCLIENT 0x1000
在窗口边界(x方向)上对齐窗口的客户区域。
CS_BYTEALIGNWINDOW 0x2000
在窗口边界(x方向)上对齐窗口。
CS_CLASSDC 0x0040
分配一个设备上下文以供类中的所有窗口共享。
CS_DBLCLKS 0x0008
当用户在属于该类的窗口内双击鼠标时,向窗口过程发送双击消息。
CS_GLOBALCLASS 0x4000
指示窗口类是应用程序全局类。。
CS_HREDRAW 0x0002
如果移动或大小调整更改客户区的宽度,则重绘整个窗口。
CS_NOCLOSE 0x0200
禁用窗口菜单上的关闭。
CS_OWNDC 0x0020
为类中的每个窗口分配唯一的设备上下文。
CS_PARENTDC 0x0080
将子窗口的剪切矩形设置为父窗口的剪切矩形,以便子窗口可以在父窗口上绘制。
CS_SAVEBITS 0x0800
以位图的形式保存由此类窗口遮挡的屏幕图像部分。删除窗口后,系统将使用保存的位图恢复屏幕图像,包括其他被遮挡的窗口。
CS_VREDRAW 0×0001
如果移动或大小调整更改客户区的高度,则重绘整个窗口。
*/
wcex.lpfnWndProc = WndProc;
//窗口类的额外信息,直接给0
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
//窗口类的实例
wcex.hInstance = hInstance;
//窗口的图标 MAKEINTRESOURCE 带参宏 ,通过宏可以把id号当成字符串来进行加载
//窗口需要的资源都有id号,通过id号对应不同的资源,资源在资源视图有部分可见
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WIN32PROJECT2));
//窗口光标
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
//窗口背景颜色 可通过+后面的数字改变颜色
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
//窗口菜单 可赋值为空,则为无菜单
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_WIN32PROJECT2);
//窗口类名
wcex.lpszClassName = szWindowClass;
//窗口小图标
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
//系统函数,把我们自定义数据注册到window
return RegisterClassEx(&wcex);
}
3.创建主函数,并保存实例句柄
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
// 将实例句柄存储在全局变量中
hInst = hInstance;
//CreateWindow()创建窗口函数
hWnd = CreateWindow(szWindowClass, //类名,必须与上面窗口类名一致
szTitle,//窗口标题,可用_T("")替换
WS_OVERLAPPEDWINDOW,//窗口风格
//控制窗口起始坐标,一般默认
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL, //窗口的父窗口
NULL, //窗口的菜单句柄,给NULL是代表用注册窗口类中的菜单,不给NULL,就意味着当前窗口用的这个菜单
hInstance, //实例句柄
NULL//拓展参数
);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);//显示窗口
UpdateWindow(hWnd);//更新窗口
return TRUE;
}
4.处理窗口信息函数(重点)
先简述,后面补充
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
//定义初始工具
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)//判断信息
{
//如果消息用到鼠标双击WM_LBUTTONDBLCLK,需要在窗口风格加上CS_DBLCLKS
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: 在此添加任意绘图代码...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);//系统销毁函数
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
5.框处理函数(暂时不用,用到会补充)
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;
}