使用BOOL TransparentBltm(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int hHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, UINT crTransparent函数绘制的透明图片在一般的对话框上能实现透明的效果,可在有背景图片的对话框上实现时透明部分不是背景图片,而是对话框本来的灰色。郁闷,看了好多书,用了好多方法都实现不了。我猜,可能是个顺序问题,但我不知道怎样解决。希望高手可以帮助我。
先把背景图片bitblt 到 对话框上,
然后把要透明的图片用TransparentBltm再贴到对话框上。这样做你要注意一个问题就是:
TransparentBltm 最后一个参数,也就是那个需要透明的颜色。
这也跟你的, 需要透明的那张图片有关。比如:
你要透明的那个图片上有一朵花,你就想让这朵花贴上去。
那你就得保证这图片上除了这朵花有多个颜色。而其它的地方必须得是单色。也就是需要透明的那个颜色.
比如白色.那 这个TransparentBltm 最一个参数。你就填 RGB(255,255,255) 就可以了。
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里,为什么?按道理,可以绘制静态控件啊!
我没太看明白你的程序。
如果你想用位图自己做一个按钮的话,那么就把位图按一个RECT 贴到window 上
按后再判断鼠标按下的位置是否在这个RECT内如果是那就可以执行按钮的事件了。
画的过程也就是在你注册的窗口过程里
截获 WM_PAINT 然后在里边
PAINTSTRUCT ps;
HDC hDC = ::BeginPaint(m_hWnd, &ps);
先贴背景图片
然后在TransparentBltm 去贴你的按钮图片.
::EndPaint(m_hWnd, &ps);