#include<Windows.h>
/// <summary>
///
/// </summary>
/// <param name="hinstance"></param>
/// <param name="HpREViNSTANCE"></param>
/// <param name="lpCMDline"></param>
/// <param name="nCMDshow"></param>
/// <returns></returns>
/// //hinstance 应用程序当前实例窗口
LRESULT CALLBACK CallbackFunc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
//hwnd 从主函数获得的窗口句柄
//msg从主函数的消息循环中获取的消息
//wParam附加参数1
//Lparam附加参数2
//c语言Review
//switch用于一个整数进行判断,并跳到相应的case语句块
//会一直执行知道break或switch语句块的末尾
//所以写完一个case要加break;
//版然会执行意想不到的结果
switch (msg)
{
//case WM_TIMER:
// if (wParam == 1) {
// Timer(hwnd 1);
// PostMessage(hwnd, WM_CLOSE, 0, 0);
// }
// break;
case WM_PAINT: {
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
// 加载位图
HBITMAP hBitmap = (HBITMAP)LoadImage(NULL, L"name.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
///此处放置图片名字,和此文件在同一目录下直接放名字,
// /否则放路径
// 创建兼容的内存设备上下文
HDC hdcMem = CreateCompatibleDC(hdc);
HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, hBitmap);
// 获取位图的宽度和高度
BITMAP bm;
GetObject(hBitmap, sizeof(bm), &bm);
// 绘制位图
BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);
// 清理资源
SelectObject(hdcMem, hbmOld);
DeleteDC(hdcMem);
DeleteObject(hBitmap);
TextOut(hdc, 80, 10, L"Welcome to Snake Game", 21);
EndPaint(hwnd, &ps);
// 启动定时器,设置为5秒
break;
}
case WM_COMMAND: {
// 处理按钮点击事件
if (LOWORD(wParam) == 1) // 判断按钮ID是否为1
{
// 创建另一个窗口
HWND hWndNew = CreateWindow(L"MyWindowClass", L"New Window", WS_OVERLAPPEDWINDOW, 200, 200, 400, 300, NULL, NULL, GetModuleHandle(NULL), NULL);
ShowWindow(hWndNew, SW_SHOW);
UpdateWindow(hWndNew);
}
break;
}
case WM_DESTROY://如果要退出
PostQuitMessage(0);//传递退出消息,终止主函数的消息循环
break;
// 默认行为(什么都不做,就返回窗口)
// 这个地方,很多萌新都容易漏,导致窗口不显示又退不出循环,注意一下
default: return DefWindowProc(hwnd, msg, wParam, lParam);
}
}
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE HpREViNSTANCE, LPSTR lpCMDline, int nCMDshow)
{WNDCLASS 窗口类信息,是个结构图
WNDCLASS wc = {};
wc.lpfnWndProc = CallbackFunc;
wc.hInstance = hinstance;//实例窗口句柄
wc.lpszClassName = L"MY_SnakeGame";
RegisterClass(&wc);
//RegisterClass()注册窗口类
//接受一个WNDCLASS的指针
//必须通过这一步,窗口才能注册成功
//CreateWindow 创建窗口,返回一个窗口句柄
HWND hwnd = CreateWindow(
wc.lpszClassName, //窗口类名,要和wc.lpszClassName相同
L"Begin", //窗口标题
WS_OVERLAPPEDWINDOW | WS_VISIBLE, //窗口样式
1300, //左上角横坐标
550, //左上角纵坐标
350, //窗口宽度
450, //窗口高度
NULL, //父窗口
NULL, //菜单句柄
hinstance, //实例窗口
NULL //附加参数
);
//消息循环的构建
//
//4.显示和更新窗口
//
CreateWindow(L"BUTTON", L"Click me", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 125, 120, 90, 40, hwnd, (HMENU)1, NULL, NULL);
ShowWindow(hwnd, SW_SHOW);
UpdateWindow(hwnd);
MSG msg = {}; //消息结构体
while (GetMessage(&msg, 0, NULL, NULL)) // 如果没有发生错误,且收到了任意消息...
{
//::TranslateMessage(&msg); // 翻译消息,将消息中的键盘码转换为对应的字符
DispatchMessage(&msg); // 派发消息,调用 CallBackFunc 回调函数处理消息
}
return 0;
}
这个实例的函数,作者也是半知半解,还请广大网友给出建议
回调函数作者都没整明白,作者菜的一批,大家将就看