win32图片控制停止重新绘制

时间:2014-06-02 16:35:13

标签: c++ winapi

首先,我在对话框中加载了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. for SendMessage STM_SETIMAGE使用全局HBITMAP(最好)
  3. 这样的事情:

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

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

1 个答案:

答案 0 :(得分:0)

通常所有绘画都在WM_PAINT处理程序中进行。

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

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