有没有API可以直接使HDC变黑变暗

蒙飞鸿 2012-02-02 04:54:34
用GetDIBits,然后每个点计算,然后再SetDIBits来做的话,比较麻烦,有没有如题的API?
...全文
145 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
蒙飞鸿 2012-03-12
  • 打赏
  • 举报
回复
环境前提是不使用非VC6“内置”函数,用S(G)etDIBits实现了,不过11楼可能是个运行效率更好的办法。
三条猫 2012-02-07
  • 打赏
  • 举报
回复
楼主看看AlphaBlend这个函数,创建一个全黑的memdc,然后和原dc混合一下
三条猫 2012-02-07
  • 打赏
  • 举报
回复
用alpha混合一个黑的DC就行了吧?
蒙飞鸿 2012-02-07
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 sky_kid 的回复:]
做图,用几张png设透明度不一样的图贴几次试试。
[/Quote]
贴图很耗资源,会卡
SKy_kid 2012-02-06
  • 打赏
  • 举报
回复
做图,用几张png设透明度不一样的图贴几次试试。
蒙飞鸿 2012-02-06
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 lactoferrin 的回复:]
你可以用CreateDIBSection,这样就可以直接修改内容,不用GetDIBits,SetDIBits
[/Quote]
要是能贴用这个API实现的10楼的函数的代码就好了......
Lactoferrin 2012-02-06
  • 打赏
  • 举报
回复
你可以用CreateDIBSection,这样就可以直接修改内容,不用GetDIBits,SetDIBits
蒙飞鸿 2012-02-06
  • 打赏
  • 举报
回复
void MakeHDCDark(HDC& sHdc, FLOAT ratios)
{

unsigned char * pBmpBK = NULL;
HDC hDcCopy = CreateCompatibleDC(sHdc);
HBITMAP bCurBk = CreateCompatibleBitmap(sHdc, WINWIDTH, WINHEIGHT);
HBITMAP hBkOldBmp =(HBITMAP)SelectObject(hDcCopy,bCurBk);

BitBlt(hDcCopy,0,0,WINWIDTH,WINHEIGHT,sHdc,0,0,SRCCOPY);

BITMAP bmpBK;
GetObject(bCurBk,sizeof(BITMAP),&bmpBK);

BITMAPINFO bminfo1 = {0};
bminfo1.bmiHeader.biSize = sizeof(bminfo1.bmiHeader);
GetDIBits(hDcCopy,bCurBk,0,bmpBK.bmHeight,NULL,&bminfo1,DIB_RGB_COLORS);
pBmpBK = new unsigned char [bminfo1.bmiHeader.biSizeImage];
GetDIBits(hDcCopy,bCurBk,0,bmpBK.bmHeight,pBmpBK,&bminfo1,DIB_RGB_COLORS);

int size2 = bminfo1.bmiHeader.biSizeImage;
for (int i = 0; i < bminfo1.bmiHeader.biSizeImage; i ++)
{
pBmpBK[i] = pBmpBK[i] * ratios;
}

int l = SetDIBits(hDcCopy,bCurBk,0,bmpBK.bmHeight,pBmpBK,&bminfo1,DIB_RGB_COLORS);

BitBlt(sHdc,0,0,WINWIDTH,WINHEIGHT,hDcCopy,0,0,SRCCOPY);

SelectObject(hDcCopy,hBkOldBmp);
delete[] pBmpBK;
DeleteObject(bCurBk);
DeleteDC(hDcCopy);

}

/////////////////////////////////
刚刚封装了,不过感觉效率不太行,程序变得有点卡了
Lactoferrin 2012-02-06
  • 打赏
  • 举报
回复
你干脆自己做个函数封装GetDIBits和SetDIBits
蒙飞鸿 2012-02-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lactoferrin 的回复:]
弄个循环调用FillRect
[/Quote]
不行的,FillRect一用,就覆盖了,没有半透明渐变的效果.
Lactoferrin 2012-02-06
  • 打赏
  • 举报
回复
弄个循环调用FillRect
蒙飞鸿 2012-02-06
  • 打赏
  • 举报
回复
要变黑,是渐变啊,直接FillRect没有渐变的过程,貌似没有半透明画刷机制来通过FillRect实现
用户 昵称 2012-02-03
  • 打赏
  • 举报
回复
gdi里面没有对应的api,可以看看gdi+或者一些图像库里面有没有效率高的函数。
  • 打赏
  • 举报
回复
FillSolidRect
SuperLy 2012-02-02
  • 打赏
  • 举报
回复
当然,如果原先不是均一色,无法填充,那就只有搞个黑bmp,或者用黑Brush之类画上去...
SuperLy 2012-02-02
  • 打赏
  • 举报
回复
填充黑色就可以了。
BOOL FloodFill(
HDC hdc, // handle to DC
int nXStart, // starting x-coordinate
int nYStart, // starting y-coordinate
COLORREF crFill // fill color
);
smwhotjay 2012-02-02
  • 打赏
  • 举报
回复
搞个黑bmp, hdc selectobj . hdc就黑了.

19,468

社区成员

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

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