BitBlt的画图问题

2007bobo2008   2009-11-27 11:43 楼主
各位:
  我用一个临时DC来选图片,然后把到放到内存DC指定位置,然后把内存DC的图片拷到显示DC里去。
刚开始的时候显示DC里是一个纯黑的图,BitBlt过去后,彩色图片变成白色了。
后来我把显示DC清空,直接把内存DC的拷到显示DC里去,发现原来从临时DC到内存DC的时候图片就花的了。
这个问题好像是BitBlt在把彩色图拷到单色图时的问题,不过不知道怎么处理。(因为我直接把图选到内存DC,在从内存DC到显示DC,图片显示是正常的,好像显示DC也是单色,晕了。。。)

可能说的不清楚,不知道怎么解决?

回复评论 (10)

那你希望是什么样子的呢?
你难道是要把彩色图显示的时候变成单色图?
点赞  2009-11-27 11:50
没有啊 就彩色显示出来啊。
问题是现在搞过去后,背景都跟着花了,整个就变成了黑白的。
不知道怎么上图 不然上个图给你看
点赞  2009-11-27 12:05

  1. //这是在ShowWindow之前把图片加载好,并画到内存DC中。
  2.         TCHAR szPath[100];

  3.         wsprintf(szPath, _T("%s%s"), g_szImagePath, _T("bkImage_bk.jpg"));
  4.         g_stIcon[0].bitmapUp = SHLoadImageFile(szPath);
  5.         g_stIcon[0].position.left = 0;
  6.         g_stIcon[0].position.top = 0;
  7.         g_stIcon[0].position.right = SCREENWIDTH;
  8.         g_stIcon[0].position.bottom = SCREENHIGHT;

  9.         wsprintf(szPath, _T("%s%s"), g_szImagePath, _T("button_up.png"));
  10.         g_stIcon[1].bitmapUp = SHLoadImageFile(szPath);
  11.         wsprintf(szPath, _T("%s%s"), g_szImagePath, _T("button_down.png"));
  12.         g_stIcon[1].bitmapDown = SHLoadImageFile(szPath);
  13.         g_stIcon[1].position.left = 0;
  14.         g_stIcon[1].position.top = 0;
  15.         g_stIcon[1].position.right = 60;
  16.         g_stIcon[1].position.bottom = 74;
  17.        


  18.         HDC hdc = GetDC(hwnd);
  19.         g_hMerDC = CreateCompatibleDC(hdc);
  20.         HBITMAP Canvas = CreateCompatibleBitmap(g_hMerDC, 720, 400);
  21.         SelectObject(g_hMerDC, Canvas);
  22. //        SetBkColor(g_hMerDC, RGB(0, 0, 0));
  23. //        SetBkMode(g_hMerDC, TRANSPARENT);

  24.         HDC hTempDC = CreateCompatibleDC(hdc);
  25.         SelectObject(hTempDC, g_stIcon[1].bitmapUp);
  26.         BitBlt(g_hMerDC, g_stIcon[1].position.left, g_stIcon[1].position.top, g_stIcon[1].position.right, g_stIcon[1].position.bottom,
  27.                 hTempDC, 0, 0, SRCCOPY);


  28. //        SelectObject(g_hMerDC, g_stIcon[IMG_CALL].bitmapUp);
  29.         ReleaseDC(hwnd, hdc);
  30.         return TRUE;


  31. //下面是在wm_paint的时候
  32.                                 //把背景显示到屏幕上
  33.                                 HDC hTempDC = CreateCompatibleDC(hdc);

  34.                                 SelectObject(hTempDC, g_stIcon[0].bitmapUp);
  35.                                 BitBlt(hdc, 0, 0, SCREENWIDTH, SCREENHIGHT, hTempDC, 0, 0, SRCCOPY);
  36.                                 g_once = FALSE;

  37.                                

  38.                                 DeleteDC(hTempDC);

  39. //                                 SetBkColor(g_hMerDC, RGB(0, 0, 0));
  40. //                                 SetBkMode(g_hMerDC, TRANSPARENT);               
  41. //内存DC的拷到显示DC
  42.                                 BitBlt(hdc, 0, 0, SCREENWIDTH, SCREENHIGHT, g_hMerDC, (g_dwCurPage - 1) * 240, 0, SRCCOPY);



就这些代码
点赞  2009-11-27 12:11
你怎么选图的,memdc缺省的bitmap是个1x1单色的bitmap,你要为它创建一个合适的bitmap.就像下面这样:
HDC memDC = CreateCompatibleDC ( hDC );     
HBITMAP memBM = CreateCompatibleBitmap ( hDC, nWidth, nHeight );
SelectObject ( memDC, memBM );
点赞  2009-11-27 12:13
这个处理过了 给了一个屏幕还大的BITMAP
点赞  2009-11-27 12:15
    HDC hdc = GetDC(hwnd);
    g_hMerDC = CreateCompatibleDC(hdc);
    HBITMAP Canvas = CreateCompatibleBitmap(g_hMerDC, 720, 400);

正确的代码应该是:

    HDC hdc = GetDC(hwnd);
    g_hMerDC = CreateCompatibleDC(hdc);
    HBITMAP Canvas = CreateCompatibleBitmap(hdc, 720, 400);
点赞  2009-11-27 14:10
谢谢WceUi
好像问题就出在这。
我记BitBlt可以把源图片中 除了某色以外的色彩传送到目标图片吧,就是指背景色为透明。请问这个怎么做?这是我在书上看的,但BitBlt的参数中没找到这个。
能不能讲一下,谢谢
点赞  2009-11-27 14:18
试试TransparentBlt,最后一个参数就是你说的关键色
点赞  2009-11-27 15:17
用这个方法的话,背景和彩色交界出有渐变的话,旁边还是会有一点背景色呢。
点赞  2009-11-27 16:31
这个问题专业,就需要AlphaBlend了,
需要32位的位图,,针对每个点做alpha通道.

PC机上好像PNG用得比较多,就是因为png有alpha通道
引用: 引用 9 楼 kaiyi1986 的回复:
用这个方法的话,背景和彩色交界出有渐变的话,旁边还是会有一点背景色呢。
点赞  2009-11-27 16:40
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复