2012-05-05 34 views
0

こんにちは皆、 私はダイアログボックスの背景イメージを使用するVisual C++ 2008 Professional Editionでアプリケーションを作成しています。問題は、ラジオボタンを透明にすることができないため、画像が背景にあり、ラジオボタンのキャプションだけが表示されることです。 enter image description hereダイアログの背景とラジオボタンのTransperancy

画像を確認してください。ラジオボタンは透明で、コントロールのテキストのみが表示される必要があります。私は以下のコード - を使用しています 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リンクを与えないでください。私はMFCではなく純粋なWin32を使用しています。 Win32 APIが何を行うことができるのかについての制限はないと聞いてきました。ああ、私はまたdreamincode.netにCheck Here

+0

をラジオボタンコントロールは、すでにBS_BITMAPとBS_ICONスタイルフラグでこれをサポートしています。あなたのように透明性の効果を達成しようとすることは不可能ではありませんが、通常は失望につながります。 –

答えて

0

をこのトピックを掲載しているあなたのDialogFuncに入れる:

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

ありがとうございます。私はそれを試してみます。 – Sreyan

+0

ところで、前のコードにWM_CTLCOLORSTATICの同様のコードを追加しました。ラジオボタンとグループボックスの両方を変更したようだ。なぜ、このメソッドはラジオボタンに対してのみ別々に動作しますか? – Sreyan

+0

ドキュメント:WM_CTLCOLORSTATIC 送信者:デフォルトのダイアログ/ウィンドウの背景色を使用して表示されるテキストを表示する任意のコントロール。これには、チェックボックス、ラジオボタン、グループボックス、静的テキスト、読み取り専用または無効な編集コントロール、無効なコンボボックス(すべてのスタイル)が含まれます。 変更内容は、コントロールに描画されるテキストに影響します。変更は、ボタンまたはグループボックスのアウトラインのチェックマークには影響しません。 – Flot2011

関連する問題