Как сделать кнопки плоскими не применяя каток?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
HBasic
Новичок
Новичок
 
Сообщения: 49
Зарегистрирован: 01.03.2009 (Вс) 21:53

Как сделать кнопки плоскими не применяя каток?

Сообщение HBasic » 18.03.2009 (Ср) 7:18

С Push Button ковырялся ничего не получилось.Если надо библиотеки какие подключать то расскажите
пожалуйста подробно как это делается.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как сделать кнопки плоскими?

Сообщение Хакер » 18.03.2009 (Ср) 7:51

Зачем?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Как сделать кнопки плоскими?

Сообщение jangle » 18.03.2009 (Ср) 10:32

HBasic писал(а):С Push Button ковырялся ничего не получилось.Если надо библиотеки какие подключать то расскажите
пожалуйста подробно как это делается.


стиль BS_FLAT

Код: Выделить всё
Option Explicit

Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Const BS_FLAT = &H8000
Private Const GWL_STYLE = (-16)

Private Sub Form_Load()
Dim tmp As Long
tmp = GetWindowLong(Command1.hWnd, GWL_STYLE)
tmp = tmp + BS_FLAT
Call SetWindowLong(Command1.hWnd, GWL_STYLE, tmp)
End Sub

HBasic
Новичок
Новичок
 
Сообщения: 49
Зарегистрирован: 01.03.2009 (Вс) 21:53

Re: Как сделать кнопки плоскими?

Сообщение HBasic » 18.03.2009 (Ср) 20:15

Хакер писал(а):Зачем?

Так хочет заказчик.

HBasic
Новичок
Новичок
 
Сообщения: 49
Зарегистрирован: 01.03.2009 (Вс) 21:53

Re: Как сделать кнопки плоскими?

Сообщение HBasic » 18.03.2009 (Ср) 20:15

jangle писал(а):
HBasic писал(а):С Push Button ковырялся ничего не получилось.Если надо библиотеки какие подключать то расскажите
пожалуйста подробно как это делается.


стиль BS_FLAT

Код: Выделить всё
Option Explicit

Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Const BS_FLAT = &H8000
Private Const GWL_STYLE = (-16)

Private Sub Form_Load()
Dim tmp As Long
tmp = GetWindowLong(Command1.hWnd, GWL_STYLE)
tmp = tmp + BS_FLAT
Call SetWindowLong(Command1.hWnd, GWL_STYLE, tmp)
End Sub

Спасибо.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как сделать кнопки плоскими?

Сообщение Хакер » 18.03.2009 (Ср) 23:32

Человеку подсовывают дрянь, а он и рад "Спасибо" сказать.

Должно быть tmp Or BS_FLAT вместо tmp + BS_FLAT.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Как сделать кнопки плоскими?

Сообщение jangle » 18.03.2009 (Ср) 23:49

Хакер писал(а):Человеку подсовывают дрянь, а он и рад "Спасибо" сказать.

Должно быть tmp Or BS_FLAT вместо tmp + BS_FLAT.


Разве от этого, кнопки более плоскими станут? :mrgreen:

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как сделать кнопки плоскими?

Сообщение Хакер » 19.03.2009 (Чт) 0:22

От этого программы менее бажными станут. Код менее кривым.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Как сделать кнопки плоскими?

Сообщение awl100Alex » 19.03.2009 (Чт) 10:16

Хакер писал(а):Человеку подсовывают дрянь, а он и рад "Спасибо" сказать.

Должно быть tmp Or BS_FLAT вместо tmp + BS_FLAT.


