Gradient Button

Обсуждение проектов наших жителей.
Вы можете выставить проект на тест или найти помощников для его реализации.

Модератор: BV

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Gradient Button

Сообщение 13GHOST » 21.01.2005 (Пт) 11:37

Вот кнопку сделал, по-моему неплохо получилось, но хотелось бы услышать ваше мнение 8) .
У вас нет доступа для просмотра вложений в этом сообщении.

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

Сообщение alibek » 21.01.2005 (Пт) 11:47

Хм... А зачем в UserControl два PictureBox?
Можно обойтись одним только UserControl.

Кроме того, попробуй увеличить кнопку хотя бы до размеров фрейма. Тормозит она уж очень.
Lasciate ogni speranza, voi ch'entrate.

Александр80
Bonachón
Bonachón
 
Сообщения: 659
Зарегистрирован: 20.03.2004 (Сб) 23:50
Откуда: г.Москва

Сообщение Александр80 » 21.01.2005 (Пт) 18:41

13GHOST, мне понравилось... Красиво... :lol:

Но на самом деле тормозит, при увеличении размера... :cry:
13GHOST, Вы мододец! :lol: :cry:

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Сообщение 13GHOST » 21.01.2005 (Пт) 21:18

Да уж действительно в скорость оставляет желать лучшего - еще бы ей же постоянно приходится перерисовывать кнопку. Подумать надо - может найдется способ сделать её побыстрее. Может кто-нибудь знает как? Над скоростью я еще не работал.
Два picture box'а я сделал затем, чтобы невидно было линии при перерисовки кнопки. Т.е. контрол сначало рисует в первом (невидимом), а только потом сразу же переносит это на второй, т.е. один pic является как бы буфером. Может быть можно было сделать подругому, но я так придумал.

Faust
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 649
Зарегистрирован: 29.12.2003 (Пн) 13:38
Откуда: лаборатория

Сообщение Faust » 22.01.2005 (Сб) 2:26

13GHOST писал(а):Может быть можно было сделать подругому

Каждый ВБ программер в своей жизни должен сделать 3 вещи: игрушку, кнопку и калькулятор. :) И хотя кнопок подобных хотя бы на том же vbrussian валом, но каждый вкладывает в них свою душу, порождает кучу уникальных багов, изобретая инкарнацию велосипеда...
Да, перед тем, как переключится в IDE писать Anarchist's Button напишу то, ради чего, собственно, решил ответить: для повышения быстродействия юзай не второй Picture, а API-функции для работы с DC в памяти. Что-то вроде:
Код: Выделить всё
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function SetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long) As Long
'объявляем всё, что нужно
Dim mDC As Long, mBitmap As Long, W As Long, H As Long, X As Long, Y As Long
'где-то в начале:
    W=100 'ширина
    H=100 'высота
    mDC = CreateCompatibleDC(GetDC(0))
    mBitmap = CreateCompatibleBitmap(GetDC(0),W,H)
    SelectObject mDC, mBitmap
'потом рисуем в нём что-нибудь
    For X=0 to W
    For Y=0 to H
    SetPixel mDC, X, Y, X+Y
    Next Y
    Next X
'копируем в кнопку
    BitBlt Picture1.hdc,0, 0, W, H, mDC, 0, 0, vbSrcCopy
'уходя - гасите свет!
    DeleteDC mDC
    DeleteObject mBitmap
Листинги не горят!

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

Сообщение tyomitch » 22.01.2005 (Сб) 8:07

Faust писал(а):
Код: Выделить всё
'потом рисуем в нём что-нибудь
    For X=0 to W
    For Y=0 to H
    SetPixel mDC, X, Y, X+Y
    Next Y
    Next X
'копируем в кнопку
    BitBlt Picture1.hdc,0, 0, W, H, mDC, 0, 0, vbSrcCopy

Не устаю напоминать, что для попиксельной отрисовки лучше и быстрее создание картинки в двумерном массиве и затем SetDIBitsToDevice - при этом даже не нужно создавать свой DC.
Изображение

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Сообщение 13GHOST » 22.01.2005 (Сб) 8:57

