如何画一个半透明的区域

tipbridge 2003-10-20 04:36:26
我的程序中,客户区的画了一些图片,现在想在这些图片上面的部分区域rect中,画一个半透明(透明度可调)的矩形区域。

目前我用的是将屏幕中的点的象素取出来,然后和透明色进行处理,然后再写到屏幕上,但这种作图方式太慢,有没有更快的办法?
...全文
156 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
qrlvls 2003-10-27
  • 打赏
  • 举报
回复
CMemDC::CMemDC(CDC *pDC, int nLeft, int nTop, int nWidth, int nHeight)
{
m_pOldBitmap = NULL;

if(pDC)
m_pSrcDC = pDC;
else
m_pSrcDC = CDC::FromHandle(GetDC(NULL));

m_nLeft = nLeft;
m_nTop = nTop;
m_nWidth = nWidth;
m_nHeight = nHeight;

CreateCompatibleDC(pDC);
m_bmpMemory.CreateCompatibleBitmap(m_pSrcDC, m_nWidth, m_nHeight);
m_pOldBitmap = SelectObject(&m_bmpMemory);

BitBlt(0, 0, m_nWidth, m_nHeight, m_pSrcDC, nLeft, nTop, SRCCOPY); // 复制源位图
}

CMemDC::~CMemDC()
{
SelectObject(m_pOldBitmap);
}

void CMemDC::Draw(CDC *pDC)
{
if (pDC)
pDC->BitBlt(m_nLeft, m_nTop, m_nWidth, m_nHeight, this, 0, 0, SRCCOPY);
else
m_pSrcDC->BitBlt(m_nLeft, m_nTop, m_nWidth, m_nHeight, this, 0, 0, SRCCOPY);
}
qrlvls 2003-10-27
  • 打赏
  • 举报
回复
首选通过 GetDC(NULL) 获取屏幕DC句柄
然后用 CDC::FromHandle 获取一个 CDC 指针
然后通过 CDC::AlphaBlend 函数绘制

如果要画一个绿色透镜可以通过内存位置的方式,从 CDC 派生一个位图 DC 类 CMemDC
在 CMemDC 中 用 CDC::FillSolidRect 函数将内存位图填充为绿色
然后用 CMemDC::AlphaBlend 函数绘制 50% 的透明位图即可
tipbridge 2003-10-27
  • 打赏
  • 举报
回复
AlphaBlend函数不错,

但如何画一个 带50%的绿色透镜呢?
tipbridge 2003-10-27
  • 打赏
  • 举报
回复
qrlvls(忍者神牛) :

能给个例子吗?
ukyoking 2003-10-23
  • 打赏
  • 举报
回复
用AlphaBlend函数
roger_ding 2003-10-23
  • 打赏
  • 举报
回复
用mmx优化的效果比较好,网上有很多类似的代码,建议你到游戏的网站上去找找
tipbridge 2003-10-23
  • 打赏
  • 举报
回复
我要的是客户区域的某部分半透明化,而不是窗口半透明化呀
flyccloud 2003-10-23
  • 打赏
  • 举报
回复
用gdi+比较简单,很容易.要不用线程处理.
roger_ding 2003-10-23
  • 打赏
  • 举报
回复
其实你说的方法可行,只是你的程序可能没有优化,我也是这样实现的,在1024×768下显示很快,没有什么延迟!
gambolgs 2003-10-23
  • 打赏
  • 举报
回复
谢谢!
那么补充完整就是:
typedef BOOL (WINAPI * MYFUN)(HWND, COLOREF,BYTE, DWORD);
HINSTANCE hInst = LoadLibrary("User32.dll");
MYFUN fun = NULL;
fun = GetProcAddress(hInst, "SetLayeredWindowAttributes");
(*fun)(this->GetSafeHwnd(), 0, 128, 2);
FreeLibrary(hInst);

shao 2003-10-22
  • 打赏
  • 举报
回复
typedef BOOL (WINAPI * MYFUN)(
HWND hwnd, // handle to the layered window
COLORREF crKey, // specifies the color key
BYTE bAlpha, // value for the blend function
DWORD dwFlags // action
);
GetProcAddress(hInst, "SetLayeredWindowAttributes");
gambolgs 2003-10-22
  • 打赏
  • 举报
回复
刚才丛书店背了那段程序,趁没忘光把重要的部分默写出来:

typedef BOOL (WINAPI * MYFUN)(HWND, COLOREF,???, DWORD);
^^^记性太差了,这个参数类型反正是代表透明度的

HINSTANCE hInst = LoadLibrary("User32.dll");

MYFUN fun = NULL;
fun = ()GetProc(hInst, "SetLayeredWindowAttributes");
^^^^^^^^这个函数名也忘了,反正就是从库里面提取出一个函数指针.
"SetLayeredWindowAttributes" 可能是"SetLayerWindowAttributes"

(*fun)(this->GetSafeHwnd(), 0, 128, 2);

FreeLibrary(hInst);
tipbridge 2003-10-21
  • 打赏
  • 举报
回复
网上没有这方面的例子吗?

俺在小城市,买书很困难。
gambolgs 2003-10-20
  • 打赏
  • 举报
回复
蓝色的,带光盘,定价35元。
gambolgs 2003-10-20
  • 打赏
  • 举报
回复
win2000以上有标准库的,在人民邮电出版社的Visual C++ 编程300问上有,书名记不清了,但是名字里肯定带了“300问”这个词。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