Пользовательские смайлы

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Пользовательские смайлы

Сообщение Ruslan Demidow » 01.10.2004 (Пт) 13:07

У меня возник вопрос, который для меня пока остаётся нерешаемым.
Может быть уважаемые участники форума подскажут.
Итак. Моя программа использует смайлы в тексте сообщения.
Смайлы вставляются вместо мнемонических сокращений ( :-), ;-) , :-)), 8-0 и т.п.).
До недавнего времени я данные смайлы хранил в ImageList. Оттуда их вытаскивал и вставлял. Но захотелось мне (пользователям тоже) иметь в программе настраиваемое отображение смайлов.
Сначала я сделал поддержку пользовательских смайлов на основе подкаталогов: при запуске программа ищет в своём каталоге подкаталог Smailes. Если находит то все каталоги в Smailes принимаются как наборы смайлов. В этих каталогах находятся ico-файлы со смайлами. При выборе в списке одного из наборов в ImageList загружаются смайлы из данного каталога.
Таким образом я добился того, что пользователь может создать несколько своих наборов со смайлами и менять их в ходе работы программы. Но....
Как-то неаккуратно у меня это получается. Хочется ещё добавить и настраиваемые мнемоники смайлов. Т.е. чтобы пользователь мог в настройках программы, скажем, добавить своё сокращение (например :-/ ) и назначить ему номер изображения (у меня пока изображения в каталогах просто пронумерованы).
Сокращения храятся у меня в программе (пока) в виде массива.
Но вот не могу продумать: как связать пользовательские сокращения и изображения смайлов, где хранить информацию о связи. Ведь негоже пользователю смотреть "Какой там файл у нас с улыбкой?", а потом его номер проставлять в соответствие с сокращением.
Может быть кто-нибудь уже изобретал такой велосипед? За подсказки, предложения и просто мысли и идеи буду очень признателен.
Спасибо за внимание.
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

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

Сообщение alibek » 01.10.2004 (Пт) 14:35

#T=:)
#F=smile1.gif
...
Lasciate ogni speranza, voi ch'entrate.

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 01.10.2004 (Пт) 15:10

alibek писал(а):#T=:)
#F=smile1.gif
...

Т.е. простой текст?
Пользователь берёт и создаёт простой текстовик с текстом как ты показал?
А считывать простым Open?
Но это получится, что пользователь будет настраивать смайлы не в моей программе, а в Блокноте. Ну, вернее, хочу сделать настройку смайлов в программе. И получится как-то не так - для всех настроек - Options Window, а для смайлов - вручную в Блокноте.
Хотя за мысль спасибо. Продумаю.
Вот ещё подумалось - пользователь ведь может подсунуть кроме ico ещё и gif, jpeg и т.п.
Нашёл здесь пример вытаскивания иконки из файла в Picture. Но что-то не разберусь никак. Хочу не в Picture, а в ImageList.
Чтобы какие размеры ни были бы у картинки - брались бы только иконки одного размера.
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

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

Сообщение alibek » 01.10.2004 (Пт) 15:15

Ну прикрути к этому файлу красивый интерфейс.
В &RQ сделано похоже и ничего, все довольны.
Lasciate ogni speranza, voi ch'entrate.

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 01.10.2004 (Пт) 15:45

alibek писал(а):Ну прикрути к этому файлу красивый интерфейс.
В &RQ сделано похоже и ничего, все довольны.
Ок. Спасибо за помощь. :)

Ещё вопросик:
Dim pic As StdPicture, не является в прямом смысле обычной картинкой?
Т.е. как из него загрузить картинку через LoadPicture?
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

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

Сообщение tyomitch » 01.10.2004 (Пт) 15:57

Ruslan Demidow писал(а):Dim pic As StdPicture, не является в прямом смысле обычной картинкой?
Т.е. как из него загрузить картинку через LoadPicture?

Зачем загружать? Просто Set Picture1.Picture = pic
Изображение

klop086
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 88
Зарегистрирован: 30.01.2004 (Пт) 8:46
Откуда: Москва

Сообщение klop086 » 01.10.2004 (Пт) 15:58

Если тебе нужно загрузить картинку, скажем, в picturebox , то просто пишешь:

Picture1.Picture=VB.LoadPicture Путь_к_файлу

и картинка появится в твоём Box.

И, кстати, - лучше просто создать в реестре папку, в которую будешь помещать навания *.ico и их сокращения. Просто с файлами геморой - разделять надо и т.д. А так просто залез в реестр, при загрузке, и поместил имя в одну переменную, а значение в другую.
Сначала подумай, потом помолчи.

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 01.10.2004 (Пт) 16:34

tyomitch писал(а):
Ruslan Demidow писал(а):Dim pic As StdPicture, не является в прямом смысле обычной картинкой?
Т.е. как из него загрузить картинку через LoadPicture?

Зачем загружать? Просто Set Picture1.Picture = pic

