31 / 31 / 15
Регистрация: 02.02.2015
Сообщений: 152
1

Combobox в окне с другим фоном. Как убрать белые углы combobox?

05.06.2016, 12:49. Показов 1071. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Основное окно имеет градиентную заливку фона. Также включены стили windows через манифест.
C++
1
2
3
#pragma comment(linker,""/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'"")
Combobox создаю с помощью CreateWindow:
C++
1
2
3
DWORD dwStyle = WS_CHILD | CBS_DROPDOWNLIST;
if (m_bVisible) dwStyle |= WS_VISIBLE;
m_hWnd = CreateWindow(WC_COMBOBOX, NULL, dwStyle, m_posX, m_posY, m_width, m_height, m_hParent, (HMENU)m_id, m_hInstance, NULL);
У него существует своя кисть для отрисовки фона, так как вылезают белые углы на окне родителя.
Прикладываю изображение, на нём отметил красными прямоугольниками области с углами.
Как мне их убрать?
Миниатюры
Combobox в окне с другим фоном. Как убрать белые углы combobox?  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.06.2016, 12:49
Ответы с готовыми решениями:

Как убрать белые углы в TImage
Всем привет! Вопрос, как убрать белые углы в TImage (гружу jpeg)? Transparent, не помогает.

Вывод значений в comboBox, связанных с другим comboBox
как сделать вывод в combobox2, если оно зависит от выбора значения comboBox1. программа...

Как скрыть мигающий курсор в окне ввода ComboBox?
Для TextBox всё работает: <DllImport("user32")> Private Shared Function HideCaret(ByVal hWnd...

Как убрать повторения из ComboBox
Здравствуйте! Проблема в следующем: я заполняю combobox данными из колонки таблицы sql, но там есть...

5
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
06.06.2016, 12:18 2
Цитата Сообщение от wmaster575 Посмотреть сообщение
Как мне их убрать?
Рисовать другую рамку поверх существующей рамки combobox. Примерно так:

C++
1
SetWindowLongPtr(mycombobox, GWLP_WNDPROC, (LONG_PTR)MyComboProc);
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
LRESULT CALLBACK MyComboProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
       WNDPROC OldComboProc = (WNDPROC)GetWindowLongPtr(hwnd, GWLP_USERDATA);
    int rc = CallWindowProc(OldComboProc, hwnd, msg, wParam, lParam);
 
    if (msg == WM_ERASEBKGND || msg == WM_PAINT || msg == WM_NCPAINT)
       {
       RECT r;
       HDC hdc = GetWindowDC(hwnd);     
       GetClientRect(hwnd, &r);
       r.bottom = r.top + combobox_size;
       HRGN hframe = CreateRectRgnIndirect(&r);
       FrameRgn(hdc, hframe, brush, 3, 3);
       DeleteObject(hframe);
       ReleaseDC(hwnd, hdc);
        }
 
    return rc;
}
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
06.06.2016, 16:14 3
Это всего лишь стандартный фон элемента управления windows COLOR_BTNFACE. Можно попробовать обработать сообщение WM_CTLCOLOREDIT (WM_CTLCOLORSTATIC для disable комбобокса). Когда система спрашивает, какой кистью закрасить фон элемента, можно просто вернуть кисть нужного цвета, либо попытаться вернуть пустую кисть, и надеяться что фон комбобокса будет прозрачным (тут в зависимости от темы оформления парой разнятся способы рисования контролов и могут быть сложности).
0
31 / 31 / 15
Регистрация: 02.02.2015
Сообщений: 152
06.06.2016, 16:38  [ТС] 4
Operok, да я как раз и ловлю событие:
C++
1
2
3
4
5
6
case WM_CTLCOLOREDIT:
    if ((HWND)lParam == m_hSrcListBox)
    {
        return (LRESULT)m_hBrush;
    }
break;
В отладке смотрю, кисть возвращается, но эти углы остаются, то есть кисть не используется. Пустая кисть тоже ничего не делает.
0
413 / 148 / 48
Регистрация: 02.06.2016
Сообщений: 342
07.06.2016, 15:15 5
C++
1
2
3
4
5
6
7
8
    case WM_ERASEBKGND:
    {
 
        HDC hdc = (HDC) wParam;
        
    //Здесь рисуется фон
    }
    break;
Миниатюры
Combobox в окне с другим фоном. Как убрать белые углы combobox?  
0
31 / 31 / 15
Регистрация: 02.02.2015
Сообщений: 152
07.06.2016, 16:44  [ТС] 6
Сработало в сообщении WM_CTLCOLORSTATIC, оказывается его надо было ловить.

Добавлено через 22 минуты
GoshaM, ваш вариант более правильный. Если рисовать фон в сообщении WM_ERASEBKGND, то всё нормально. Спасибо.
0
07.06.2016, 16:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.06.2016, 16:44
Помогаю со студенческими работами здесь

ComboBox, Как убрать выделение элемента?
В общем, есть несколько боксов с настройками: DropDownStyle - DropDownList FlatStyle - Popup ...

ComboBox. Как узнать индекс при изменении состояния ComboBox
Здравствуйте, возник вопрос касательно ComboBox. В реалиях выполняемой задачи появилась...

Как можно менять текст в Combobox, используя другой Combobox?
Как можно менять текст, в Combobox используя другой Combobox, т.е. Допустим, есть два Combobox:...

Как сделать чтобы при выборе в combobox , менялись значения в других combobox?
Есть два combobox. Как их сделать зависимыми друг от друга. Что бы при выборе одного combobox...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru