2013-12-11 4 views
-1

Я пытаюсь изменить цвет фона диалогового окна (win 7, vs2010, C++).изменить цвет фона диалогового окна win32api

Я попытался поймать WM_CTLCOLOR, WM_ERASEBKGND и сменил цвет. Мне удалось поймать только сообщение WM_ERASEBKGND, но таким образом я управляю в режиме отладки, чтобы увидеть, что я изменил цвет фона в окне, но когда диалоговое окно заканчивается для загрузки, цвет переполняется серым цветом defualt DialogBox.

Я создаю DialogBox с помощью функции CreateDialogParam.

case WM_ERASEBKGND: 
{ 
    HBRUSH brush; 
    RECT rect; 
    brush = CreateSolidBrush(RGB(255,0,0)); 
    SelectObject((HDC)wParam,brush); 
    GetClientRect(m_hDlg,&rect)//m_hDlg is HWND type 
    Rectangle((HDC)wParam,rect.left,rect.top,rect.right,rect.bottom); 
    break; 
} 

Я пытался использовать функцию:

SetBkMode((HDC)wParam,TRANSPARENTE); 

, но это не помогло.

Что мне делать?

+0

Пожалуйста, показать полную программу –

+0

ее слишком большой, чтобы добавить, я добавил только соответствующую часть. – David

+0

Откуда вы знаете, что добавили соответствующую часть? Пожалуйста, покажите полную программу. Сократите его до размера. Это должно быть возможно сделать примерно в 50 строках кода. –

ответ

1

Когда вы отвечаете на WM_ERASEBKGND вы должны return TRUE, в противном случае процедура диалоговый по умолчанию будет установлена ​​цветом диалога цвета системы по умолчанию.

Кроме того, ваш второй параметр в вашем телефоне SelectObject неверен, он должен быть TRANSPARENT, а не TRANSPARENTE.

В качестве члена arx сказал, что вам нужно обработать сообщение WM_CTLCOLORDLG, чтобы достичь того, чего вы хотите.

Вот небольшой демо-приложение, которое вы можете скопировать и вставить в Visual Studio:

В вашем resource.h вставьте:

//{{NO_DEPENDENCIES}} 
// Microsoft Visual C++ generated include file. 
// Used by Dlg bkgnd.rc 
// 
#define IDD_DIALOG1      101 
#define IDC_BUTTON1      1001 

// Next default values for new objects 
// 
#ifdef APSTUDIO_INVOKED 
#ifndef APSTUDIO_READONLY_SYMBOLS 
#define _APS_NEXT_RESOURCE_VALUE  102 
#define _APS_NEXT_COMMAND_VALUE   40001 
#define _APS_NEXT_CONTROL_VALUE   1002 
#define _APS_NEXT_SYMED_VALUE   101 
#endif 
#endif 

Не забудьте пустую строку выше!

В файле ресурсов (.rc расширения) вставьте:

// 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 


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

IDD_DIALOG1 DIALOGEX 0, 0, 200, 124 
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU 
CAPTION "Dialog" 
FONT 8, "MS Shell Dlg", 400, 0, 0x1 
BEGIN 
    DEFPUSHBUTTON "OK",IDOK,52,71,50,14 
    PUSHBUTTON  "Cancel",IDCANCEL,111,71,50,14 
    PUSHBUTTON  "",IDC_BUTTON1,47,23,73,16 
END 


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

#ifdef APSTUDIO_INVOKED 
GUIDELINES DESIGNINFO 
BEGIN 
    IDD_DIALOG1, DIALOG 
    BEGIN 
     LEFTMARGIN, 7 
     RIGHTMARGIN, 189 
     TOPMARGIN, 7 
     BOTTOMMARGIN, 117 
    END 
END 
#endif // APSTUDIO_INVOKED 

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



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


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

И, наконец, в main.cpp:

#include "resource.h" 
#include <windows.h> 

// variable for storing the instance 

static HINSTANCE hInst; 

// handle for dialog box 

static HWND Dlg; 

// dialog procedure 

INT_PTR CALLBACK DlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) 
{ 
    static HBRUSH testBrush; 

    switch(Message) 
    { 
    case WM_INITDIALOG: 

      //set text of our static control with the data sent to dialog 
      SetWindowText(GetDlgItem(hwnd, IDC_BUTTON1), (LPCWSTR)lParam); 

      //initialize the brush 
      testBrush = CreateSolidBrush(RGB(255, 0, 0)); 

      return TRUE; 

    case WM_CTLCOLORDLG: 
      return (INT_PTR)(testBrush); 

    case WM_CLOSE: 
      // if we do not use stock brush we must destroy it 
      DeleteObject(testBrush); 
      DestroyWindow(hwnd); 
      Dlg = NULL; 
      return TRUE; 
    case WM_COMMAND: 
      switch(LOWORD(wParam)) 
      { 
       case IDOK: 
       case IDCANCEL: 

        // if we do not use stock brush we must destroy it 
        DeleteObject(testBrush); 
        DestroyWindow(hwnd); 
        Dlg = NULL; 
        break; 
      } 
      break; 
    default: 
      return FALSE; 
    } 
    return TRUE; 
} 

