VC++设置窗口背景(非MFC)类窗口

通过CreateWindowExA(…)创建了窗口,要给窗口添加背景,同时能够缩放图片。
在网上查了一下,都是关于MFC窗口的背景设置,有些关于非MFC的,比较零散,还有些需要往工程里添加bitmap,都不太适合。摸索了半天搞定,记录一下。
代码比较简单,主要是在WM_PAINT下绘制,麻烦是有些API不熟,直接贴代码:

#include <iostream>
#include <Windows.h>
#include <atlimage.h>

//将不同格式图片转为BMP
bool convert2bmp(HBITMAP &bitmap, const std::string &url)
{
	CImage img;
	HRESULT ret = img.Load(url.c_str()); 
	bitmap = img.Detach();
	return true;
}

// 消息处理函数的实现  
LRESULT CALLBACK PlayerWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg)
	{
	case WM_PAINT:
		{
			PAINTSTRUCT ps;
			HDC hdc = ::BeginPaint(hwnd,&ps);
			HDC s_hdcMem = CreateCompatibleDC(hdc);

			HBITMAP hBitmap;
			BITMAP s_bm;
			convert2bmp(hBitmap, "./background/bg.png");//png,jpg,bmp均可			
			SelectObject(s_hdcMem, hBitmap);			
			GetObject(hBitmap, sizeof(s_bm), &s_bm);// 得到位图信息

			RECT       rect;
			GetClientRect(hwnd, &rect);

			//通过SetStretchBltMode的设置能使StretchBlt在缩放图像更加清晰
			SetStretchBltMode(hdc, COLORONCOLOR);//STRETCH_HALFTONE
			StretchBlt(hdc, 0, 0, rect.right, rect.bottom, s_hdcMem, 0, 0, s_bm.bmWidth, s_bm.bmHeight, SRCCOPY);	

			::EndPaint(hwnd,&ps);
			return 0;
		}

	case WM_NCHITTEST: //实现窗口移动,与WM_LBUTTONDBLCLK冲突
		{
			UINT nHitTest;
			nHitTest = ::DefWindowProc(hwnd,uMsg,wParam,lParam);

			if(nHitTest == HTCLIENT && ::GetAsyncKeyState(MK_LBUTTON) < 0)
			{
				nHitTest = HTCAPTION;					
			}

			return nHitTest;
		}

	case WM_DESTROY:
		{
			PostQuitMessage(0);
			return 0;
		}

	case WM_KEYDOWN:
		if (wParam == VK_ESCAPE)//"ECS键"退出
		{
			PostMessage(hwnd, WM_DESTROY, 0, 0);
			return 0;
		}
		break;
	}
	return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

//创建窗口
HWND CreateWin(double pos_x, double pos_y, double width, double height, HWND hwd, DWORD style)
{	
	HINSTANCE hinstance = (HINSTANCE)GetModuleHandle(NULL);	// 得到进程实例句柄.

	WNDCLASSEXA wcex;

	wcex.cbSize = sizeof(WNDCLASSEXA);
	wcex.style			= CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
	wcex.lpfnWndProc	= PlayerWndProc;
	wcex.cbClsExtra  	= 0;
	wcex.cbWndExtra  	= 0;
	wcex.hInstance		= hinstance;
	wcex.hIcon			= LoadIcon(hinstance, MAKEINTRESOURCE(IDC_ICON));
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= CreateSolidBrush(RGB(0, 0 , 0));
	wcex.lpszMenuName	= NULL;				
	wcex.lpszClassName	= "player";
	wcex.hIconSm		= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDC_ICON));

	RegisterClassExA(&wcex)	;

	// 创建窗口.
	HWND hwnd = CreateWindowExA(0,"player", "", style, pos_x, pos_y, width, height, hwd, NULL, hinstance, NULL);

	ShowWindow(hwnd, SW_SHOW);

	return hwnd;
}


int main(int argc, char* argv[])
{
	HWND hwnd = CreateWin(0, 0, 720, 576, NULL, WS_POPUP);

	MSG msg;
	while (GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return 0;
}


参考:
https://blog.csdn.net/yejun556688/article/details/37053147

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值