我对这个感到困惑.我使用论坛推荐的程序将32位PNG转换为带alpha通道的32位位图.我将这些添加到资源编辑器并通过工具箱将它们放到Dialog上.我已经阅读了(我认为是广泛的)关于位图透明度和Visual Studio中的限制.
让我感到困惑的是,我通过Visual Studio资源编辑器将图片控件添加到我的对话框中.例如,我有两个红球,一个是24位位图,另一个是32位位图.在visual studio的测试模式下,当使用资源编辑器打开.rc时,透明度看起来很好.

但是,当我以编程方式调用DialogBox时,我没有透明度.
DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOG1),
NULL, DialogProc);
Run Code Online (Sandbox Code Playgroud)
当我单击Visual Studio中的测试按钮时,它必须调用例程DialogBox或类似的以显示位图.当我将位图放在资源编辑器中的对话框时,它显示透明度.微软做了什么,我没做什么?
我是故意在没有MFC的情况下开发的.这是问题,只有在MFC中才能使用Dialogbox加载透明度(我意识到它缩减为CreateWindowEX).我意识到也可以使用各种bitblt方法.那是Visual Studio在幕后做的吗?还审查了WM_CTLCOLORSTATIC等材料.您有什么想法?是否有一些简单的方法来调用DialogBox并在对话框上获得透明的BMP?或者我们都被迫使用MFC?或者用户必须编写例程来擦除背景/油漆等.
对我而言,如果没有透明图像,对话框很容易,这似乎有点奇怪.需要非方形图像?这在某种程度上是一个问题.现在,软件工程师必须向Dialog Callback或程序添加大量代码.对我来说似乎更多的错误.
谢谢您,对于您的评论.
#include <windows.h>
#include <winuser.h>
#include "resource.h"
INT_PTR CALLBACK DialogProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDOK:
EndDialog(hwnd, LOWORD(wParam));
break;
case IDCANCEL:
EndDialog(hwnd, LOWORD(wParam));
return TRUE;
}
case WM_PAINT:
break;
case WM_DESTROY:
EndDialog(hwnd, LOWORD(wParam));
break;
}
return FALSE;
} …Run Code Online (Sandbox Code Playgroud)