// WinMain's procedure 

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(msg) 
    { 
    case WM_CREATE: 
      { 
       Dlg = NULL; 

       // create button we can click on 
       HWND btn = CreateWindowEx(0, L"Button", L"Click me!", 
              WS_VISIBLE | WS_CHILD | SS_NOTIFY, 
              65, 10, 70, 50, hwnd, 
              (HMENU)4000, hInst, 0); 
      } 
      return (LRESULT)0; 

    case WM_COMMAND: 

      switch(LOWORD(wParam)) 
      { 
       case 4000: // activate dialog box 
        { 
         // we will send anything as the parameter to the dialog 
         // this is just an example 
         Dlg = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_DIALOG1), 
               hwnd, DlgProc, (LPARAM)L"Test text"); 
         //show it 
         ShowWindow(Dlg, SW_SHOW); 
        } 
        break; 

       default: // pass it to the default window procedure 
        return DefWindowProc(hwnd, msg, wParam, lParam); 
      } 
      break; 

    case WM_PAINT: 
     { 
       // we do not paint anything 
       PAINTSTRUCT ps; 
       BeginPaint(hwnd, &ps); 
       EndPaint(hwnd, &ps); 
     } 
     return (LRESULT)0; 

    case WM_CLOSE: 

     DestroyWindow(hwnd); 

     return (LRESULT)0; 

    case WM_DESTROY: 

     PostQuitMessage(0); 

     return (LRESULT)0; 

    default: 
     return DefWindowProc(hwnd, msg, wParam, lParam); 
    } 
    return 0; 
} 

// WinMain 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, 
       int nCmdShow) 
{ 
    // store hInstance in global variable for later use 

    hInst = hInstance; 

    WNDCLASSEX wc; 
    HWND hwnd; 
    MSG Msg; 

    // register main window class 

    wc.cbSize = sizeof(WNDCLASSEX); 
    wc.style = 0; 
    wc.lpfnWndProc = WndProc; 
    wc.cbClsExtra = 0; 
    wc.cbWndExtra = 0; 
    wc.hInstance = hInst; 
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); 
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); 
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 
    wc.lpszMenuName = NULL; 
    wc.lpszClassName = L"Main_Window"; 
    wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); 

    if(!RegisterClassEx(&wc)) 
    { 
     MessageBox(NULL, L"Window Registration Failed!", L"Error!", 
        MB_ICONEXCLAMATION | MB_OK); 

     return 0; 
    } 

    // create main window 

    hwnd = CreateWindowEx(0, 
          L"Main_Window", 
          L"test app", 
          WS_OVERLAPPEDWINDOW, 
          CW_USEDEFAULT, 
          CW_USEDEFAULT, 
          200, 100, NULL, NULL, hInstance, 0); 

    if(hwnd == NULL) 
    { 
     MessageBox(NULL, L"Window creation failed!", L"Error!", 
        MB_ICONEXCLAMATION | MB_OK); 

     return 0; 
    } 

    ShowWindow(hwnd, nCmdShow); 
    UpdateWindow(hwnd); 

    while(GetMessage(&Msg, NULL, 0, 0) > 0) 
    { 
     // check if message is for dialog or main window 
     if(!IsDialogMessage(Dlg, &Msg)) 
     { 
      TranslateMessage(&Msg); 
      DispatchMessage(&Msg); 
     } 
    } 

    return Msg.wParam; 
} 

Особенно обратите внимание на цикл обработки сообщений, а так я хранилась HWND диалога.

Также обратите внимание, что создаваемая вами кисть - это кисть, которую вы должны уничтожить, когда вам больше не нужно (обычно в ответ на WM_CLOSE).

Если есть что-то еще, что я могу сделать, чтобы помочь, спросите меня, и я постараюсь вам помочь.

С уважением.

6

Вам необходимо обработать WM_CTLCOLORDLG. Вы должны вернуть кисть. Например, чтобы сделать фон белым:

case WM_CTLCOLORDLG: 
    return (INT_PTR)GetStockObject(WHITE_BRUSH); 
+0

Как я уже упоминал в вопросе, я не смог поймать это сообщение в dlgProc – David

+0

Вот почему нам нужен SSCCE. Перестаньте лениться и сделайте это. У вас был бы ответ, если бы вы сделали это. –

+0

Я не могу этого сделать, потому что, как я уже говорил, у меня есть код на рабочем компьютере, и я не могу подключить его к сети. Поэтому, если я хочу сделать sscce, мне нужно вручную написать свою программу и переписать ее здесь. И, как я уже сказал, слишком большой, чтобы его можно было скопировать. – David

Смежные вопросы