小编Jav*_*dro的帖子

如何绘制32位alpha通道位图?

我需要创建一个自定义控件来显示带alpha通道的bmp图像.背景可以用不同的颜色绘制,图像有阴影,所以我需要真正"绘制"alpha通道.

有谁知道怎么做?

我还希望尽可能使用Alpha通道信息创建一个遮罩,以了解鼠标是单击图像还是透明区域.

任何形式的帮助将不胜感激!

谢谢.

编辑(JDePedro):正如你们中的一些人所说,我一直在尝试使用alpha混合来用alpha通道绘制位图.这只是我实现的测试,我从资源加载32位位图,我尝试使用AlphaBlend函数绘制它:

void CAlphaDlg::OnPaint()
{
    CClientDC dc(this);
    CDC  dcMem;
    dcMem.CreateCompatibleDC(&dc);

    CBitmap bitmap;
    bitmap.LoadBitmap(IDB_BITMAP);

    BITMAP BitMap;
    bitmap.GetBitmap(&BitMap);
    int nWidth = BitMap.bmWidth;
    int nHeight = BitMap.bmHeight;
    CBitmap *pOldBitmap = dcMem.SelectObject(&bitmap);

    BLENDFUNCTION m_bf;
    m_bf.BlendOp = AC_SRC_OVER;
    m_bf.BlendFlags = 0;
    m_bf.SourceConstantAlpha = 255;
    m_bf.AlphaFormat = AC_SRC_ALPHA;
    AlphaBlend(dc.GetSafeHdc(), 100, 100, nWidth, nHeight, dcMem.GetSafeHdc(), 0, 0,nWidth, nHeight,m_bf); 

    dcMem.SelectObject(pOldBitmap);

    CDialog::OnPaint();
}
Run Code Online (Sandbox Code Playgroud)

这只是一个测试,所以我将代码放在对话框的OnPaint中(我也尝试了CDC对象的AlphaBlend函数).

非透明区域正在正确绘制,但我得到白色位图应该是透明的.

任何帮助???

这是截图..不容易看到,但蓝色圆圈周围有一个白色矩形: 替代文字http://img385.imageshack.us/img385/7965/alphamh8.png

好.我知道了!我必须预先乘以每个像素的alpha值.有人可以建议这样做的优化方法吗?

mfc alphablending bmp

9
推荐指数
2
解决办法
2万
查看次数

在运行时将无模式对话框转换为模态

我有一个对话框(CDialog派生类),可以以两种不同的方式使用(编辑模式和编程模式).

打开对话框以在编程模式下使用时,它是一个无模式对话框,用于修改主视图(工具栏的类型).当它在编辑模式下打开时,用户可以更改对话框本身的配置,在这种情况下,它是一个模态对话框.

现在它们是两个不同的对话框,几乎没有差异,我想只需要对话框,让用户只需按对话框中的按钮即可在编程模式和编辑模式之间切换.

所以我需要在运行时在模态对话框中转换无模式对话框,反之亦然.有办法实现吗?

谢谢.

mfc modal-dialog cdialog

9
推荐指数
1
解决办法
7784
查看次数

知道用户是否具有VBScript管理权限的最佳方法

我需要检查执行脚本的用户在计算机上是否具有管理特权。

我指定了执行脚本的用户,因为该脚本可能已由与登录用户不同的用户执行,而类似于“ Runas”。

@哈维尔:两种解决方案都可以在装有英文版Windows的PC上运行,但如果安装的语言不同则不能。这是因为Administrators组不存在,所以名称有所不同,例如西班牙语。我需要解决方案才能在所有配置中工作。

vbscript privileges

5
推荐指数
1
解决办法
1万
查看次数

创建自定义透明控件

我正在尝试创建一个自定义控件,显示每像素alphablend的位图(正如你们中的一些人已经知道其他问题).

现在我在资源编辑器中使用自定义控件,并将其附加到从CWnd派生的类.当我注册我的自定义类时,我将WNDCLASS structe的hbrBackground设置为NULL_BRUSH以获得控件的透明度.

在控件的OnPaint中,我使用AlphaBlend绘制每像素alpha混合位图.

这很有效,但我有两个问题:

  • 我想在鼠标悬停在控件上时更改显示的位图.由于控件是透明的,因此不会擦除一个位图与另一个位图不重叠的区域.如何在图像更改时删除背景?

  • 第二个问题与两个重叠控制有关.我的控件被绘制在具有渐变的其他控件上(实际上是在其他控件内).问题是,如果我之前将控件放在z顺序中,则其他控件与我的控件重叠,并且不会显示我的控件.如果我之前将其他控件放在z顺序中,则无法在我的控件中获取鼠标消息.

也许我做错了什么,或者我错误地想要实现我的控制.任何形式的帮助将不胜感激.

谢谢,

哈维尔

controls mfc transparency alphablending z-order

5
推荐指数
1
解决办法
1424
查看次数

如何知道代码是在ui线程还是工作线程上运行(MFC Visual C++)

我有一个从应用程序中的不同线程调用的函数.我需要知道执行代码的线程是主线程(ui线程)还是工作线程.

有什么建议吗?

谢谢.

user-interface mfc multithreading visual-c++

5
推荐指数
2
解决办法
3447
查看次数

带有 CMake 的 Visual Studio 2017 的文件夹结构

我正在使用 C++ 使用 Qt 在一个新项目中工作,该项目使用 CMake 生成解决方案。

该项目相当大,在 Visual Studio 2017 和 QtCreator 中都运行良好。大多数人使用 Ninja 生成构建解决方案并将构建导入 QtCreator。但我更喜欢使用 VS IDE。

问题在于,使用 QtCreator 时,解决方案资源管理器保持文件夹结构,但在 VS 中,所有项目(库和 dll)都从解决方案(根)挂断,因此我丢失了一些有价值的信息。

我是 CMake 的新手,我想知道是否有一种方法可以在不影响 QtCreator 解决方案的情况下生成与源代码具有相同文件夹结构的 VS 解决方案。

directory-structure cmake qt-creator visual-studio

5
推荐指数
1
解决办法
2210
查看次数

从vbscript启用/禁用windows-update

我需要从我的安装中禁用windows-update服务.我已经使用vbscript做了一些事情,所以我想在vbscript中做.

我对vbscript(或任何其他脚本语言)的了解非常有限,所以有人可以帮我解决这个问题吗?我真的很感激!

谢谢.

vbscript windows-services

3
推荐指数
1
解决办法
3万
查看次数