【问题标题】:win32 picture control stop repaintingwin32图片控制停止重绘
【发布时间】:2014-06-02 16:35:12
【问题描述】:

首先,我在对话框中加载了一个带有 bitmap1 的图片控件:

SendMessage(hWnd, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)LoadImage(NULL, sbitmap1.c_str(), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE));

其次,在某个时候,我使用 StretchBlt 在图片控件中绘制了一个 bitmap2。

hdcImage = GetDC(hWnd)  
hMemDC = CreateCompatibleDC( hdcImage );    
hOldbm = (HBITMAP)SelectObject( hMemDC, hbitmap2 );
SetStretchBltMode( hdcImage, COLORONCOLOR);
StretchBlt( hdcImage, left, top, width, height, hMemDC, 0, 0, w, h, SRCCOPY );
SelectObject( hMemDC, hOldbm );

bitmap2 绘制成功,但在某些情况下(例如当我最小化对话框时)图片控件不再显示 bitmap2 而是显示 bitmap1。

我认为问题在于重绘事件。有没有办法停止重绘事件或更改此事件要绘制的位图?

编辑:

感谢@Mark 和@Edward 的回答。 问题是这样的:

  1. 使用 StretchBlt 后,您需要执行 SendMessage STM_SETIMAGE
  2. 对于 SendMessage STM_SETIMAGE,使用全局 HBITMAP(最好)

类似这样的:

hbitmapglobal = (HBITMAP)CopyImage(hbitmap2, IMAGE_BITMAP, abs(width), abs(height), LR_COPYRETURNORG);
SendMessage(hWnd, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hbitmapglobal);

CopyImage 是制作 HBITMAP 副本的真正简单方法。考虑到这是一个示例,必须在某个时候释放 hbitmapglobal。

【问题讨论】:

  • 是否有什么阻止您再次发送STM_SETIMAGE?那应该可以解决它。

标签: c++ winapi


【解决方案1】:

通常所有的绘制都发生在WM_PAINT 处理程序中。

当您需要绘制第二个位图并使图片控件的矩形无效时,我建议设置(全局)变量。

检查WM_PAINT 处理程序中的变量并在那里进行绘制。

【讨论】:

  • 谢谢。问题是:1)使用 StretchBlt 绘制后,您需要 SendMessage STM_SETIMAGE 2)STM_SETIMAGE 需要全局 HBITMAP。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 2013-05-07
  • 2013-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多