Моя Статья
Чего?
Нестандартная форма.
Первое что бросается в глаза, когда первый раз используешь программу это конечно же её облик, внешний вид. Есть вероятность что если пользователю не понравится внешний вид окна, то он не будет пользоваться продуктом. Значит нам, не побоюсь этого слова, программистам нужно как можно лучше, удобнее, понятнее, красивее и приветливее сделать лицо программы. Нужно как можно эффектнее преподнести программу.
С самого первого появления Windows окна получили прямоугольный стандарт и все User Control’ы ( кнопки, textbox, PictureBox, и др.) тоже не ушли от этого. Уже более 10 лет господствуют эти стандарты, мне кажется нужно вступать в новое, нестандартное поколение окон.
Ну что ж, так как в Visual Basic нет специальной функции для создания «кривых» форм, придётся использовать API функции. С их помощью мы сможем делать даже прозрачные и полупрозрачные окна.
Ну что нужно начинать.
Сначала опишем функции и константы:
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
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 SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
Const LWA_COLORKEY = &H1
Const LWA_ALPHA = &H2
Const GWL_EXSTYLE = (-20)
Const WS_EX_LAYERED = &H80000
А теперь самое интересное мы сделаем форму «кривой» с помощь прозрачного цвета, в его роли будет выступать белый(если нужно, можно сделать и другой).
Private Sub Form_Load()
Dim Ret As Long
Ret = GetWindowLong(Me.hwnd, GWL_EXSTYLE)
Ret = Ret Or WS_EX_LAYERED
SetWindowLong Me.hwnd, GWL_EXSTYLE, Ret
SetLayeredWindowAttributes Me.hwnd, vbWhite, 0, LWA_COLORKEY
End Sub
Ret = GetWindowLong(Me.hwnd, GWL_EXSTYLE) В этой строке мы определяем форму с которой будем работать.
SetLayeredWindowAttributes Me.hwnd, vbWhite, 0, LWA_COLORKEY В этой строке мы удаляем, делаем прозрачным белый цвет.
Теперь просто вставляем на форму заранее нарисованую картинку, где белые места там прозначное место на форме.
Теперь сделаем форму полупрозрачной.
Будем использовать теже самые API.
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
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 SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
Const LWA_COLORKEY = &H1
Const LWA_ALPHA = &H2
Const GWL_EXSTYLE = (-20)
Const WS_EX_LAYERED = &H80000
Private Sub Form_Load()
Dim Ret As Long
Ret = GetWindowLong(Me.hwnd, GWL_EXSTYLE)
Ret = Ret Or WS_EX_LAYERED
SetWindowLong Me.hwnd, GWL_EXSTYLE, Ret
SetLayeredWindowAttributes Me.hwnd, 0, 125, LWA_ALPHA
End Sub
SetLayeredWindowAttributes Me.hwnd, 0, 125, LWA_ALPHA В этой строчке мы делаем форму полупрозрачной. Параметр 125 отвечает за уровень прозрачности(от 0 до 255).
Ещё можно сделать форму по контуру текста.
Вот так.
Описываем функции
Private Declare Function BeginPath Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function EndPath Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function PathToRegion Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Private Const RGN_COPY = 5
Private Sub Form_Load()
Const Text = "IpatovSoft"
Dim hRgn As Long
Font.Name = "Times New Roman"
Font.Italic = True
Font.Size = 50
Width = TextWidth(Text)
Height = TextHeight(Text)
BeginPath hdc
Print Text
EndPath hdc
hRgn = PathToRegion(hdc)
SetWindowRgn hWnd, hRgn, False
End Sub
Вот так.
Наверняка есть ещё много способов сделать нестандартную форму.
Это один из множества примеров создания более привлекательного интерфейса, я думаю Вы и сами придумаете много способов как сделать «лицо программы» более приветливым.
Значит нам, не побоюсь этого слова, программистам...
:D
Для тебя это слово является матерным или наоборот святым?
Не поминай програмиста всуе!
С самого первого появления Windows окна получили прямоугольный стандарт и все User Control’ы ( кнопки, textbox, PictureBox, и др.) тоже не ушли от этого. Уже более 10 лет господствуют эти стандарты, мне кажется нужно вступать в новое, нестандартное поколение окон.
Как ты думаешь, давно в Windows появилась возможность создания нестандартных окон? Как ты думаешь, никто до тебя их не создавал?
А теперь подумай, почему же тогда окна остались теми же окнами уже не 10, а более 20 лет, а если расматривать концепт, а не реализацию, то уже более 40 лет?
Да потому, что стандартный интерфейс удобнее для освоения, для интуитивного понимания.
Это один из множества примеров создания более привлекательного интерфейса, я думаю Вы и сами придумаете много способов как сделать «лицо программы» более приветливым.
Поэтому необычный - ещё не значит привлекательный, и уж тем более не значит "более приветливый".
Статей и HowTo на эту тематику море, в т.ч. и на VB.
А что нового твоя записка, которую ты именуешь "статьей", доводит до читателя?
... нужно как можно лучше, удобнее, понятнее, красивее и приветливее ...
Особенно удачно получается у тебя использование прилагательных в превосходной степени - только обязательно добавь - мягче, легче, выше, дальше и страннее :) - от этого мысли, не побоюсь этого слова, программистов - станут глубже и длиннее. :)
За публикацию статьи в этом форуме, а?
Ну чего уели - я наоборот поддержал - даже предложил расширить информационное поле - читать реп. А чего, почему например на остросоциальные(или про любоф) темы можно там песни петь и реп читать, а на столь актуальную тему кривых форм (тем более что пользователю сразу станет понятно, каковы руки у, не побоюсь этого слова, программиста) нет ничего подобного? :)
А про бабки так это squirL - ну так а шо вы хотели? Кому сейчас легко? У меня например так копеечки не будет, так я без статей сижу, хоть каждый день шли, так а шо - если ты такой умный так чего ж такой бедный ;)
IpatovSoft, ты описываешь уже давно известные, не раз разжеванные вещи. И излагать их ещё раз не имеет смысла.
НО! Пользуясь изложенным тобой материалом, как достижение какой либо более широкой цели, ты можешь представить на общее обозрение более серьезный и основательный труд.
К примеру. Как я уже говорил, окна остаются окнами на протяжении десятков лет. Почему? Почему новые нестандартные решения отмирают так и не найдя широкого применения? Каким должно быть окно, что бы быть удобным и понятным? Чем не тема для изучения? В принципе это тема для докторской диссертации, что-то типа "Эргономика графических пользовательских интерфейсов". Но можно сделать некоторые шаги в этом направлении.
Или другая тема: как создать (быстро, автоматически) нестандартный интерфейс на базе некоторого шаблона (например, альфа-канала)? Не беда, что на эту тему тоже есть уже информация и даже программные продукты. Может, ты сможешь аккумулировать различные подходы и/или предложить что-то новое.
интересными темами.Даже сказано какими конкретно,для примера.Если так сложилось,что окна должны быть прямоугольными - то не пытайся устроить революцию в эргономике.
Навряд ли она увенчается успехом.Т.е. получается что ты не только "изобретаешь велосипед",но еще и выполняешь при этом "сизифов труд".
Стандартные формы - прошли проверку временем,не мы их придумали и не нам их отменять.
Могу сказать о себе лично - когда я вижу нестандартную форму(допустим ромбовидное окно овальные или квадратные кнопки) - я теряюсь,мне хочется поскорее ее закрыть.Даже не могу обьяснить почему.:)
почему автомобили прямоугольные при взгляде сверху ?
потому что у большинства людей психология такая - проще образно думать с помощью прямоугольников и эллипсов ( квадрат и круг ) чем как то ещё ) . можно ассоциировать криволинейные элементы с какими то общеизвестными объектами , но это сложно .
IMHO ты путаешь причину и следствие.