Ясно.
В общем вот в чём вопрос.
Нашёл в статьях.
Код: Выделить всё
Private Declare Function ExtractAssociatedIcon Lib "shell32.dll" Alias _
           "ExtractAssociatedIconA" (ByVal hInst As Long, _
           ByVal lpIconPath As String, lpiIcon As Long) As Long

Private Declare Function DrawIcon Lib "user32" (ByVal hDC As Long, _
            ByVal X As Long, ByVal Y As Long, ByVal hIcon As Long) As Long

Private Declare Function DestroyIcon Lib "user32" _
                                           (ByVal hIcon As Long) As Long

Private Type RECT
   Left As Long
   Top As Long
   Right As Long
   Bottom As Long
End Type

'Разные Функции

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 Const SRCCOPY = &HCC0020
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hDC 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 SelectObject Lib "gdi32" (ByVal hDC As Long, ByVal hObject As Long) As Long

Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long

Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long

Private Declare Function CloseClipboard Lib "user32" () As Long

Private Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As Long) As Long

Private Declare Function EmptyClipboard Lib "user32" () As Long

Private Const CF_BITMAP = 2

Private Sub Command1_Click()
CD1.ShowOpen 'Открываем Брауз
Text1.Text = CD1.FileName 'Присваеваем Тексту Путь и Имя Файла
Picture1.Cls 'Очищаем Картинку От Старой Иконки
Dim sPath As String, hIcon As Long, nIcon As Long 'Присваеваем Переменные
sPath = Text1.Text 'Берем путь из Текста
hIcon = ExtractAssociatedIcon(App.hInstance, sPath, nIcon) 'Забираем Верхнюю Иконку
DrawIcon Picture1.hDC, 0&, 0&, hIcon 'Вставляем иконку в PictureBox
DestroyIcon hIcon 'Берём Иконку
CopyEntirePicture Picture1 'Вставляем иконку в буфер обмена.
'Теперь Можно Вставлять Иконку Хоть Куда
End Sub

'Функция Тута (Копирование Рисунка)
Public Function CopyEntirePicture(ByRef objFrom As Object) As Boolean
Dim lhDC As Long
Dim lhBMP As Long
Dim lhBMPOld As Long
Dim lWidthPixels As Long
Dim lHeightPixels As Long

lhDC = CreateCompatibleDC(objFrom.hDC)
If (lhDC <> 0) Then
     lWidthPixels = objFrom.ScaleX(objFrom.ScaleWidth, objFrom.ScaleMode, vbPixels)
     lHeightPixels = objFrom.ScaleY(objFrom.ScaleHeight, objFrom.ScaleMode, vbPixels)
     lhBMP = CreateCompatibleBitmap(objFrom.hDC, lWidthPixels, lHeightPixels)
   If (lhBMP <> 0) Then
      lhBMPOld = SelectObject(lhDC, lhBMP)
      BitBlt lhDC, 0, 0, lWidthPixels, lHeightPixels, objFrom.hDC, 0, 0, SRCCOPY
      SelectObject lhDC, lhBMPOld
      OpenClipboard 0
      EmptyClipboard
      SetClipboardData CF_BITMAP, lhBMP
      CloseClipboard
   End If
DeleteObject lhDC
End If
End Function


На форме Кнопка (Command1), Пикчербокс (Picture1), ТекстБокс (Text1) и CommonDialog контрол (CD1).
Всё это работает на ура.
Вроде бы всё просто и поянтно. Вытаскивает иконку из любого файла.
А вот как эту иконку загнать в ImageList?
Бьюсь уже бог знает сколько времени! :cry:
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 01.10.2004 (Пт) 16:37

klop086 писал(а):Если тебе нужно загрузить картинку, скажем, в picturebox , то просто пишешь:

Picture1.Picture=VB.LoadPicture Путь_к_файлу

и картинка появится в твоём Box.

Это я знаю.
И, кстати, - лучше просто создать в реестре папку, в которую будешь помещать навания *.ico и их сокращения. Просто с файлами геморой - разделять надо и т.д. А так просто залез в реестр, при загрузке, и поместил имя в одну переменную, а значение в другую.

Хочется сделать программу мобильной, а независящей от реестра конкретной машины. Т.е. скопировал каталог программы на сидюк и можешь быть спокоен, что на любой другой машине она запустится и не нужно будет ничего заново настраивать. А экспорт/импорт reg-файлов не годится.
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

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

Сообщение tyomitch » 01.10.2004 (Пт) 17:29

Ruslan Demidow писал(а):На форме Кнопка (Command1), Пикчербокс (Picture1), ТекстБокс (Text1) и CommonDialog контрол (CD1).
Всё это работает на ура.
Вроде бы всё просто и поянтно. Вытаскивает иконку из любого файла.
А вот как эту иконку загнать в ImageList?
Бьюсь уже бог знает сколько времени! :cry:

Попробуй мой код, который не требует PictureBox-ов и не портит буфер обмена: http://bbs.vbstreets.ru/viewtopic.php?p=61175#61175
Функция CreatePictureFromIcon возвращает StdPciture, который потом можно клать куда угодно.
Изображение

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 01.10.2004 (Пт) 18:17

