Home
Норка хомячка [entries|archive|friends|userinfo]
HOMO_PROGRAMMATIS

[ website | Мой сайт ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Mnemonics & checkboxes [Июл. 10, 2008|02:57 pm]
Keywords: чекбокс, checkbox, мнемоник, mnemonic, акселератор, accelerator, галка, tick

Проблема: Почему при нажатии мнемоника (Alt + подчеркнутая на контроле буква, перед которой в тексте окна на самом деле стоит "&" ) у части чекбоксов ставится галочка, а у части нет?
Предыстория (несущественная здесь): Имеется табконтрол с закладками-страницами, на закладках разные контролы - все как обычно. Все контролы принадлежат одному и тому же диалогу, которому принадлежит и сам таб.
Исследование: Как вы думаете, в чем дело? Нуу? Нет вариантов? Оказалось, что все из-за контролов (выключенных и скрытых) с такими же мнемониками на других "страницах". Видимо, в данном случае глюк винды - не обращая внимания на то что другие контролы выключены и скрыты, она все равно считает что их несколько с одинаковым мнемоником и галку не ставит.
Решение: Ничего умнее чем убирать мнемоники при выключении окна в голову не пришло. Если есть другой способ - буду рад узнать.


Problem: Upon pressing a mnemonic (Alt + letter underlined in control, it actually follows invisible "&" in control's text) some checkboxes are ticked, and some are not.
Unneccessary description: I had a tab control with "pages" containing controls. All controls are childs to the same dialog, containing the tab itself.
Research: So, what do you thing the trouble could be? Any ideas? It's all due to controls (invisible and disabled) on other "pages", which have the same mnemonics. Probably this is one of rare Windows bugs, it ignores control's disabled/invisible states and thinks that there are multiple controls with same mnemonic, that's why it won't tick the checkbox.
Solution: I didn't come up with anything better then removing mnemonics upon disabling the window. If you have a better solution, i'd be glad to know it.
ссылкаОставить комментарий

WM_NCHITTEST & HTTRANSPARENT [Апр. 28, 2008|04:25 pm]
Как сделать окно, через определенные области которого можно кликать по контролам под ним.
Допустим, вы пишете контрол наподобие рамки или окно наподобие увеличительного стекла. В то время как часть окна - самая обычная, другая часть должна быть "прозрачной" для кликов мышью, при этом вы хотите отрисовывать "прозрачную" часть, так что регионы не подходят. Итак - обработайте сообщение WM_NCHITTEST и для прозрачных областей верните HTTRANSPARENT, а для непрозрачных - например HTCLIENT. Случай из реальной жизни: http://homo-programmat.livejournal.com/2388.html

How to make a window that allows to click on underlying controls through it
Imagine you're writing a control like a frame or a window like magnifier. A part of this window is common, and another part must allow to click through it on the underlying windows. In the same time you wish to draw "transparent" part, so regions won't do. Solution: handle WM_NCHITTEST and return HTTRANSPARENT for transparent areas, while returning something like HTCLIENT for non-transparent ones. Real-life case: http://homo-programmat.livejournal.com/2388.html
ссылкаОставить комментарий

WS_CLIPSIBLINGS [Апр. 28, 2008|04:11 pm]
Как сделать чтобы окно не загораживало контролы "под ним"
Допустим, вы делаете контрол наподобие tab или "рамки", внутри которого должны быть другие контролы, не являющиеся его чайлдами. Чтобы ваш контрол не загораживал внутренние независимо от относительного таб-ордера, поставьте ему стиль WS_CLIPSIBLINGS. Случай из реальной жизни: http://homo-programmat.livejournal.com/2388.html

How to stop a window from obscuring background controls
If you're writing a control like a tab or a frame that will contain other non-child controls within its area and you want it not to obscure internal controls regardless of its tab-order, set WS_CLIPSIBLINGS style to your control. Real case here: http://homo-programmat.livejournal.com/2388.html
ссылкаОставить комментарий

Tab control & Z-Order и не только [Апр. 28, 2008|03:49 pm]
Это случай из реальной жизни. Следующие из него советы вы можете видеть в 2 записях выше.

Предыстория
Я писал собственный TabControl "с нуля". Связано это было с тем, что стандартный TabControl не позволяет отрисовывать свои страницы, только элементы заголовка, а для программы нужно было перерисовать его целиком. TabControl был успешно нарисован, и пришла пора его вставлять на место старого стандартного. И вот тут-то появилась проблема: если сабж по таб-ордеру идет перед элементами, которые лежат "поверх" него, то эти элементы рисуются, но по ним нельзя кликнуть - все клики получает TabControl. Если же TabControl идет по таб-ордеру после элементов, то он их загораживает и их не видно. Задача не так тривиальна как может показаться на первый взгляд, особенно если нельзя менять исторически сложившийся таб-ордер. При этом стандартный виндовский TabControl ведет себя одинаково независимо от своего положения - не загораживает контролы и не задерживает клики.

Решение
1) Установить табконтролу (ну или что вы там рисуете) стиль WS_CLIPSIBLINGS. Это вырежет из области его перерисовки прямоугольники "загороженных" элементов управления, таким образом он не будет их загораживать "графически".
2) Обработать сообщение WM_NCHITTEST и для всех неинтересных областей (у TabControl это все кроме кнопок, переключающих страницы) вернуть HTTRANSPARENT, для остального - по усмотрению, например HTCLIENT. Это сделает ваш контрол прозрачным "физически", и он больше не будет задерживать клики мышью.


