четверг, 18 августа 2011 г.

Свойства оконных классов применяются ко всем окнам этого класса

Это перевод Window class properties apply to all windows that belong to the class. Автор: Реймонд Чен.

Свойства оконных классов применяются ко всем окнам этого класса. Именно поэтому они и называются классовыми свойствами. Это выглядит как очевидная вещь, когда её облекают в слова, но я видел множество "решений", которые теряют из вида этот простой факт.

Все свойства, устанавливаемые в записях TWndClass (или TWndClassEx) являются свойствами оконного класса, равно как и свойства, доступ к которым происходит через Get/SetClassWord/Long/LongPtr. Это означает, что когда вы меняете эти свойства, то это изменение затрагивает весь оконный класс. К примеру, если вы пишете:
SetClassLongPtr(hwnd, GCLP_HCURSOR, LONG_PTR(hcurNew));
то вы не просто меняете курсор окна hwnd. Вы меняете курсор всех окон того же оконного класса, что и оконный класс hwnd. К примеру, если hwnd является описателем элементом управления edit, то этим вы измените курсор во всех edit-ах!

Но что если вам нужно изменить классовое свойство только для одного окна, вместо всех окон?

Если вы хотите изменить меню, фон, курсор или значок конкретного окна, то вы можете заместить умолчания класса на уровне окна:

СвойствоМетод
МенюSetMenu(hwnd, hmenuNew) + удалить старое меню
ФонЗаместить WM_ERASEBKGND
КурсорЗаместить WM_SETCURSOR
ИконкаSendMessage(hwnd, WM_SETICON, iconSize, LPARAM(hiconNew));

Прим.пер.: вероятно, людей смущает тот факт, что функции Get/SetClassXYZ принимают аргументом окно, а не оконный класс.

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.