在内存中创建位图并使用它

标签 c winapi bitmap

我的目标是在内存中创建一个位图,并将其句柄用作 BM_SETIMAGE 消息(设置按钮位图的消息)的参数。

以下是我的代码:

........

        HDC hdc = GetDC(hwnd);
        HDC memDC = CreateCompatibleDC(hdc);
        HBITMAP hMemBmp = CreateCompatibleBitmap(hdc, 100, 100);
        HBITMAP hOldBmp = (HBITMAP)SelectObject(memDC, hMemBmp);
        Rectangle(memDC, 0, 0, 100, 100);

        HBRUSH brush = CreateSolidBrush(RGB(0xff, 0xff, 0x00));

        RECT rc;
        rc.left   = 0; 
        rc.top    = 0;
        rc.right  = 100;
        rc.bottom = 100;
        FillRect(memDC, &rc, brush);

        SendMessage(GetDlgItem(hDlg, IDC_SET_START_PAGE_BG), BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hMemBmp);

........

但它不起作用,我的按钮上只有黑色。

问题:

  1. FillRect(memDC, &rc, Brush)是否修改了hMemBmp的内容?如果没有,SelectObject(memDC, hMemBmp) 对这两个对象做了什么?

  2. 我应该使用 CreateBitmap 而不是 CreateCompatibleBitmap 来完成我的任务吗?

最佳答案

在发送消息之前,您应该将旧位图选回内存 DC。 According to MSDN一次只能将位图选择到单个 DC 中。

关于在内存中创建位图并使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14146180/

相关文章:

c - 有没有办法禁止linux上的gnu malloc分配某些内存区域?

c - execv 到 .c prog 使用相同的管道

c++ - 在一个进程中混合和匹配 Visual C++ 运行时 DLL 文件有多糟糕?

windows - 窗口消息是 "Reliable"吗?

.net - 当叠加两个相同大小的图像时,其中一个会偏移

c - 访问字符中的位?

c++ - 在作为函数参数的句柄上调用 CloseHandle?

java - MediaMetadata.getString java.lang.RuntimeException : Could not read bitmap from parcel blob

Android 位图图像大小

使用具有多个进程的管道连续写入和读取