各位:
我用一个临时DC来选图片,然后把到放到内存DC指定位置,然后把内存DC的图片拷到显示DC里去。
刚开始的时候显示DC里是一个纯黑的图,BitBlt过去后,彩色图片变成白色了。
后来我把显示DC清空,直接把内存DC的拷到显示DC里去,发现原来从临时DC到内存DC的时候图片就花的了。
这个问题好像是BitBlt在把彩色图拷到单色图时的问题,不过不知道怎么处理。(因为我直接把图选到内存DC,在从内存DC到显示DC,图片显示是正常的,好像显示DC也是单色,晕了。。。)
可能说的不清楚,不知道怎么解决?
那你希望是什么样子的呢?
你难道是要把彩色图显示的时候变成单色图?
没有啊 就彩色显示出来啊。
问题是现在搞过去后,背景都跟着花了,整个就变成了黑白的。
不知道怎么上图 不然上个图给你看
- //这是在ShowWindow之前把图片加载好,并画到内存DC中。
- TCHAR szPath[100];
- wsprintf(szPath, _T("%s%s"), g_szImagePath, _T("bkImage_bk.jpg"));
- g_stIcon[0].bitmapUp = SHLoadImageFile(szPath);
- g_stIcon[0].position.left = 0;
- g_stIcon[0].position.top = 0;
- g_stIcon[0].position.right = SCREENWIDTH;
- g_stIcon[0].position.bottom = SCREENHIGHT;
- wsprintf(szPath, _T("%s%s"), g_szImagePath, _T("button_up.png"));
- g_stIcon[1].bitmapUp = SHLoadImageFile(szPath);
- wsprintf(szPath, _T("%s%s"), g_szImagePath, _T("button_down.png"));
- g_stIcon[1].bitmapDown = SHLoadImageFile(szPath);
- g_stIcon[1].position.left = 0;
- g_stIcon[1].position.top = 0;
- g_stIcon[1].position.right = 60;
- g_stIcon[1].position.bottom = 74;
-
- HDC hdc = GetDC(hwnd);
- g_hMerDC = CreateCompatibleDC(hdc);
- HBITMAP Canvas = CreateCompatibleBitmap(g_hMerDC, 720, 400);
- SelectObject(g_hMerDC, Canvas);
- // SetBkColor(g_hMerDC, RGB(0, 0, 0));
- // SetBkMode(g_hMerDC, TRANSPARENT);
- HDC hTempDC = CreateCompatibleDC(hdc);
- SelectObject(hTempDC, g_stIcon[1].bitmapUp);
- BitBlt(g_hMerDC, g_stIcon[1].position.left, g_stIcon[1].position.top, g_stIcon[1].position.right, g_stIcon[1].position.bottom,
- hTempDC, 0, 0, SRCCOPY);
- // SelectObject(g_hMerDC, g_stIcon[IMG_CALL].bitmapUp);
- ReleaseDC(hwnd, hdc);
- return TRUE;
- //下面是在wm_paint的时候
- //把背景显示到屏幕上
- HDC hTempDC = CreateCompatibleDC(hdc);
- SelectObject(hTempDC, g_stIcon[0].bitmapUp);
- BitBlt(hdc, 0, 0, SCREENWIDTH, SCREENHIGHT, hTempDC, 0, 0, SRCCOPY);
- g_once = FALSE;
-
- DeleteDC(hTempDC);
- // SetBkColor(g_hMerDC, RGB(0, 0, 0));
- // SetBkMode(g_hMerDC, TRANSPARENT);
- //内存DC的拷到显示DC
- BitBlt(hdc, 0, 0, SCREENWIDTH, SCREENHIGHT, g_hMerDC, (g_dwCurPage - 1) * 240, 0, SRCCOPY);
就这些代码
你怎么选图的,memdc缺省的bitmap是个1x1单色的bitmap,你要为它创建一个合适的bitmap.就像下面这样:
HDC memDC = CreateCompatibleDC ( hDC );
HBITMAP memBM = CreateCompatibleBitmap ( hDC, nWidth, nHeight );
SelectObject ( memDC, memBM );
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);
谢谢WceUi
好像问题就出在这。
我记BitBlt可以把源图片中 除了某色以外的色彩传送到目标图片吧,就是指背景色为透明。请问这个怎么做?这是我在书上看的,但BitBlt的参数中没找到这个。
能不能讲一下,谢谢
试试TransparentBlt,最后一个参数就是你说的关键色
用这个方法的话,背景和彩色交界出有渐变的话,旁边还是会有一点背景色呢。
这个问题专业,就需要AlphaBlend了,
需要32位的位图,,针对每个点做alpha通道.
PC机上好像PNG用得比较多,就是因为png有alpha通道
引用: 引用 9 楼 kaiyi1986 的回复:
用这个方法的话,背景和彩色交界出有渐变的话,旁边还是会有一点背景色呢。