2016-03-26 5 views
1

Я разработал приложение win32 и создаю цветовой выбор, используя this example. Я обновляю, если оператор this изменит фон моего приложения, когда пользователь нажимает кнопку «ОК» в диалоговом окне цвета, но ничего не меняется. Где моя ошибка?Невозможно изменить фон окна

if (ChooseColor(&cc) == TRUE) { 
    HBRUSH hbrush = CreateSolidBrush(cc.rgbResult); 
    rgbCurrent = cc.rgbResult; 
    SetClassLongPtr(hWnd, GCLP_HBRBACKGROUND, (LONG)hbrush); 
} 
+1

Вам необходимо использовать статическую кисть. Создание нового каждый раз означает утечку ресурсов. – DimChtz

+0

Вам нужен WM_ERASEBKGND, см. Принятый андерсер в ссылке SO, которую вы опубликовали. – Joel

+0

Не бросайте 'hbrush' в' LONG', вся точка 'SetClassLongPtr' заключается в том, что этот параметр является' LONG_PTR'. –

ответ

1

Следующий код будет работать.

Во-первых, SetClassLongPtr() возвращает предыдущее значение, которое в этом случае является ранее установленным HBRUSH классом окна (hWnd). Вы должны удалить объект, чтобы избежать утечки памяти.

После этого вызов InvalidateRect() приводит к изменению цвета. Поскольку вновь созданная кисть будет использоваться, когда окно нужно перекрасить.

InvalidateRect() отправляет WM_ERASEBKGND в окно.

if (ChooseColor(&cc) == TRUE) { 
    HBRUSH hbrush = CreateSolidBrush(cc.rgbResult); 
    HBRUSH hOldBrush = (HBRUSH)SetClassLongPtr(hWnd, GCLP_HBRBACKGROUND, (LONG_PTR)hbrush); 

    DeleteObject(hOldBrush); 
    InvalidateRect(hWnd, NULL, 1); 
} 
+1

Обратите внимание, что это меняет цвет фона для всех окон класса, а не только тот, который представлен 'hWnd'. Вы должны настроить стирание окна с помощью 'WM_ERASEBKGND', чтобы только одно окно меняло свой цвет фона. –

Смежные вопросы