ZBLOG

怎么给通过句柄给窗口设置图片,并且后面不要让这张图片被刷新掉

要给窗口设置图片并确保后面不被刷新掉,可以使用WM_PAINT消息和双缓冲技术。

下面是一个示例代码,展示如何通过句柄给窗口设置图片,并在窗口绘制时使用双缓冲来防止图片被刷新掉:

#include <windows.h>

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int main()
{
    // 创建窗口类注册
    WNDCLASSEX wc = { 0 };
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = GetModuleHandle(NULL);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.lpszClassName = L"MyWindowClass";
    
    RegisterClassEx(&wc);
    
    // 创建窗口
	HWND hwnd = CreateWindowEx(
        0,
        L"MyWindowClass",
        L"窗口标题",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
        NULL,
        NULL,
        GetModuleHandle(NULL),
        NULL
	);

	if (hwnd == NULL)
		return 0;

	// 加载图片
	HBITMAP hBitmap = static_cast<HBITMAP>(LoadImage(GetModuleHandle(NULL), 
                                              L"path_to_image_file.bmp", 
                                              IMAGE_BITMAP, 
                                              0, 0, 
                                              LR_LOADFROMFILE));
											  
	if (hBitmap == NULL)
		return 0;
	
	// 存储绘制区域的矩形
	RECT clientRect;
	GetClientRect(hwnd, &clientRect);

	// 创建双缓冲绘制设备上下文
	HDC hdc = GetDC(hwnd);
	HDC memDC = CreateCompatibleDC(hdc);
	HBITMAP hOldBitmap = SelectObject(memDC, hBitmap);

	// 绘制图片到双缓冲区域
	BitBlt(hdc, 0, 0, clientRect.right, clientRect.bottom,
           memDC, 0, 0, SRCCOPY);

	SelectObject(memDC, hOldBitmap);
	DeleteObject(hBitmap);
	DeleteDC(memDC);
	ReleaseDC(hwnd, hdc);

	// 显示窗口
	ShowWindow(hwnd, SW_SHOWDEFAULT);
	UpdateWindow(hwnd);

	// 消息循环
	MSG msg;
	while (GetMessage(&msg, nullptr, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return static_cast<int>(msg.wParam);
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg,
                            WPARAM wParam, LPARAM lParam)
{
	switch (uMsg)
    {
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hwnd,&ps); // 开始绘制
            
            // 在这里添加自定义的绘制逻辑,不要再绘制图片了
            
            EndPaint(hwnd,&ps); // 结束绘制
        }
        break;

	case WM_DESTROY:
        PostQuitMessage(0);
        break;

	default:
	    return DefWindowProc(hwnd,uMsg,wParam,lParam);
    }

	return 0;
}

在上述代码中,我们使用LoadImage()函数加载一张图片(.bmp格式)作为窗口的背景图。然后,通过双缓冲绘制设备上下文(memDC)将图片绘制到内存中,并使用BitBlt()函数将内存中的内容复制到窗口的设备上下文(hdc)。这样可以确保在窗口刷新时,不会重新绘制图片。

请注意,你需要将 L"path_to_image_file.bmp" 替换为实际的图片文件路径。

最后,在消息循环中,处理 WM_PAINT 消息以添加自定义的绘制逻辑。在这个示例中,我们没有再次绘制图片,而是留出空白供你添加其他自定义绘制操作。

这种方式可以实现在窗口显示期间保持一张静态图片,并避免被刷新掉。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=13738

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?