WindowsAPI小窗口实例

#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;

}

 这个实例的函数,作者也是半知半解,还请广大网友给出建议

回调函数作者都没整明白,作者菜的一批,大家将就看

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值