Как убрать границу из кнопки управления и установить флажок фона - PullRequest
0 голосов
/ 27 апреля 2019

Я новичок в Win32 API, и я сделал

HWND button = CreateWindowEx(0, "BUTTON", NULL, WS_CHILD | WS_VISIBLE | BS_BITMAP, 150, 100, 150, 30, hwnd, (HMENU)ID_BUTTON, hInstance, NULL);

и

HWND check = CreateWindowEx(0, "BUTTON", "text", WS_CHILD | WS_VISIBLE | BS_CHECKBOX, 150, 100, 300, 20, hwnd, (HMENU)ID_CHECK, hInstance, NULL);

Я хочу удалить белую рамку из кнопки управления, в которую я вставил растровое изображение и установил черныйфон и белый текст на BS_CHECKBOX.Я прочитал о WM_CTLCOLORBTN, но я не знаю, как это сделать правильно.

1 Ответ

1 голос
/ 29 апреля 2019

WM_CTLCOLORBTN следует использовать с BS_OWNERDRAW .

То есть, только когда добавлено BS_OWNERDRAW, WM_CTLCOLORBTN сработает и кнопка может быть перерисована.

Но когда вы используете BS_OWNERDRAW, ваш оригинальный стиль флажка будет заменен следующим образом.

check = CreateWindowEx(0,L"BUTTON",L"text", WS_CHILD | WS_VISIBLE | BS_CHECKBOX | BS_OWNERDRAW, 150, 100, 60, 20, hWnd, (HMENU)ID_CHECK, (HINSTANCE)GetWindowLong(hWnd, GWLP_HINSTANCE), NULL);
 case WM_CTLCOLORBTN:
{
    return (INT_PTR)CreateSolidBrush(RGB(0, 0, 0));
    break;
}
case WM_DRAWITEM:
{
    LPDRAWITEMSTRUCT pDIS = (LPDRAWITEMSTRUCT)lParam;
    if (pDIS->hwndItem == check)
    {
        SetTextColor(pDIS->hDC, RGB(255, 255, 255));
        SetBkColor(pDIS->hDC, RGB(0, 0, 0));
        WCHAR Text[99];
        int len = SendMessage(check, WM_GETTEXT,
            ARRAYSIZE(Text), (LPARAM)Text);
        TextOut(pDIS->hDC, pDIS->rcItem.left, pDIS->rcItem.top, Text, len);
    }
    return TRUE;
}

Результаты отладки:

debug result

Вы обнаружите, что это отличается от того, что вы думаете.

Согласно MSDN, создает кнопку, нарисованную владельцем. Окно владельца получает сообщение WM_DRAWITEM, когда визуальный аспект кнопки имеет изменилось. Не комбинируйте стиль BS_OWNERDRAW с любой другой кнопкой стили.

Итак, я предлагаю вам сделать это.

check = CreateWindowEx(0,L"BUTTON",L"text123", WS_CHILD | WS_VISIBLE | BS_CHECKBOX ,150, 100, 60, 20, hWnd, (HMENU)ID_CHECK, (HINSTANCE)GetWindowLong(hWnd, GWLP_HINSTANCE), NULL);
case WM_CTLCOLORSTATIC:
{
    HDC hdc = (HDC)wParam;
    HWND hWnd = (HWND)lParam;
    if (hWnd == check)
    {
        SetBkMode(hdc, TRANSPARENT);
        SetTextColor(hdc, RGB(255, 255, 255));
        return (INT_PTR)CreateSolidBrush(RGB(0, 0, 0));
    }
break;
}

При запуске WM_CTLCOLORSTATIC цвета текста и фона отображаются самостоятельно.

Debug result

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...