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