Все круто - работает гораздо быстрее, но теперь возникает проблема с надписью, которая находится в этом самом Picture

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Сообщение 13GHOST » 22.01.2005 (Сб) 9:38

Сорри, все ok. Вот новая версия - более быстрая. Кстати если откомпилировать то еще быстрее будет.
У вас нет доступа для просмотра вложений в этом сообщении.

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

Сообщение tyomitch » 22.01.2005 (Сб) 10:23

13GHOST писал(а):Сорри, все ok. Вот новая версия - более быстрая. Кстати если откомпилировать то еще быстрее будет.

А вот - сравни - то же, но без левых DC и без SetPixel-а ;-)

(чтобы не подумали плохого, предупрежу: GDI+ там нет ;-))
У вас нет доступа для просмотра вложений в этом сообщении.
Изображение

Mongoose
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 29.03.2004 (Пн) 17:03
Откуда: Московский зоопарк

Сообщение Mongoose » 22.01.2005 (Сб) 12:26

2 tyomitch
VB: программа выполнила недопустимую операцию и будет закрыта...
при изменении размеров кнопки на весь экран (1280*1024)
I Wish I Had An Angel For One Moment Of Love.

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Сообщение 13GHOST » 22.01.2005 (Сб) 12:33

tyomitch писал(а): А вот - сравни - то же, но без левых DC и без SetPixel-а ;-)

Да неплохо, вот только глюконат с цветами - делаешь красный появляется синий и наоборот

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

Сообщение tyomitch » 22.01.2005 (Сб) 13:43

Mongoose писал(а):2 tyomitch
VB: программа выполнила недопустимую операцию и будет закрыта...
при изменении размеров кнопки на весь экран (1280*1024)

А с оригинальным контролом от 13GHOST разве не так же?
Изображение

Faust
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 649
Зарегистрирован: 29.12.2003 (Пн) 13:38
Откуда: лаборатория

Сообщение Faust » 22.01.2005 (Сб) 17:19

tyomitch писал(а):
Faust писал(а):
Код: Выделить всё
'потом рисуем в нём что-нибудь
    For X=0 to W
    For Y=0 to H
    SetPixel mDC, X, Y, X+Y
    Next Y
    Next X
'копируем в кнопку
    BitBlt Picture1.hdc,0, 0, W, H, mDC, 0, 0, vbSrcCopy

Не устаю напоминать, что для попиксельной отрисовки лучше и быстрее создание картинки в двумерном массиве и затем SetDIBitsToDevice - при этом даже не нужно создавать свой DC.

Благодарствую! Как раз попиксельные картинки мне приходится рисовать чаще всего. Век живи -век учись!
Листинги не горят!

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Сообщение 13GHOST » 22.01.2005 (Сб) 20:27

Mongoose писал(а):2 tyomitch
VB: программа выполнила недопустимую операцию и будет закрыта...
при изменении размеров кнопки на весь экран (1280*1024)

Еще бы! Я бы удивился если было бы по-другому :)

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 22.01.2005 (Сб) 23:35

Для ускорения прорисовки предлагаю использовать обьекты Shape размером 1x1 с нужным цветом, которые нужно подгружать на весь размер кнопки при изменении размера.
:) :) :) :) :) :) :) :) :) :) :) :) :) :) :)
Все права защищены. При использовании идеи указывать ссылку на меня.

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Сообщение 13GHOST » 23.01.2005 (Вс) 8:50

|kerish| писал(а):Для ускорения прорисовки предлагаю использовать обьекты Shape размером 1x1 с нужным цветом, которые нужно подгружать на весь размер кнопки при изменении размера.

Чё-то не догнал. Может покажешь на примере :)

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

Сообщение tyomitch » 23.01.2005 (Вс) 9:33

|kerish| писал(а):Для ускорения прорисовки предлагаю использовать обьекты Shape размером 1x1 с нужным цветом, которые нужно подгружать на весь размер кнопки при изменении размера.
Не верю, что от этого выйдет ускорение.
Изображение

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 29.01.2005 (Сб) 14:47

Что-то у вас нет чувства юмора. :(


Вернуться в Наши проекты

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

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

    TopList