c++ - 对话框背景和单选按钮透明度

标签 c++ c visual-studio-2008 winapi visual-c++

大家好, 我正在 Visual C++ 2008 Professional Edition 中制作一个应用程序,它使用对话框的背景图像。问题是我无法使单选按钮变得透明,以便图像位于背景中并且只有单选按钮的标题可见。 enter image description here

请检查图像。单选按钮应该是透明的,并且只有控件的文本应该是可见的。我已经检查过以下链接: Dialog box Background image

我正在使用以下代码:

    #include <Windows.h>
#include <CommCtrl.h>
#include "resource.h"

#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")

LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK DialogFunc(HWND, UINT, WPARAM, LPARAM);

int controlsLoaded=0;
char szWinName[]="Test";
HWND hDlg=NULL;
HINSTANCE hInst;

int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst,
                   LPSTR lpszArgs, int nWinMode)
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wndclass;

    wndclass.cbSize=sizeof(WNDCLASSEX);

    wndclass.hInstance=hThisInst;
    wndclass.lpszClassName=szWinName;
    wndclass.lpfnWndProc=WindowFunc;
    wndclass.style=0;

    wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    wndclass.hIconSm=NULL;
    wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);

    wndclass.lpszMenuName=NULL;
    wndclass.cbClsExtra=0;
    wndclass.cbWndExtra=0;

    wndclass.hbrBackground=(HBRUSH) GetStockObject(LTGRAY_BRUSH);

    if(!RegisterClassEx(&wndclass)) return 0;

    /*Initialize the common controls for WinXP look and feel*/
    InitCommonControls();

    hInst=hThisInst;

    hwnd=CreateWindow(
        szWinName,
        "Auto Timer (Work in progress)",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        NULL,
        NULL,
        hThisInst,
        NULL
        );


    while(GetMessage(&msg, NULL, 0, 0)>0)
    { if (!hDlg||!IsDialogMessage(hDlg,&msg))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    }
    return msg.wParam;

}

LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message, WPARAM wparam, 
                            LPARAM lparam)
{ 
    switch(message){
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        case WM_CREATE:
            hDlg=CreateDialog(hInst,MAKEINTRESOURCE(IDD_FORMVIEW),
                hwnd,(DLGPROC)DialogFunc);
            break;
        default:
            return DefWindowProc(hwnd,message,wparam,lparam);
    }
    return 0;
}
BOOL CALLBACK DialogFunc(HWND hwnd, UINT message, 
                         WPARAM wparam, LPARAM lparam)
{ 
  switch(message)
    { 
    case WM_CLOSE:
        DestroyWindow(hwnd);
        hDlg=NULL;
        PostQuitMessage(0);
        return TRUE;
    }
    return FALSE;
}

以下是我的资源文件-:

    // Microsoft Visual C++ generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// English (U.S.) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32

#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE 
BEGIN
    "resource.h\0"
END

2 TEXTINCLUDE 
BEGIN
    "#include ""afxres.h""\r\n"
    "\0"
END

3 TEXTINCLUDE 
BEGIN
    "\r\n"
    "\0"
END

#endif    // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO 
BEGIN
    IDD_FORMVIEW, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 251
        TOPMARGIN, 7
        BOTTOMMARGIN, 83
    END
END
#endif    // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

IDD_FORMVIEW DIALOGEX 0, 0, 259, 91
STYLE DS_SETFONT | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_OVERLAPPEDWINDOW | WS_EX_APPWINDOW
CAPTION "Test"
FONT 8, "MS Shell Dlg", 400, 0, 0x0
BEGIN
    CONTROL         "Radio1",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,103,48,94,20,WS_EX_TRANSPARENT
    CONTROL         102,IDC_STATIC,"Static",SS_BITMAP,119,44,33,31,WS_EX_TRANSPARENT
END


/////////////////////////////////////////////////////////////////////////////
//
// Bitmap
//

IDB_BITMAP1             BITMAP                  "1.bmp"
#endif    // English (U.S.) resources
/////////////////////////////////////////////////////////////////////////////



#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//


/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED

我尝试使用 WM_CTLCOLORSTATIC 消息将画笔返回到位图图像。但这不起作用。有什么办法可以发送手动绘制控件的消息吗?因为我认为如果先绘制图片然后再绘制单选按钮就可以避免这个问题。例如,每次绘制静态控件时都会发送 WM_CTLCOLORSTATIC 消息,这与绘制单选按钮时发送的消息相同,因为单选按钮不是静态控件。请不要给我 msdn 链接,我使用的是纯 Win32 而不是 MFC。到目前为止,我需要帮助,无论我尝试过什么都没有帮助,而且我听说 Win32 API 的功能没有限制。哦,我也在 dreamincode.net 上发布了这个主题 Check Here

最佳答案

添加到您的 DialogFunc:

case WM_CTLCOLORBTN:
//.....
int nCtrlId = GetDlgCtrlID((HWND)lParam);   
if(nCtrlId == RadiobuttonID)
{
   SetBkMode((HDC)wParam), TRANSPARENT);
   return (HBRUSH)GetStockObject(HOLLOW_BRUSH);
}

关于c++ - 对话框背景和单选按钮透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10464616/

相关文章:

c - C语言中有没有可以转换十进制数底数的函数?

c - 从 POST(CGI 和 C)中取消编码数据

c# - 在 C# - C++/CLI - C++ Windows 窗体应用程序退出之前跟踪 - 并正确结束 - native 和托管线程

c++ - Qt moveToThread 插槽未调用

c - 如何在 C 的宏中多次调用一个函数?

c++ - 给定基指针访问派生属性和方法的更简单方法

c++ - 如何使用VS2008 Pro自带的单元测试工具测试C++项目?

visual-studio-2008 - 分类 MsTest 案例

c++ - 如何将 VARIANT 转换为整数

c++ - 实现定义的文件流同步——为什么?