Шаг 89 - Безболезненно меняем стили компонентов

Под стилем здесь подразумевается не внешний вид и даже не бронзовая палочка для письма, а исконно виндовая версия сего понятия - атрибут оконного компонента. Т.е., такие стили, как CS_HREDRAW, CS_DBLCLKS и прочие (полный список можно найти в руководстве SDK на функции CreateWindow и CreateWindowEx).

В VCL некоторые стили компонентов установлены по умолчанию, но иногда их нужно менять. Наиболее надежно это делается изменением наследуемого виртуального метода CreateParams (от TWinControl). В качестве примера использования приведу доработку статусной строки (TStatusBar) для Windows XP. Отлаживая программу на данной ОС, обратил внимание на некорректное отображение статусной строки при изменении размеров окна. То есть при вертикальном изменении она перерисовывалась, а при горизонтальном - нет. Выход: добавить в стиль класса CS_HREDRAW. Что и было сделано.

class TStatusBarXP : public TStatusBar
{
public:
__fastcall virtual TStatusBarXP(Classes::TComponent* AOwner):TStatusBar(AOwner){ };
virtual void __fastcall CreateParams(Controls::TCreateParams &Params)
	{
		TStatusBar::CreateParams(Params);
		Params.WindowClass.style |= CS_HREDRAW;
	};
};

Очень кратко, правда же? В принципе можно сделать отдельный компонент и записать его на палитру Samples или что-то в этом роде. С таким уже успехом можно пользоваться run-time созданием компонентов.

Потом, стандартный компонент TTrackBar имеет довольно несимпатичный вид в плане широкой прорези. Изменим...

#include <ComCtrls.hpp>
class TTrackBar2:public TTrackBar
{
public:
__fastcall virtual TTrackBar2(Classes::TComponent* AOwner):TTrackBar(Owner){};
virtual void __fastcall CreateParams(TCreateParams& Params)
	{
		TTrackBar::CreateParams(Params);;;;
		Params.Style ^= TBS_ENABLESELRANGE;
	};
};

Где находится нужный стиль - в Style, ExStyle или WindowClass.style - зависит от того, какой собственно стиль мы меняем - окна, расширенный окна или класса.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Аванесов Самвел - 7.02.2004