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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章