![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как средствами WinApi создать кнопку без пунктирной каймы???
a_Lan © (2002-05-14 13:59:00)Может кто знает: как средствами WinApi создать кнопку без пунктирной каймы, такую же, как в окнах созданных из ресурсов (но не используя при этом самих ресурсов)!
Игорь Шевченко (2002-05-17 15:08:00) [1]Толик © (17.05.02 14:13)
Обычно кнопки, на которые нельзя встать табуляцией, закрывают окно. В противном случае, на OnClick просто передавать фокус на другой Control.
С уважением,
Толик (2002-05-17 14:13:00) [2]to Игорь Шевченко ©:
Ну не встанет фокус на кнопку при Tab, но после кликанья мышью всё равно кайма будет. Так что не всё так просто. :)
Игорь Шевченко (2002-05-17 13:16:00) [3]TabStop в false у кнопки поставить...
Все остальное, IMHO, извраты. :-)))
Толик (2002-05-17 12:29:00) [4]Насколько я понял, вопрос заключается в том, как обойти вызов DrawFocusRect. Если это так то можно:
1. использовать DrawFrameControl (см. Help)
2. добавить к стилям кнопки BS_OWNERDRAW и рисовать её руками (не вызывая DrawFocusRect)
3. не задавать окну кнопки текст, а рисовать его на кнопке руками (только текст)
4. ловить сообщение BN_SETFOCUS и не пускать его на кнопку через DefWindowProc (см. Help)
Игорь Шевченко (2002-05-17 10:29:00) [5]a_Lan © (17.05.02 09:51)
Вы определитесь, что вам нужно, и помогите понять это другим, тогда ответы будут содержательные.
Какую кайму вы имеете в виду ?
a_Lan (2002-05-17 09:51:00) [6]Evgeny >> Чувствую, скоро мой вопрос перенесут в категорию потрепаться, но все-таки я хочу закончить последним (раз уж никто не может предложить толковых идей).
"Кнопка баз каймы" - это кнопка либо вообще не содержащая на себе никакой информации -
CreateWindowEx(0,"button", NIL ,ws_child or ws_visible,100,100,100,100,Window,0,hInstance,nil);
(не обязательно для этого использовать WS_BITMAP или WS_ICON - тем более что они от каймы не избавят, дабы при первом же появлении на кнопке какого-либо рисунка (или иконки), на ней снова появиться несчастная кайма), либо созданная из ресурса диалога -
{.
CONTROL "OK", IDOK, "BUTTON", BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 100, 100, 100, 100
}
Я предлагаю кинуть на пустую кнопкутекст (DrawText(HDC,"Text",4,T,dt_center);), а при изменении состояния кнопки на форме обновлять DrawText (к примеру, в WM_PAINT)! Ты же, Evgeny, предлагаешь рисовать всю кнопку ЗАНОВО(WS_OWNERDRAW)!
Мне же нужно что-нибудь более простое (например, добавление какого либо флага при создании кнопки или простое отключение этой каймы), но раз никто не знает как это можно сделать более рационально или просто, тогда не имеет никакого смысла разводить пустую болтовню.
Спасибо за внимание, искренне желаю удачи на тяжелом поприще программирования!
Evgeny (2002-05-17 05:38:00) [7]>a_Lan
это изврат
Вообще-то изврат это VCL, а то что описал я - стандартные способ работы WinAPI. Судя по заданному вопросу тяжело придумать другой ответ, тем более, что вопрос содержит неверноеутверждение
> как в окнах созданных из ресурсов
как я уже описывал выше, нет разницы, где создавать класс.
Функции DrawText (или TextOut)занимаются выводом текста, но никак не отрисовкой кнопок. Так во всяком случае утверждает справка. Будь добр - сформулируй вопрос полнее и получишь более полный ответ.
a_Lan (2002-05-16 19:04:00) [8]Evgeny >> Нет, SpeedButton мне не нужен... да и кнопку без каймы проще создать с помощью DrawText (или TextOut), а не так, как предлагаешь ты, НО, дело в том, что все это изврат! Ладно, спасибо...
Evgeny (2002-05-16 05:41:00) [9]Разницы где ты создаешь кнопку в ресурсе или в теле программы нет. Если хочешь чтобы у тебя получилось нечто наподобие SpeedButton т.е. без получения фокуса, то для этого имеются разные варианты. Можно указать флаги WS_BITMAP или WS_ICON. Кнопки созданные с этими флагами не имеют пунктирной каймы (текста тоже). Можно выставить WS_OWNERDRAW и тогда вся забота об отрисовке кнопки ложится на программиста. При этом обрабатывается сообщение WM_DRAWITEM, где и производится отрисовка внешнего вида кнопки, рисунков и текста на ней. Это самый подходящий способ, здесь уже все зависит от широты фантазии.
VuDZ (2002-05-15 20:09:00) [10]I can"t do this - у меня сейчас тут не установлен ни VC++ ни MSDN, вообще ничего, даже VBA нету :<
a_Lan (2002-05-15 12:28:00) [11]To VuDZ >> Пожалуйста, VuDZ, приведи конкретныйпример.
VuDZ (2002-05-15 10:05:00) [12]в WindowProc
1. обрабатываешь все мессаги, и когда они приходят для дочернего окна - твоей кнопки - перерисовываешь её сам
2. если приходит сообщение WM_SETFOCUS, то возвращать 0, не пересылая его кнопке...
примерно та, в общих чертах :>
a_Lan (2002-05-15 09:27:00) [13]To Evgeny >> Интересная идея, но, к сожалению, в жизнь она не воплощается!
Evgeny (2002-05-15 05:34:00) [14]Если я не ошибаюсь, то параметр WS_TABSTOPподразумевается при создании окна. Соответственно чтобы не было пунктирной рамки на кнопке, т.е. не передавался фокус, требуется написать not WS_TABSTOP
a_Lan (2002-05-15 01:21:00) [15]To VuDZ: Да? А приведи пример, пожалуйста...
VuDZ (2002-05-14 22:43:00) [16]обрабатывать WM_PAINT для этой кнопки
a_Lan (2002-05-14 21:29:00) [17]To Song >> С чего ты взял, что если поменять свойство TButton.TabStop пунктирного фокуса (каймы) не будет??? - Это первое... Второе: я просил показать как это сделать средствами WinApi - в момент создания кнопки:
CreateWindowEx(0,"button",nil,... or ws_child or ws_visible,X,Y,W,H,Window,0,hInstance,nil);
Song (2002-05-14 14:44:00) [18]Пунктирная койма показывается на кнопке когда на неё передаётся фокус. Если поменять свойство TButton.TabStop каймы не будет :)