И чего ты все время такой злой???
Вот посмотри здесь ( http://ru.wikipedia.org/wiki/Дизъюнкция ), и обрати внимание a + b, a OR b - разницы нет никакой, кроме эстетики может быть. Почему же и в этом случаи ты опять говоришь, что это "дрянь", все "криво"... не понимаю. :shock:

Xcode
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 131
Зарегистрирован: 31.10.2008 (Пт) 8:12
Откуда: Pavlodar

Re: Как сделать кнопки плоскими?

Сообщение Xcode » 19.03.2009 (Чт) 10:40

awl100Alex, выполни этот код и поймешь о какой кривизне идет речь.
Код: Выделить всё
Dim a As Byte
a = vbCenter 'vbCenter = 2
a = a + vbAbort 'vbAbort = 3
Print a
a = a Or vbAbort
Print a

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Как сделать кнопки плоскими?

Сообщение alibek » 19.03.2009 (Чт) 11:41

Xcode писал(а):awl100Alex, выполни этот код и поймешь о какой кривизне идет речь.

Поскольку BS_FLAT является степенью двойки, а у кнопки этого стиля нет, то разницы никакой.
Lasciate ogni speranza, voi ch'entrate.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сделать кнопки плоскими?

Сообщение arthur2 » 19.03.2009 (Чт) 11:50

просто в дебагере:

Код: Выделить всё
? 3 + 2
? 3 or 2


А одинаковый результат - только для степеней двойки :(
Артур
 
   

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как сделать кнопки плоскими?

Сообщение iGrok » 19.03.2009 (Чт) 11:51

alibek писал(а):
Xcode писал(а):awl100Alex, выполни этот код и поймешь о какой кривизне идет речь.

Поскольку BS_FLAT является степенью двойки, а у кнопки этого стиля нет, то разницы никакой.

Ну да. А потом человек начнёт точно так же применять какой-нить "составной" стиль к окну, у которого уже есть один-два этих стиля, и долго будет думать "А чего это у меня нихрена не работает? Я же всё правильно делаю!".

Опять же, если на основании этого подхода челом будет написана универсальная процедура для "делания кнопочек плоскими", которую он будет применять перебором ко всем кнопкам на форме...
label:
cli
jmp label

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как сделать кнопки плоскими?

Сообщение Хакер » 19.03.2009 (Чт) 12:12

И чего ты все время такой злой???

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

alibek писал(а):Поскольку BS_FLAT является степенью двойки, а у кнопки этого стиля нет, то разницы никакой.

Это ведь ты сам выдумал, предположил, что его нет? На самом деле, этот стиль вполне может там быть. Тогда результат непредсказуем.
Это что чисто вопросов функционирования.

А ещё вопрос стиля.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Как сделать кнопки плоскими?

Сообщение jangle » 19.03.2009 (Чт) 20:20

awl100Alex писал(а):И чего ты все время такой злой???
Вот посмотри здесь ( http://ru.wikipedia.org/wiki/Дизъюнкция ), и обрати внимание a + b, a OR b - разницы нет никакой, кроме эстетики может быть. Почему же и в этом случаи ты опять говоришь, что это "дрянь", все "криво"... не понимаю. :shock:


Хакер просто мне завидует, ведь я талантливее его... :mrgreen:

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как сделать кнопки плоскими?

Сообщение Хакер » 19.03.2009 (Чт) 21:22

Хакера раздражают твои попытки протолкнуть какую-нибудь дрянь. Например ExitProcess.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Как сделать кнопки плоскими?

Сообщение jangle » 19.03.2009 (Чт) 21:43

Хакер писал(а):Хакера раздражают твои попытки протолкнуть какую-нибудь дрянь. Например ExitProcess.


В отличие от тебя, я дал человеку правильный ответ на его вопрос. Он спрашивал, как из обычной кнопки сделать плоскую.

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Как сделать кнопки плоскими?

Сообщение awl100Alex » 19.03.2009 (Чт) 21:47

Xcode писал(а):awl100Alex, выполни этот код и поймешь о какой кривизне идет речь.
Код: Выделить всё
Dim a As Byte
a = vbCenter 'vbCenter = 2
a = a + vbAbort 'vbAbort = 3
Print a
a = a Or vbAbort
Print a

А... вот оно что! Блин... :roll: Ну, да я вспомнил... разница действительно есть! Получается, что в Википедии указали «+» и «OR» в отношении именно Дизъюнкции (логического сложения)! А в данном случаи...

a = a + vbAbort – это арифметическая операция.
a = a Or vbAbort – а это логическая.

Результат будет естественно различаться, НО(!) это НЕ кривизна кода!
Все дело в том, что когда происходит логическое сложение, то машина просто суммирует биты числа и получает результат:
5 – 101
3 – 011
7 – 111 – вот это и есть результат логического сложения «OR».

А вот в отношении арифметических операций все не так просто. Сейчас уже не могу вспомнить детально, но точно знаю, что в этом случаи, машина выполняет целую серию(!) логических операций прежде чем получит результат 5+3=8.
Точно не скажу, но кажется, прибавляемое число сначала модифицируется машиной в некий промежуточный код числа за несколько операций логики и только потом складывает и получает 1000 то есть число 8.
Вот вам и разгадка данного артефакта! :)

Кстати, никто ведь и не обратил внимания, к чему приводит поправка Хакера...
Попробуйте выполнить tmp = tmp Or BS_FLAT – кнопка станет плоской и одновременно с этим ЗАБЛОКИРУЕТСЯ! :(

И еще одно наблюдение...
Каким-то чудесным образом константа BS_FLAT = &H8000 = 32768 в режиме выполнения, превращается в ОТРИЦАТЕЛЬНОЕ число «-32768». Таким образом tmp + BS_FLAT на самом деле происходит tmp - BS_FLAT и получается &H5400A000.
Почему бы тогда сразу не записать...
Call SetWindowLong(Command1.hWnd, GWL_STYLE, &H5400A000)
Без предварительного получения GetWindowLong если стиль Button Default!?

И кто мне сможет объяснить одну странную вещь...
Почему свойство Appearance = 0 для CommandButton тупо не работает??? Зачем оно тогда кнопке??? К тому же в самом MSDN указано, что все должно работать не только до... но даже во время выполнения -
http://msdn.microsoft.com/ru-ru/library/k1zs8awx.aspx.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Как сделать кнопки плоскими?

Сообщение alibek » 19.03.2009 (Чт) 21:48

awl100Alex писал(а):Результат будет естественно различаться, НО(!) это НЕ кривизна кода!
Все дело в том, что когда происходит логическое сложение, то машина просто суммирует биты числа и получает результат:

Вау. Кто бы мог подумать.
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Как сделать кнопки плоскими?

Сообщение alibek » 19.03.2009 (Чт) 21:51

awl100Alex писал(а):Кстати, никто ведь и не обратил внимания, к чему приводит поправка Хакера...
Попробуйте выполнить tmp = tmp Or BS_FLAT – кнопка станет плоской и одновременно с этим ЗАБЛОКИРУЕТСЯ! :(

Не неси чушь. Если ты не понимашь, как функционирует OR, то почитай учебник.

awl100Alex писал(а):Каким-то чудесным образом константа BS_FLAT = &H8000 = 32768 в режиме выполнения, превращается в ОТРИЦАТЕЛЬНОЕ число «-32768». Таким образом tmp + BS_FLAT на самом деле происходит tmp - BS_FLAT и получается &H5400A000.

Прежде чем делиться такими откровениями, следует задать себе вопрос "а понимаю ли я, для чего используются типы данных? нет? тогда я лучше промолчу".
Lasciate ogni speranza, voi ch'entrate.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Как сделать кнопки плоскими?

Сообщение jangle » 19.03.2009 (Чт) 21:54

Кстати, никто ведь и не обратил внимания, к чему приводит поправка Хакера...
Попробуйте выполнить tmp = tmp Or BS_FLAT – кнопка станет плоской и одновременно с этим ЗАБЛОКИРУЕТСЯ!


Действительно кнопка блокируется! Вот спрашивается, кто дрянь советует?

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Как сделать кнопки плоскими?

Сообщение jangle » 19.03.2009 (Чт) 21:57

alibek писал(а):
awl100Alex писал(а):Не неси чушь. Если ты не понимашь, как функционирует OR, то почитай учебник.


Код то сначала запусти, а потом пиши...

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сделать кнопки плоскими?

Сообщение arthur2 » 19.03.2009 (Чт) 23:39

awl100Alex писал(а):Каким-то чудесным образом константа BS_FLAT = &H8000 = 32768 в режиме выполнения, превращается в ОТРИЦАТЕЛЬНОЕ число «-32768».

Ничего чудесного. &H8000 тип integer. нулевой бит выставлен. Вот и отрицательное.

Чтобы "сошлось с ответом", пиши так: BS_FLAT = &H8000&= 32768
Теперь это - лонг

То есть, &h8000& - это реально &h00008000

(очень может быть, что и заблокированность отсюда вылезла)

awl100Alex писал(а):a = a + vbAbort – это арифметическая операция.
a = a Or vbAbort – а это логическая.

Вот именно поэтому использовать арифметическую там, где нужна логическая - это фи
Артур
 
   

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как сделать кнопки плоскими?

Сообщение iGrok » 19.03.2009 (Чт) 23:53

jangle писал(а):
Кстати, никто ведь и не обратил внимания, к чему приводит поправка Хакера...
Попробуйте выполнить tmp = tmp Or BS_FLAT – кнопка станет плоской и одновременно с этим ЗАБЛОКИРУЕТСЯ!


Действительно кнопка блокируется! Вот спрашивается, кто дрянь советует?

Вот тебе и вылез твой изначально кривой код.
Твоя константа укладывается в размер Integer, поэтому она и оказывается Integer'ом.
Потом когда ты выполняешь tmp = tmp Or BS_FLAT у тебя получается что-то вроде tmp = tmp Or CLng(BS_FLAT)
А CLng(&H8000) = &HFFFF8000

Лечится это просто - объявлением константы либо так Private Const BS_FLAT As Long = &H8000, либо так Private Const BS_FLAT = &H8000&

Теперь понятно, откуда ноги растут?
label:
cli
jmp label

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как сделать кнопки плоскими?

Сообщение Хакер » 19.03.2009 (Чт) 23:58

jangle писал(а):Действительно кнопка блокируется! Вот спрашивается, кто дрянь советует?

Разумеется ты. Артур (А Игрок ещё и опередил с ответом) выше угадал с причиной блокирования кнопки.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Как сделать кнопки плоскими?

Сообщение jangle » 20.03.2009 (Пт) 0:08

iGrok писал(а):Теперь понятно, откуда ноги растут?


Однако, код работает. Кнопка из обычной становится плоской. Пусть даже и не совсем корректным способом.
Видимо это тот случай, когда одна ошибка - нейтрализует предыдущую.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как сделать кнопки плоскими?

Сообщение iGrok » 20.03.2009 (Пт) 0:15

jangle писал(а):
iGrok писал(а):Теперь понятно, откуда ноги растут?


Однако, код работает. Кнопка из обычной становится плоской. Пусть даже и не совсем корректным способом.
Видимо это тот случай, когда одна ошибка - нейтрализует предыдущую.

Ага. Нивелирование ошибок не исключено.. Только разве это хорошо?

Когда за код возьмётся другой человек (или тот же, после прочтения пары умных книг), и исправит одну из очевидных ошибок, проявится вторая.
А если это произойдёт в достаточно крупном проекте, поиск второй ошибки может оказаться существенно сложнее, чем сейчас.
label:
cli
jmp label

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Как сделать кнопки плоскими?

Сообщение jangle » 20.03.2009 (Пт) 0:35

Ага. Нивелирование ошибок не исключено.. Только разве это хорошо?


Это плохо. Ну главное, что HBasic получил все таки ответ на свой вопрос. Даже мой пусть неправильный пост, все таки побудил большое количество народу написать сюда. И правильное решение было в конце-концов найдено

HBasic
Новичок
Новичок
 
Сообщения: 49
Зарегистрирован: 01.03.2009 (Вс) 21:53

Re: Как сделать кнопки плоскими?

Сообщение HBasic » 20.03.2009 (Пт) 6:47

jangle писал(а):
Хакер писал(а):Хакера раздражают твои попытки протолкнуть какую-нибудь дрянь. Например ExitProcess.


В отличие от тебя, я дал человеку правильный ответ на его вопрос. Он спрашивал, как из обычной кнопки сделать плоскую.

Воспользовался вашим советом-работает и не глючит, спасибо.
Только оказалось, что заказчику нужны неплоские кнопки, а нужно так, чтобы они были не кнопками а рисунками, при подводе курсора к которым у них очерчиваються границы, а при нажатии меняеться цвет фона.Придеться делать вручную.Избаловали их этим дизайном, блин.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Как сделать кнопки плоскими?

Сообщение jangle » 20.03.2009 (Пт) 7:59

HBasic писал(а):Воспользовался вашим советом-работает и не глючит, спасибо.
Только оказалось, что заказчику нужны неплоские кнопки, а нужно так, чтобы они были не кнопками а рисунками, при подводе курсора к которым у них очерчиваються границы, а при нажатии меняеться цвет фона.Придеться делать вручную.Избаловали их этим дизайном, блин.


Это также несложно сделать, для создания кнопок-рисунков, которые приподнимаются когда к ним подводишь курсор (как в IE)
можно использовать обычный ToolBar

След.

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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 46

    TopList  
cron