使用BOOL TransparentBltm(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int hHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, UINT crTransparent函数绘制的透明图片在一般的对话框上能实现透明的效果,可在有背景图片的对话框上实现时透明部分不是背景图片,而是对话框本来的灰色。郁闷,看了好多书,用了好多方法都实现不了。我猜,可能是个顺序问题,但我不知道怎样解决。希望高手可以帮助我。

解决方案 »

  1.   

    顺序是这样的。
    先把背景图片bitblt 到 对话框上,
    然后把要透明的图片用TransparentBltm再贴到对话框上。这样做你要注意一个问题就是:
    TransparentBltm 最后一个参数,也就是那个需要透明的颜色。
    这也跟你的, 需要透明的那张图片有关。比如:
    你要透明的那个图片上有一朵花,你就想让这朵花贴上去。
    那你就得保证这图片上除了这朵花有多个颜色。而其它的地方必须得是单色。也就是需要透明的那个颜色.
    比如白色.那 这个TransparentBltm 最一个参数。你就填 RGB(255,255,255) 就可以了。
      

  2.   

    hBack = ::LoadBitmap(MPublic::hinstance,MAKEINTRESOURCE(IDB_START));
    hwndBack = CreateWindow(TEXT("static"),"",
                WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
                0,0,640,480,
    hwnd,(HMENU)4,MPublic::hinstance,NULL);
    case  WM_DRAWITEM:
    lpdis = (LPDRAWITEMSTRUCT)lParam;
    hdcMem = CreateCompatibleDC(lpdis->hDC);
    rect1 = lpdis->rcItem;
    //  rect2 = 
    switch(lpdis->CtlID)
    {
    case 4:
    hBitmapOld = (HBITMAP)SelectObject(hdcMem,hBack);
    BitBlt(lpdis->hDC,0,0,640,460,hdcMem,0,0,SRCCOPY);
    SelectObject(hdcMem,hBitmapOld);
    return TRUE;
                    }
    无法进入case4里,为什么?按道理,可以绘制静态控件啊!
      

  3.   

    windows编程 对话框上放上一个pic控件显示背景图像,在放上一个自制的按钮,按钮上绘制的是一张位图,可是透明处理后周围却显示灰色对话框背景首先
    我没太看明白你的程序。
    如果你想用位图自己做一个按钮的话,那么就把位图按一个RECT 贴到window 上
    按后再判断鼠标按下的位置是否在这个RECT内如果是那就可以执行按钮的事件了。
    画的过程也就是在你注册的窗口过程里 
    截获 WM_PAINT 然后在里边 
    PAINTSTRUCT ps; 
    HDC hDC = ::BeginPaint(m_hWnd, &ps);
      先贴背景图片
      然后在TransparentBltm 去贴你的按钮图片.
    ::EndPaint(m_hWnd, &ps);