Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

WinApi zmiana koloru kontrolki typu Button

Ostatnio zmodyfikowano 2014-10-13 19:50
Autor Wiadomość
elradziu
Temat założony przez niniejszego użytkownika
WinApi zmiana koloru kontrolki typu Button
» 2014-10-11 01:59:58
Witam pół nocy siedzę i nie już nie wiem. Próbuję zmienić kolory przycisków w programie:

C/C++
HBRUSH g_hbrush = CreateSolidBrush( RGB( 255, 255, 0 ) );
HWND L_hPrzycisk1;

...


L_hPrzycisk1 = CreateWindowEx( 0, "BUTTON", "BIEG", WS_CHILD | WS_VISIBLE,
10 + 130, 25, 100, 30, hwnd,( HMENU ) ID_PRZYCISK4, hInstance, NULL );

...

case WM_CTLCOLORBTN:
return( LRESULT ) g_hbrush;
break;

Niestety zero rezultatów, program się kompiluje, nie wyrzuca błędów, ale kontrolki nie zmieniają swoich kolorów. Nawet jeżeli zmienię WM_CTLCOLORBTN NA WM_CTLCOLORSTATIC. efekt pozostaje bez zmian. zmienia się tylko lekko obramowanie napisu na kontrolkach groupbox, a to mnie nie interesuje, ja potrzebuję buttonów. Miał ktoś kiedyś taki problem? Uporał się z nim?[/code]
P-118226
Jacob99
» 2014-10-11 07:13:36
Zaglądanie do MSDN nie boli.
Prosto z przykładu kodu, z opisu WM_CTLCOLORBTN:
C/C++
LRESULT CALLBACK WinProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) {
   
    switch( msg ) {
    case WM_CTLCOLORSTATIC: {
            if(( HWND ) lParam == filterNameOff ) {
                static HBRUSH hBrushColor;
               
                if( !hBrushColor ) {
                    hBrushColor = CreateSolidBrush( RGB( 0xFF, 0xFF, 0xFF ) ); // White background is returned
                    SetBkColor(( HDC ) wParam, RGB( 0xFF, 0xFF, 0xFF ) ); // White background for text!! Ustawiamy tło.
                }
               
                // Background color that is used to repaint the control (doesn't affect text background)
                return( LRESULT ) hBrushColor;
            }
        }
P-118227
Monika90
» 2014-10-11 07:55:02
Nie da się tego zrobić.
P-118228
SocrateZ
» 2014-10-11 11:08:45
Nie da się tego zrobić.

WinAPI jest dosyć elastyczne. Odsyłam do stackoverflow i przycisku z gradientem:
http://stackoverflow.com​/questions/18745447​/how-can-i-change-the-background-color-of-a-button-winapi-c
P-118237
elradziu
Temat założony przez niniejszego użytkownika
» 2014-10-11 14:20:28
Jacob99 - Używałeś tego kodu? Czy tylko kopiuj/wklej z MSDN? Jak sprawdzisz i będzie Ci działać to porozmawiamy o tym czy boli. P.s. U mnie te rozwiązanie nie działa, dla tego szukam kogoś kto miał taki problem i go rozwiązał, a nie kogoś kto wszedł na MSDN i skopiował podane tam rozwiązanie.


SocrateZ - Ten przykład już widziałem, ale mnie interesuje zwykłe jednokolorowe rozwiązanie, nic więcej. Już kilka rozwiązań przejżałem ale wszystko kończy się tak samo, czyli brak jakiegokolwiek efektu:/
P-118248
SocrateZ
» 2014-10-11 15:11:37
SocrateZ - Ten przykład już widziałem, ale mnie interesuje zwykłe jednokolorowe rozwiązanie, nic więcej. Już kilka rozwiązań przejżałem ale wszystko kończy się tak samo, czyli brak jakiegokolwiek efektu:/

To znaczy tylko że jesteś leniem albo w ogóle nie ogarniasz WinAPI (choć ten przykład da się rady przerobić nawet bez jego znajomości).
Wystarczy tylko trochę pomyśleć - od myślenia głowa nie boli.

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

#define UNICODE

#include <Windows.h>
#include <Commctrl.h>

#define IDC_EXIT_BUTTON 101
#define IDC_PUSHLIKE_BUTTON 102

HBRUSH CreateColorBrush( COLORREF color, LPNMCUSTOMDRAW item )
{
    HBRUSH Brush = NULL;
    RECT temp;
    HDC hdcmem = CreateCompatibleDC( item->hdc );
    HBITMAP hbitmap = CreateCompatibleBitmap( item->hdc, item->rc.right - item->rc.left, item->rc.bottom - item->rc.top );
    SelectObject( hdcmem, hbitmap );
   
    int r = GetRValue( color ), g = GetGValue( color ), b = GetBValue( color );
    Brush = CreateSolidBrush( RGB( r, g, b ) );
    temp.left = 0;
    temp.top = 0;
    temp.right = item->rc.right - item->rc.left;
    temp.bottom = item->rc.bottom - item->rc.top;
    FillRect( hdcmem, & temp, Brush );
    DeleteObject( Brush );
   
    HBRUSH pattern = CreatePatternBrush( hbitmap );
   
    DeleteDC( hdcmem );
    DeleteObject( Brush );
    DeleteObject( hbitmap );
   
    return pattern;
}

LRESULT CALLBACK MainWindow( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    static HBRUSH defaultbrush = NULL;
    static HBRUSH hotbrush = NULL;
    static HBRUSH selectbrush = NULL;
    static HBRUSH push_uncheckedbrush = NULL;
    static HBRUSH push_checkedbrush = NULL;
    static HBRUSH push_hotbrush1 = NULL;
    static HBRUSH push_hotbrush2 = NULL;
    switch( msg )
    {
    case WM_CREATE:
        {
            HWND Exit_Button = CreateWindowEx( NULL, L"BUTTON", L"EXIT",
            WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
            50, 50, 100, 100, hwnd,( HMENU ) IDC_EXIT_BUTTON, NULL, NULL );
            if( Exit_Button == NULL )
            {
                MessageBox( NULL, L"Button Creation Failed!", L"Error!", MB_ICONEXCLAMATION );
                exit( EXIT_FAILURE );
            }
           
            HWND Pushlike_Button = CreateWindowEx( NULL, L"BUTTON", L"PUSH ME!",
            WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX | BS_PUSHLIKE,
            200, 50, 100, 100, hwnd,( HMENU ) IDC_PUSHLIKE_BUTTON, NULL, NULL );
            if( Pushlike_Button == NULL )
            {
                MessageBox( NULL, L"Button Creation Failed!", L"Error!", MB_ICONEXCLAMATION );
                exit( EXIT_FAILURE );
            }
        }
        break;
    case WM_COMMAND:
        {
            switch( LOWORD( wParam ) )
            {
            case IDC_EXIT_BUTTON:
                {
                    SendMessage( hwnd, WM_CLOSE, 0, 0 );
                }
                break;
            }
        }
        break;
    case WM_NOTIFY:
        {
            LPNMHDR some_item =( LPNMHDR ) lParam;
           
            if( some_item->idFrom == IDC_EXIT_BUTTON && some_item->code == NM_CUSTOMDRAW )
            {
                LPNMCUSTOMDRAW item =( LPNMCUSTOMDRAW ) some_item;
               
                if( item->uItemState & CDIS_SELECTED )
                {
                    //Select our color when the button is selected
                    if( selectbrush == NULL )
                         selectbrush = CreateColorBrush( RGB( 180, 0, 0 ), item );
                   
                    //Create pen for button border
                    HPEN pen = CreatePen( PS_INSIDEFRAME, 0, RGB( 0, 0, 0 ) );
                   
                    //Select our brush into hDC
                    HGDIOBJ old_pen = SelectObject( item->hdc, pen );
                    HGDIOBJ old_brush = SelectObject( item->hdc, selectbrush );
                   
                    //If you want rounded button, then use this, otherwise use FillRect().
                    RoundRect( item->hdc, item->rc.left, item->rc.top, item->rc.right, item->rc.bottom, 5, 5 );
                   
                    //Clean up
                    SelectObject( item->hdc, old_pen );
                    SelectObject( item->hdc, old_brush );
                    DeleteObject( pen );
                   
                    //Now, I don't want to do anything else myself (draw text) so I use this value for return:
                    return CDRF_DODEFAULT;
                    //Let's say I wanted to draw text and stuff, then I would have to do it before return with
                    //DrawText() or other function and return CDRF_SKIPDEFAULT
                }
                else
                {
                    if( item->uItemState & CDIS_HOT ) //Our mouse is over the button
                    {
                        //Select our color when the mouse hovers our button
                        if( hotbrush == NULL )
                             hotbrush = CreateColorBrush( RGB( 255, 230, 0 ), item );
                       
                        HPEN pen = CreatePen( PS_INSIDEFRAME, 0, RGB( 0, 0, 0 ) );
                       
                        HGDIOBJ old_pen = SelectObject( item->hdc, pen );
                        HGDIOBJ old_brush = SelectObject( item->hdc, hotbrush );
                       
                        RoundRect( item->hdc, item->rc.left, item->rc.top, item->rc.right, item->rc.bottom, 5, 5 );
                       
                        SelectObject( item->hdc, old_pen );
                        SelectObject( item->hdc, old_brush );
                        DeleteObject( pen );
                       
                        return CDRF_DODEFAULT;
                    }
                   
                    //Select our color when our button is doing nothing
                    if( defaultbrush == NULL )
                         defaultbrush = CreateColorBrush( RGB( 255, 180, 0 ), item );
                   
                    HPEN pen = CreatePen( PS_INSIDEFRAME, 0, RGB( 0, 0, 0 ) );
                   
                    HGDIOBJ old_pen = SelectObject( item->hdc, pen );
                    HGDIOBJ old_brush = SelectObject( item->hdc, defaultbrush );
                   
                    RoundRect( item->hdc, item->rc.left, item->rc.top, item->rc.right, item->rc.bottom, 5, 5 );
                   
                    SelectObject( item->hdc, old_pen );
                    SelectObject( item->hdc, old_brush );
                    DeleteObject( pen );
                   
                    return CDRF_DODEFAULT;
                }
            }
            else if( some_item->idFrom == IDC_PUSHLIKE_BUTTON && some_item->code == NM_CUSTOMDRAW )
            {
                LPNMCUSTOMDRAW item =( LPNMCUSTOMDRAW ) some_item;
               
                if( IsDlgButtonChecked( hwnd, some_item->idFrom ) )
                {
                    if( item->uItemState & CDIS_HOT )
                    {
                       
                        if( push_hotbrush1 == NULL )
                             push_hotbrush1 = CreateColorBrush( RGB( 0, 0, 245 ), item );
                       
                        HPEN pen = CreatePen( PS_INSIDEFRAME, 0, RGB( 0, 0, 0 ) );
                       
                        HGDIOBJ old_pen = SelectObject( item->hdc, pen );
                        HGDIOBJ old_brush = SelectObject( item->hdc, push_hotbrush1 );
                       
                        RoundRect( item->hdc, item->rc.left, item->rc.top, item->rc.right, item->rc.bottom, 10, 10 );
                       
                        SelectObject( item->hdc, old_pen );
                        SelectObject( item->hdc, old_brush );
                        DeleteObject( pen );
                       
                        return CDRF_DODEFAULT;
                    }
                   
                   
                    if( push_checkedbrush == NULL )
                         push_checkedbrush = CreateColorBrush( RGB( 0, 0, 180 ), item );
                   
                   
                    HPEN pen = CreatePen( PS_INSIDEFRAME, 0, RGB( 0, 0, 0 ) );
                   
                   
                    HGDIOBJ old_pen = SelectObject( item->hdc, pen );
                    HGDIOBJ old_brush = SelectObject( item->hdc, push_checkedbrush );
                   
                   
                    RoundRect( item->hdc, item->rc.left, item->rc.top, item->rc.right, item->rc.bottom, 10, 10 );
                   
                   
                    SelectObject( item->hdc, old_pen );
                    SelectObject( item->hdc, old_brush );
                    DeleteObject( pen );
                   
                   
                    return CDRF_DODEFAULT;
                }
                else
                {
                    if( item->uItemState & CDIS_HOT )
                    {
                        if( push_hotbrush2 == NULL )
                             push_hotbrush2 = CreateColorBrush( RGB( 255, 230, 0 ), item );
                       
                        HPEN pen = CreatePen( PS_INSIDEFRAME, 0, RGB( 0, 0, 0 ) );
                       
                        HGDIOBJ old_pen = SelectObject( item->hdc, pen );
                        HGDIOBJ old_brush = SelectObject( item->hdc, push_hotbrush2 );
                       
                        RoundRect( item->hdc, item->rc.left, item->rc.top, item->rc.right, item->rc.bottom, 10, 10 );
                       
                        SelectObject( item->hdc, old_pen );
                        SelectObject( item->hdc, old_brush );
                        DeleteObject( pen );
                       
                        return CDRF_DODEFAULT;
                    }
                   
                    if( push_uncheckedbrush == NULL )
                         push_uncheckedbrush = CreateColorBrush( RGB( 255, 180, 0 ), item );
                   
                    HPEN pen = CreatePen( PS_INSIDEFRAME, 0, RGB( 0, 0, 0 ) );
                   
                    HGDIOBJ old_pen = SelectObject( item->hdc, pen );
                    HGDIOBJ old_brush = SelectObject( item->hdc, defaultbrush );
                   
                    RoundRect( item->hdc, item->rc.left, item->rc.top, item->rc.right, item->rc.bottom, 10, 10 );
                   
                    SelectObject( item->hdc, old_pen );
                    SelectObject( item->hdc, old_brush );
                    DeleteObject( pen );
                   
                    return CDRF_DODEFAULT;
                }
            }
            return CDRF_DODEFAULT;
        }
        break;
    case WM_CTLCOLORBTN: //In order to make those edges invisble when we use RoundRect(),
        { //we make the color of our button's background match window's background
            return( LRESULT ) GetSysColorBrush( COLOR_WINDOW + 1 );
        }
        break;
    case WM_CLOSE:
        {
            DestroyWindow( hwnd );
            return 0;
        }
        break;
    case WM_DESTROY:
        {
            DeleteObject( defaultbrush );
            DeleteObject( selectbrush );
            DeleteObject( hotbrush );
            DeleteObject( push_checkedbrush );
            DeleteObject( push_hotbrush1 );
            DeleteObject( push_hotbrush2 );
            DeleteObject( push_uncheckedbrush );
            PostQuitMessage( 0 );
            return 0;
        }
        break;
        default:
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
    return 0;
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    WNDCLASSEX wc;
    HWND hwnd;
    MSG msg;
    const wchar_t ClassName[] = L"Main_Window";
   
    wc.cbSize = sizeof( WNDCLASSEX );
    wc.style = 0;
    wc.lpfnWndProc = MainWindow;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
    wc.hCursor = LoadCursor( NULL, IDC_ARROW );
    wc.hbrBackground = GetSysColorBrush( COLOR_WINDOW + 1 );
    wc.lpszMenuName = NULL;
    wc.lpszClassName = ClassName;
    wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
   
    if( !RegisterClassEx( & wc ) )
    {
        MessageBox( NULL, L"Window Registration Failed!", L"Error", MB_ICONEXCLAMATION | MB_OK );
        exit( EXIT_FAILURE );
    }
   
    hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, ClassName, L"Window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 368, 248, NULL, NULL, hInstance, NULL );
   
    if( hwnd == NULL )
    {
        MessageBox( NULL, L"Window Creation Failed!", L"Error!", MB_ICONEXCLAMATION | MB_OK );
        exit( EXIT_FAILURE );
    }
   
    ShowWindow( hwnd, nCmdShow );
    UpdateWindow( hwnd );
   
    while( GetMessage( & msg, NULL, 0, 0 ) > 0 )
    {
        TranslateMessage( & msg );
        DispatchMessage( & msg );
    }
   
    return msg.message;
}
P-118254
elradziu
Temat założony przez niniejszego użytkownika
» 2014-10-13 16:30:46
SocrateZ daj jakiś namiar do siebie
P-118378
SocrateZ
» 2014-10-13 19:50:03
Masz problem, pisz na forum - nie jestem skarbnicą wiedzy na wszystkie tematy.
P-118391
« 1 »
  Strona 1 z 1