This is a real-life case. You can read advices following from it in two above records.

Story
I was writing a tab control of my own from a scratch. I needed that because standard tabcontrol doesn't allow to draw its pages, only header buttons, but i needed to draw entire control. When the control was drawn and i started to replace old controls with new ones, a problem came up. If my new tab was tab-ordered before other controls, i couldn't click those controls because tab received clicks. If it was ordered after them, they received clicks but were not drawn because tab obscured them. I also had to keep the original tab-ordering intact. Surprisingly, default tab control ignores those problems and works well regardless of its ordering.

Soltuion
1) Set WS_CLIPSIBLINGS style to your control. The regions of underlying controls (if any) will be extracted from its drawing area, so your control will not obscure underlying ones regardless of tab-order.
2) Handle WM_NCHITTEST in your control and return HTTRANSPARENT for all areas that you wish to pass clicks through, returning something like HTCLIENT for "solid" areas. With that, your control will pass all mouse events to underlying controls regardless of tab-order.
ссылкаОставить комментарий

Смена курса [Апр. 28, 2008|02:42 pm]
После долгих размышлений и наблюдений стало понятно, что писать про жизнь я в ЖЖ все равно не буду. Но ведь не просто так я его завел? Итак, теперь тут будут публиковаться решения для нетривиальных проблем в программировании, с которыми мне пришлось столкнуться. Попутно из ЖЖ удален кое-какой хлам.
ссылкаОставить комментарий

А теперь - красивые фотки! [Апр. 18, 2006|03:53 am]
Каждый раз когда смотрю на эти фотки, сделанные во время похода летом на Урал, так и хочется туда вернуться...



ссылкаОставить комментарий

Небольшой прикол [Мар. 30, 2005|02:26 pm]
Предыстория: с удовольствием прочитав две книги Злотникова из серии о Вечном, я озаботился поиском третьей - но не тут-то было. В итоге я обошел с девушкой три крупных книжных магазина, и, чуть уже не отчаявшись, решил купить в инете (в озоне). Купил, но теперь ее надо забрать - а все никак не могу собраться. Пока же залил книгу на палм, но с него читать... Мягко говоря, извращение. Не понимаю людей, которые что-то-там радостно вопят про читалки и покупают палмы для этого. Ну так вот,

Вчера надоело ждать пока смогу забрать книгу из озона, и с палма читать тоже надоело. Написал на борде - дайте мол в единичке оную книгу.
http://board.rt.mipt.ru/?read=1982665
Мне пишут - лана, заходи, 409 (моя бывшая комната в студенческой общаге). Я туда иду - и мне дают... МОЮ КНИГУ.

От старшекурсников, когда я еще на 1 курсе селился, осталось несколько книг. Они мне не приглянулись по названию, а выбрасывать хорошие книги мне показалось неправильным. Так я их и хранил, и все руки не доходили в библиотеку отдать. А когда переезжал - забыл. Ну вот тут-то мне ее и вернули :) Девушка уже высказала мнение, что наверное это судьба :)
ссылкаОставить комментарий

Сижу я тут ем свой доширак... [Фев. 16, 2005|09:34 pm]
И тут вижу на ГЛАВНОМ сервере на работе в дистрибах папку "Обновление для говнища под названием MSOffice". Чуть лапшой не подавился, блин, хоть бы предупреждали
ссылкаОставить комментарий

navigation
[ viewing | most recent entries ]

Реклама