Win32学习(第八天)gdi最后一弹

通过这三天的学习使我对gdi有了进一步的认识,但由于我个人智慧的有限导致了认识和理解的造成的片面和不足,还请假见谅。
当位图的资源在在处理主窗口消息的区域进行响应时,可以采用WM_PAINT后面添加代码的方式,还可以选用按键或者鼠标响应的方法,如下面就是采用鼠标响应的方法

case WM_LBUTTONDOWN:
			{
				hdc = GetDC(hWnd);//获得设备的主DC
				HDC hBkDc = CreateCompatibleDC(hdc);//创建一个兼容DC
				//从文件中将资源图片加载
				HBITMAP hBkBitmap = (HBITMAP)LoadImage(hInst,//资源句柄 
					_T("bk.bmp"),//加载资源的文件名
					IMAGE_BITMAP, //风格方式
					0, 0, //期望的高度值,如果给0,自动匹配图片的大小
					LR_LOADFROMFILE);//文件的加载
				SelectObject(hBkDc, hBkBitmap);//将hBkBitmap关联进了hBkDc里面
				BitBlt(hdc,//目标dc,就是要表现的dc
					0, 0, //目标dc需要表现的左上角的x,y坐标
					960, 600,//目标dc来表现资源dc需要操作过来的内容
					hBkDc,//资源dc,里面有加载的资源
					0, 0, //资源dc的起始裁剪坐标
					SRCCOPY);//从资源dc怎么操作到目标dc,用源拷贝
				//释放第2步的创建资源
				DeleteObject(hBkBitmap);//将hBkBitmap释放
				DeleteObject(hBkDc);//将hBkDc释放

				HDC hHeroDc = CreateCompatibleDC(hdc);//再创建一个兼容DC
				//加载文件资源
				HBITMAP hHeroBitmap = (HBITMAP)LoadImage(hInst, _T("hero.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
				SelectObject(hHeroDc, hHeroBitmap);//将位图与兼容dc建立联系
				//BitBlt(hdc, 0, 0, 360, 352, hHeroDc, 0, 0, SRCCOPY);
				TransparentBlt(hdc, 0, 0,90,88,/* 360, 352,*///目标区域
					hHeroDc, 0, 0, 
					90,88,/*360, 352,*///此区域可以进行裁剪
					RGB(255, 255, 255));//把资源画到目标,可以处理背景色为透明
				DeleteObject(hHeroBitmap);
				DeleteObject(hHeroDc);
				ReleaseDC(hWnd, hdc);
			}
				break;

但是采用这种方式,如果将窗口进入无效区域,位图资源将会消失,无法进行保持,这时可以通过将其代码书写区域的改变,使其达到不断重绘位图,这时需将代码放置主函数区域,并将主消息循环改为PeekMessage()函数的方式,已达到不断重绘的效果

//HDC hdc = GetDC(g_hWnd);
	////双缓冲
	//HDC hBuffDc = CreateCompatibleDC(hdc);
	//HBITMAP hBuffBitmap = CreateCompatibleBitmap(hdc, 1024, 768);//一个缓冲兼容dc
	//SelectObject(hBuffDc, hBuffBitmap);
	////资源的加载
	//HDC hBkDc = CreateCompatibleDC(hdc);
	//HBITMAP hBkBitmap = (HBITMAP)LoadImage(hInst, _T("bk.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);//从文件加载了资源图片
	//SelectObject(hBkDc, hBkBitmap);

	//HDC hHeroDc = CreateCompatibleDC(hdc);
	//HBITMAP hHeroBitmap = (HBITMAP)LoadImage(hInst, _T("hero.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);//从文件加载了资源图片
	//SelectObject(hHeroDc, hHeroBitmap);

	//ReleaseDC(g_hWnd, hdc);

	//ZeroMemory(&msg, sizeof(msg));
	//while (msg.message != WM_QUIT)
	//{
	//	if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE))
	//	{
	//		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
	//		{
	//			TranslateMessage(&msg);
	//			DispatchMessage(&msg);
	//		}
	//	}
	//	//逻辑
	//	static int index = 0;
	//	static float beginTimer = timeGetTime() / 1000.0f;
	//	float endTimer = timeGetTime() / 1000.0f;
	//	static float speed = 0.3f;
	//	//不管有没有消息,都进行循环绘制
	//	hdc = GetDC(g_hWnd);
	//	RECT r = { 0, 0, 1024, 768 };
	//	HBRUSH hr = CreateSolidBrush(0x00);
	//	FillRect(hBuffDc, &r, hr);
	//	BitBlt(hBuffDc, 0, 0, 960, 600, hBkDc, 0, 0, SRCCOPY);
   //TransparentBlt(hBuffDc, 0, 0, 90, 88,
		//			hHeroDc, 90*index, 88, 
			//		90,88,
			//		RGB(255, 255, 255));//把资源画到目标,可以处理背景色为透明
	//	if (endTimer - beginTimer >= speed)
	//	{
	//		index++;
	//		if (index >= 4)
	//		
	//			index = 0;
	//			beginTimer = endTimer;
	//
	//		
	//	}
	//	//最后一次把缓冲dc的内容拷贝到主dc
	//	BitBlt(hdc, 0, 0, 1024, 768, hBuffDc, 0, 0, SRCCOPY);
	//	DeleteObject(hr);
	//	ReleaseDC(g_hWnd, hdc);
	//}
	//DeleteObject(hHeroBitmap);
	//DeleteObject(hBkBitmap);
	//DeleteObject(hBuffBitmap);
	//DeleteDC(hHeroDc);
	//DeleteDC(hBkDc);
	//DeleteDC(hBuffDc);

猜你喜欢

转载自blog.csdn.net/qq_41848597/article/details/88997942
今日推荐