-Поиск по дневнику

Поиск сообщений в rss_forum_sources_ru

 -Подписка по e-mail

 

 -Постоянные читатели

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 29.07.2007
Записей:
Комментариев:
Написано: 80


Combobox

Суббота, 16 Января 2021 г. 17:18 + в цитатник
E.A.: Создаю самодельный комвобокс выбор цвета
    dwstylecombo = WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | CBS_OWNERDRAWVARIABLE;
    e::optionshwnd[5] = CreateWindowEx(WS_EX_CLIENTEDGE, WC_COMBOBOX, NULL, dwstylecombo, 188, 24*3+20, 100, 220, hdlg, (HMENU) 1005, hinstance, NULL);


Делаю свое рисование

    void OptionsComboboxDrawItem(LPARAM lparam)
    {
    int i, color[3];
    char str[256];
    RECT rc;
    COLORREF colorwhite, colorblack, colorblue, colorcurr;
    HBRUSH hbrush[2];
    LPDRAWITEMSTRUCT item;
    item = (LPDRAWITEMSTRUCT) lparam;
    colorwhite = RGB(255, 255, 255);
    colorblack = RGB( 0, 0, 0);
    colorblue = RGB(GetRValue(GetSysColor(COLOR_HIGHLIGHT)), GetGValue(GetSysColor(COLOR_HIGHLIGHT)), GetBValue(GetSysColor(COLOR_HIGHLIGHT)));
    colorcurr = RGB(255, 255, 255);
    hbrush[0] = CreateSolidBrush(colorwhite);
    hbrush[1] = CreateSolidBrush(colorblue);
    SetBkColor(item->hDC, colorwhite);
    FillRect(item->hDC, &item->rcItem, hbrush[0]);
    SetTextColor(item->hDC, colorblack);
    if (item->itemState & ODS_FOCUS)
    {
    SetBkColor(item->hDC, colorblue);
    FillRect(item->hDC, &item->rcItem, hbrush[1]);
    SetTextColor(item->hDC, colorwhite);
    }
    rc.bottom = item->rcItem.bottom - 2;
    rc.left = item->rcItem.left + 2;
    rc.right = item->rcItem.left + 2 + 15;
    rc.top = item->rcItem.top + 2;
    DataColor((item->itemID), color, str);
    colorcurr = RGB(color[0], color[1], color[2]);
    FillRect(item->hDC, &rc, CreateSolidBrush(colorcurr));
    FrameRect(item->hDC, &rc, CreateSolidBrush(colorblack));
    TextOut(item->hDC, item->rcItem.left+2+25, item->rcItem.top, str, strlen (str));
    if (item->itemState & ODS_FOCUS)
    {
    DrawFocusRect(item->hDC, &item->rcItem);
    }
    for (i=0; i<2; i++)
    {
    DeleteObject(hbrush[i]);
    }
    }
    void OptionsComboboxMeasureItem(LPARAM lparam)
    {
    PMEASUREITEMSTRUCT item;
    item = (PMEASUREITEMSTRUCT) lparam;
    item->itemHeight = 15;
    }


    LRESULT CALLBACK WndProcOptions(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
    {
    HWND hparent;
    hparent = GetParent(hwnd);
    switch (message)
    {
    //....
    case WM_DRAWITEM:
    switch (LOWORD(wparam))
    {
    case 1005:
    OptionsComboboxDrawItem(lparam);
    break;
    }
    return 0;
    case WM_MEASUREITEM:
    switch (LOWORD(wparam))
    {
    case 1005:
    OptionsComboboxMeasureItem(lparam);
    break;
    }
    return 0;
    //....
    }
    return DefWindowProc(hwnd, message, wparam, lparam);
    }


Все работает, но появляется глюк с перерисовкой : (происходит после 30-50 кратного передвижения мышкой по развернутому списку комбобокса)


Вопрос из-за чего это может быть ?

Похоже что где-то создается что-то, но не удаляется ... поэтому память на перерисовку утекает, не могу найти где же это ?

Добавлено
    FillRect(item->hDC, &rc, CreateSolidBrush(colorcurr));
    FrameRect(item->hDC, &rc, CreateSolidBrush(colorblack));

PS Пока писал тему сам нашел ))))))

https://forum.sources.ru/index.php?showtopic=421106&view=findpost&p=3843688

Метки:  

 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку