Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Owner draw кнопка, меняющая цвет фона при клике, owner draw button 
:(
    Опции темы
Aoizora
Дата 18.11.2016, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 18.11.2016

Репутация: нет
Всего: нет



Помогите разобраться с написанием owner draw кнопок. Я хочу создать батон, фон которого меняется при клике на него. Однако в моем коде это работает так, что фон меняется только под надписью на кнопке, а остальная часть кнопки не меняет цвет. У меня даже не получается заполнить прямоугольник в девайс контексте несмотря на то, что менять цвет текста и фона под текстом я могу. Как это сделать?

Код

void RegisterWndClass(WNDPROC Proc, LPCTSTR szName, UINT brBackground)
{
    WNDCLASSEX wc;

    wc.cbSize = sizeof(wc);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = Proc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = GetModuleHandle(NULL);
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = CreateSolidBrush(RGB(0x14, 0x14, 0x14));;
    wc.lpszMenuName = NULL;
    wc.lpszClassName = szName;
    wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

    if (!RegisterClassEx(&wc))
    {
        MessageBox(NULL, TEXT("Cannot register class"), TEXT("Error"), MB_OK);
    }
}

void DrawButton(DRAWITEMSTRUCT *dis, HWND hwnd) {
    RECT rc;
    GetClientRect(hwnd, &rc);

    if (dis->itemState & ODS_SELECTED)
    {
        SetBkColor(dis->hDC, RGB(0x00, 0x8C, 0xBA));
        //FillRect(dis->hDC, &rc, RGB(0x00, 0x9C, 0xCA));
    }
    else
    {
        SetBkColor(dis->hDC, RGB(0x00, 0xAC, 0xDA));
        //FillRect(dis->hDC, &rc, RGB(0x00, 0x8C, 0xBA));
    }

    //SetBkMode(dis->hDC, TRANSPARENT);
    FillRect(dis->hDC, &rc, RGB(0x00, 0x00, 0x00));

    char buf[255];
    GetWindowText(hwnd, buf, 255);
    DrawText(dis->hDC, buf, lstrlen(buf), &rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}


LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HDC hDC;
    PAINTSTRUCT ps;
    RECT rect;

    switch (uMsg)
    {
    case WM_CREATE:
        CreateWindow(TEXT("EDIT"),
            NULL,
            WS_VISIBLE | WS_CHILD | ES_LEFT | ES_AUTOHSCROLL,
            10, 280, 350, 20,
            hWnd,
            (HMENU)ID_KEY_FIELD,
            NULL,
            NULL);
        CreateWindow(TEXT("BUTTON"),
            TEXT("Unlock"),
            WS_VISIBLE | WS_CHILD | BS_OWNERDRAW,
            370, 280, 150, 20,
            hWnd,
            (HMENU)ID_KEY_ENTER,
            GetModuleHandle(NULL),
            NULL);
        break;
    case WM_PAINT:
        hDC = BeginPaint(hWnd, &ps);
        GetClientRect(hWnd, &rect);
        EndPaint(hWnd, &ps);
        break;
    case WM_CTLCOLOREDIT:
    {
        HDC hdc = (HDC)wParam;
        HWND hwnd = (HWND)lParam;
        if (GetDlgCtrlID(hwnd) == ID_KEY_FIELD)
        {
            SetTextColor(hdc, RGB(0x51, 0x51, 0x51));
            SetBkColor(hdc, RGB(0x29, 0x29, 0x29));
            return (LRESULT)CreateSolidBrush(RGB(0x29, 0x29, 0x29));
        }
        break;
    }
    case WM_DRAWITEM:
    {
        DRAWITEMSTRUCT *dis = (DRAWITEMSTRUCT*)lParam;
        switch (dis->CtlID)
        {
        case ID_KEY_ENTER:
            DrawButton(dis, GetDlgItem(hWnd, ID_KEY_ENTER));
            break;
        }
    }
    case WM_SIZE:
        break;
    case WM_CLOSE:
        DestroyWindow(hWnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    return 0;
}

void ShowMainWindow(void)
{
    HWND hMainWnd;
    MSG msg;

    RegisterWndClass(WndProc, TEXT("Info"), COLOR_WINDOW);
    hMainWnd = CreateWindow(TEXT("Info"), TEXT("Info"),
        WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
        CW_USEDEFAULT, 0, 550, 350, (HWND)NULL, (HMENU)NULL,
        (HINSTANCE)GetModuleHandle(NULL), NULL);

    if (!hMainWnd)
    {
        MessageBox(NULL, TEXT("Can\'t create main window."), TEXT("Error"), MB_OK);
        return GetLastError();
    }

    ShowWindow(hMainWnd, SW_SHOW);

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

PM MAIL   Вверх
feodorv
Дата 19.11.2016, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Гм. Код особо не смотрел, но зачем Вы перехватываете WM_PAINT и WM_SIZE главного окна? Да и структура DRAWITEMSTRUCT содержит поле hwndItem, зачем делать GetDlgItem(hWnd, ID_KEY_ENTER), тем более если Ваше окно - не диалог?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1128 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.