Возможно ли создать [настоящую] кнопку закрытия окна?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Возможно ли создать [настоящую] кнопку закрытия окна?

Сообщение Pantalone » 28.08.2006 (Пн) 20:28

Что имею в виду под настоящей, визуально точно такого вида как обычная кнопка закрытия окна, в зависимости от того какой стиль ХР на данный момент включен (синий, серебро или олива) или же стили вообще отключены.
Почему бы просто не сделать свою кнопку через картинки нужных видов кнопок? Потому что размер этих кнопок может измениться если юзер увеличит в настройках винды высоту тайтла и наша кнопка будет явно не такого размера как остальные кнопки окна.
Есть мысли?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.08.2006 (Пн) 21:25

RTFM, блин.

Код: Выделить всё
  h = OpenThemeData(Me.hWnd, StrPtr("Window"))
 
  r.Left = 50
  r.Top = 50
  r.Right = 80
  r.Bottom = 80
 
  DrawThemeBackground h, Me.hDC, WP_CLOSEBUTTON, CBS_NORMAL, r, ByVal 0&
 
  CloseThemeData h
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Сообщение Pantalone » 28.08.2006 (Пн) 22:13

Как будто вопрос настолько тривиальный что пошел и нашел :)
Нет ли более завершенного кода?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.08.2006 (Пн) 22:21

Именно так.
Я не знал, как это делается, пошёл в MSDN и нашёл за 10 минут.
А код завершён.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Сообщение Pantalone » 28.08.2006 (Пн) 23:04

Да, жаль раздел для новичков убрали.
Спасибо хотя бы за наводку, пойду дальше искать.

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Сообщение Pantalone » 29.08.2006 (Вт) 0:14

А кстати был где-то примерчик отображающий в Picturebox множество элементов ХР и наверняка они были выдраны именно так как посоветовал всемогущий GSerg. Нет ли у кого этого примерчика? Точно помню что видел, но не могу вспомнить названия и найти.

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Сообщение Pantalone » 29.08.2006 (Вт) 0:38

Фух, нашел :)

Naked
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 27.10.2004 (Ср) 3:16
Откуда: Дальнегорск столица мира

Сообщение Naked » 29.08.2006 (Вт) 2:10


tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 29.08.2006 (Вт) 5:47

Pantalone в очередной раз получает напоминание, что у поста есть кнопка "правка", и при внезапно нашедшем озарении нужно пользоваться ей.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 29.08.2006 (Вт) 8:54

Вопрос в тему: если я хочу нарисовать поверх [настоящей] кнопки закрытия окна -- например, смайлик, то в каком сообщении мне это делать?
Уже делаю в WM_NCPAINT, WM_NCACTIVATE, WM_NCMOUSEMOVE; но этого мало, и родная кнопка всё равно иногда проявляется.
Изображение

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 29.08.2006 (Вт) 9:18

tyomitch

ГЫГЫГЫ :)

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Сообщение Pantalone » 29.08.2006 (Вт) 11:07

Самое неприятное то что если юзер поставит на ХР свои скины то смайлик может очень в невыгодном свете смотреться и портить впечатление от программы. Мало того он может не только в гамму не вписаться, но и по размерам.
Лично я забросил эту затею. Нельзя сделать дополнительную кнопку на титлебаре окна рядом с кнопками минимизации закрытия и максимизации чтобы она при этом учитывала эти скины да еще и их размеры.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 29.08.2006 (Вт) 11:20

Pantalone, гонишь. Размеры и положение я уже считываю из темы, причём весьма успешно.
Вот только затирается мой смайлик :cry:
Изображение

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Сообщение Pantalone » 29.08.2006 (Вт) 11:43

tyomitch
Скришнот закинь если можно, очень посмотреть интересно.
Надеюсь речь не о дефолтных темах идет (классическая + 3 цветных)?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 29.08.2006 (Вт) 11:46

Скриншот чего? смайлика в недефолтной теме?
Изображение

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Сообщение Pantalone » 29.08.2006 (Вт) 11:48

Да, скриншот, а не фотошоп :)
Лучше конечно примерчик если не жалко.
Я вот пытаюсь кнопку минимизации превратить в кнопку с точкой в углу, т.е. представить ее как кнопка для минимизации в иконку. Но столкнулся с тем что юзер может размеры тайтла поменять и с этими скинами где кнопка может быть какая угодно, хоть треугольная и как на ней рисовать то что нужно не понятно.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 29.08.2006 (Вт) 12:05

Ну, дай тогда какой-нибудь скин с треугольной кнопкой, для проверки...
Изображение

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Сообщение lister » 29.08.2006 (Вт) 20:09

обычная кнопка закрытия окна, в зависимости от того какой стиль ХР на данный момент включен (синий, серебро или олива) или же стили вообще отключены.


Если стили отключены, то [настоящую] кнопку закрытия окна можно нарисовать практически одной строкой

Код: Выделить всё
  r.Left = 50
  r.Top = 50
  r.Right = 80
  r.Bottom = 80

DrawFrameControl Form1.hDC, r, DFC_CAPTION, DFCS_CAPTIONCLOSE


Также и с другими кнопками заголовка окна...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 29.08.2006 (Вт) 20:31

lister, только к этой "практически одной строке" надо добавить ещё строк на 10 определение высоты заголовка, ширины рамки, и т.д.
Изображение

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Сообщение lister » 29.08.2006 (Вт) 20:53

только к этой "практически одной строке" надо добавить ещё строк на 10 определение высоты заголовка, ширины рамки, и т.д.

Ну это само собой.

tyomitch, с необходимостью определения размеров при рисовании кнопки никто и не спорит. С другой стороны, могут понадобиться несистемные размеры кнопки...
DrawThemeBackground тоже ведь рисует кнопку не одной строкой, тоже нужно определить размеры.

Я хотел сказать, что через DrawFrameControl кнопку нарисовать проще, чем отрисовывать ее линиями, подбирать размер шрифта "крестика"... А с помощью DrawFrameControl кнопка рисуется почти в одну строку...

Хотя это мое мнение и я его не навязываю

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 29.08.2006 (Вт) 21:02

lister, а скажи... Кто собирался рисовать кнопку линиями?..
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Сообщение lister » 29.08.2006 (Вт) 21:06

Есть такие чудаки.

Встречал всякие контролы-кнопочки, которые отрисованы линиями...
Последний раз редактировалось lister 29.08.2006 (Вт) 21:11, всего редактировалось 1 раз.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 29.08.2006 (Вт) 21:09

MSDN писал(а):Draws the background image defined by the visual style for the specified control part.


Не могу проверить, просто интересно - если программа без манифеста, все равно будет отрисован элемент из темы XP?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Сообщение lister » 29.08.2006 (Вт) 21:11

Да, будет отрисован стиль XP

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Сообщение Pantalone » 30.08.2006 (Ср) 23:54

Проще тогда уж готовую картинку вставить на место кнопки чем рисовать. Но тут с размерами опять же беда, придется растягивать.

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Сообщение lister » 31.08.2006 (Чт) 0:00

Похоже DrawThemeBackground так и делает: берет картинку BUTTON.BMP из файла текущей темы (обычно - luna.msstyles) и растягивает до нужных размеров.

Вот образец того, как из картинки рисуется кнопка:
http://www.geocities.com/direct3dx/down ... button.zip

http://www.geocities.com/direct3dx/deve ... utton.html

Еще бы кто текст перевел :lol:
ГЫГЫГЫ


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 40

    TopList