tyomitch писал(а):
Ruslan Demidow писал(а):На форме Кнопка (Command1), Пикчербокс (Picture1), ТекстБокс (Text1) и CommonDialog контрол (CD1).
Всё это работает на ура.
Вроде бы всё просто и поянтно. Вытаскивает иконку из любого файла.
А вот как эту иконку загнать в ImageList?
Бьюсь уже бог знает сколько времени! :cry:

Попробуй мой код, который не требует PictureBox-ов и не портит буфер обмена: http://bbs.vbstreets.ru/viewtopic.php?p=61175#61175
Функция CreatePictureFromIcon возвращает StdPciture, который потом можно клать куда угодно.

Спасибо, Артём. Посмотрю.
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

klop086
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 88
Зарегистрирован: 30.01.2004 (Пт) 8:46
Откуда: Москва

Сообщение klop086 » 02.10.2004 (Сб) 12:17

От того, что ты будешь работать с реестром - твоя прога мобильность не потеряет. Просто добавляешь в форм лоад проверку на созданность этой самой папки и всё.
Сначала подумай, потом помолчи.

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

Сообщение tyomitch » 02.10.2004 (Сб) 12:38

Потеряет-потеряет. Представь, человек насоздавал сотню смайлов, а потом переустановил Винду. И придётся ему заново их все создавать, потому что реестр весь потёрся.
Изображение

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 02.10.2004 (Сб) 14:35

В общем пока сделал так: подкаталоги. Каждый из них содержит определённый набор смайлов.
Файлы со смайлами пронумерованы. В программе каждый каталог в Smailes отображается как набор смайлов. При выборе в комбобоксе одного из наборов, я в ImageList загоняю все файлы из данного каталога. Соответствие смайлов сокращениям пользователя пока ещё не реализовал. Сокращения пока прописаны в программе. Нужно будет только, как написал alibek, прикрутить красивый интерфейс.
Заботу о размерах изображений в файлах возложу на пользователя. У меня готовы три набора смайлов (16х16,20х20,24х24). Захочет больше - пусть валяет.
Заметил правда одну особенность - в ImageList нельзя загнать иконку с 32-битным цветом, с 24 битным без проблем.
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

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

Сообщение tyomitch » 02.10.2004 (Сб) 17:04

Ruslan Demidow писал(а):Заметил правда одну особенность - в ImageList нельзя загнать иконку с 32-битным цветом, с 24 битным без проблем.

О!
Так получилось, что мне именно это сейчас интересно.
Какие бывают иконки?
Я видел 1bpp, 4bpp, 8bpp, и 32bpp в WinXP (с альфа-каналом).
Про существование 24bpp иконок я слышал, но не видел ни одной. Не кинешь парочку? :-)
Бывают ли 2bpp и/или 16bpp иконки?
Бывают ли иконки с "инвертированием" (формат ICO это вроде поддерживает)
Бывают ли иконки с альфа-каналом, кроме 32bpp?
Вывают ли ещё иконки, кроме уже названных?
Надеюсь, кто-то всё это знает и мне поможет :-)
Изображение

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 03.10.2004 (Вс) 11:27

tyomitch писал(а):
Ruslan Demidow писал(а):Заметил правда одну особенность - в ImageList нельзя загнать иконку с 32-битным цветом, с 24 битным без проблем.

О!
Так получилось, что мне именно это сейчас интересно.
Какие бывают иконки?
Я видел 1bpp, 4bpp, 8bpp, и 32bpp в WinXP (с альфа-каналом).
Про существование 24bpp иконок я слышал, но не видел ни одной. Не кинешь парочку? :-)

Насколько я понял, то 24 бита - это True Color, а 32 бита - True Color +Альфа.


Бывают ли 2bpp и/или 16bpp иконки?
Бывают ли иконки с "инвертированием" (формат ICO это вроде поддерживает)
Бывают ли иконки с альфа-каналом, кроме 32bpp?
Вывают ли ещё иконки, кроме уже названных?
Надеюсь, кто-то всё это знает и мне поможет :-)
Вложения
Squareheads 24x24.rar
(1.83 Кб) Скачиваний: 24
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

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

Сообщение tyomitch » 03.10.2004 (Вс) 14:10

Ruslan, thx! :-)
Изображение

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 03.10.2004 (Вс) 17:07

tyomitch писал(а):Ruslan, thx! :-)

Да на здоровье! :)
Для хорошего человека не жалко.
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

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

Сообщение tyomitch » 03.10.2004 (Вс) 18:53

Мне дали задание - написать смотрелку иконок (естественно, не пользуясь LoadPicture и всем таким - парсить всё самому). Большей частью она уже готова; во вторник сдам её, а потом кину сюда. Ждите с нетерпением :-)

Как бонус, она ещё может расковыривать ресурсы NE- и PE-файлов - опять же, сама и без помощи стандартных функций. \m/

[edit]залито сюда: http://bbs.vbstreets.ru/viewtopic.php?t=10156 [/edit]
Изображение


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

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

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

    TopList