Ico в BMP -- новые разработки для Кащея

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

Ico в BMP -- новые разработки для Кащея

Сообщение netdemon » 06.04.2009 (Пн) 18:34

Подскажите как преоьразовать ICO в BMP?

Есть задача достать иконки из EXE шек это работает и даже в picture box рисуются. Но теперь надо их преобразовать в BMP 13x13 и запихнуть в менюшку. :cry:

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

retval = DrawIconEx(frmBar.pic.hdc, 0, 0, glSmallIcons, SMALL_ICON, SMALL_ICON, 0, 0, DI_NORMAL)
frmBar.pic.Refresh

как это связать с вот этим:

SetMenuItemBitmaps hMenu, hID, MF_BITMAP, frmBar.pic.Picture, frmBar.pic.Picture

Иконка 16x16



Лишь разум потерянный бесповоротно мною. Наполнить может сердце мне тоской.
Нельзя обнять необъятное и впихнуть невпихуемое.

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

Re: ico в BMP

Сообщение iGrok » 06.04.2009 (Пн) 19:10

А что, собственно, не получается?
label:
cli
jmp label

netdemon
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 179
Зарегистрирован: 04.09.2007 (Вт) 15:51

Re: ico в BMP

Сообщение netdemon » 06.04.2009 (Пн) 20:14

собственно не могу сообразить как програмным методом преобразовать ICO в BMP.
Вот процедуры. так проще понять.

Код: Выделить всё
Public Function GetIco(sfile As String)

  Dim hIcon As Long  ' Дескриптор к функции, полученный от исполняемого файла
  Dim retval As Long  ' возвращаемое значение
 
  Dim sexe As String
 

' Извлекаем первый значок из заданного файла

   sexe = getLnk(sfile)
   Debug.Print sexe
   hIcon = ExtractIconEx(sexe, -1, 0, 0, 0) ' количество иконок так для проверки
   hIcon = ExtractIconEx(sexe, 0, 0, glSmallIcons, 1)
   hdl = CreateCompatibleDC(frmBar.pic.hdc)
frmBar.pic.Picture = LoadPicture("")
   retval = DrawIconEx(frmBar.pic.hdc, 0, 0, glSmallIcons, SMALL_ICON, SMALL_ICON, 0, 0, DI_NORMAL)
frmBar.pic.Refresh
   
retval = DestroyIcon(hIcon)


End Function


Иконки успешно грузятся в picturebox :)
А так меню создаю. Тут из file list box берутся имена ярлыков к программам.
Код: Выделить всё
Public Function CreatePpopupMenu(frm As Form, spath As String, lp As POINTAPI)

   Dim hMenu As Long
   Dim result As Long
   Dim i As Integer
   Dim stemp As String
   Dim hID As Long
   
     hMenu = CreatePopupMenu()
     frm.lFile.Path = spath
     frm.lFile.ListIndex = 0
    For i = 0 To frm.lFile.ListCount - 1
      frm.lFile.ListIndex = i
      stemp = frm.lFile.FileName
      result = AppendMenu(hMenu, MF_STRING, 300 + i, Mid$(stemp, 1, Len(stemp) - 4))
      hID = GetMenuItemID(hMenu, i)
      stemp = frm.lFile.Path & "\" & frm.lFile.FileName
      GetIco stemp
      SetMenuItemBitmaps hMenu, hID, MF_BITMAP, frm.pic.Picture, frm.pic.Picture
    Next i
   
   
   
   TrackPopupMenu hMenu, TPM_LEFTALIGN, lp.x, lp.y, 0, frm.hWnd, ByVal 0&
   DelMenu hMenu
   
End Function


А так находятся пути к exe шкам через ярлыки.
Код: Выделить всё
Public Function getLnk(sname As String) As String


Dim myFSO As Object
Dim myFL, sfilePath
Set myFSO = CreateObject("WScript.Shell")
Set myFL = myFSO.CreateShortCut(sname)
sfilePath = myFL.TargetPath


Set myFSO = Nothing
Set myFL = Nothing
getLnk = sfilePath
End Function
Вложения
1.jpg
1.jpg (158.62 Кб) Просмотров: 2655
Лишь разум потерянный бесповоротно мною. Наполнить может сердце мне тоской.
Нельзя обнять необъятное и впихнуть невпихуемое.

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

Re: ico в BMP

Сообщение iGrok » 06.04.2009 (Пн) 20:31

netdemon писал(а):собственно не могу сообразить как програмным методом преобразовать ICO в BMP.


Если точнее, тебе нужно из хэндла иконки hIcon получить хэндл битмапа hBitmap. Так? А точно не срабатывает, если SetMenuItemBitmaps подсунуть не hBitmap а hIcon ?

Можно так:
Создать битмап (hBitmap = CreateCompatibleBitmap(...))
Далее выбрать его на твой picturebox, сохранив старый (hOldBitmap = SelectObject( pic.hdc, hBitmap))
Отрисовать туда иконку (DrawIconEx(...))
Вернуть на место старый битмап в picturebox (SelectObject( pic.hdc, hOldBitmap))

В итоге в hBitmap у тебя искомый битмап...

З.Ы.: А вообще, вот:
Код: Выделить всё
void LoadIconAsBmp(CBitmap *pBmp, UINT nID)
{
ASSERT(pBmp);

CDC *pDC = GetWindowDC();
ASSERT(pDC);

CDC aMemDC;
aMemDC.CreateCompatibleDC(pDC);

HICON hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(nID));
ASSERT(hIcon);

pBmp->CreateCompatibleBitmap(&aMemDC, 32, 32);
aMemDC.SelectObject(pBmp);

DrawIcon(aMemDC, 0, 0, hIcon);
}
label:
cli
jmp label

netdemon
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 179
Зарегистрирован: 04.09.2007 (Вт) 15:51

Re: ico в BMP

Сообщение netdemon » 06.04.2009 (Пн) 20:47

Код: Выделить всё
hBitmap = CreateCompatibleBitmap(0, 13, 13)
    hOldBitmap = SelectObject(frmBar.pic.hdc, hBitmap)
    retval = DrawIconEx(frmBar.pic.hdc, 0, 0, glSmallIcons, SMALL_ICON, SMALL_ICON, 0, 0, DI_NORMAL)
    SelectObject frmBar.pic.hdc, hOldBitmap
    frmBar.pic.Refresh


не помогло.
Лишь разум потерянный бесповоротно мною. Наполнить может сердце мне тоской.
Нельзя обнять необъятное и впихнуть невпихуемое.

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

Re: ico в BMP

Сообщение arthur2 » 06.04.2009 (Пн) 21:28

нужно использовать свойство не .picture а .image (или сначала загрузить в пикчу из имеджа) Ты рисуешь иконку на пикчебоксе, но этот рисунок попадает в свойстов .image

а вообще - правильней объявить на уровне модуля p as stdpicture, в нее грузить .image, а уже из нее грузить в меню p.handl - потому что в момент создания меню все пикчи должны где-то лежать.

сейчас внимательнее пересмотрел твой код. Тебе нужно создать массив пикчей - чтобы в момент создания меню в на каждую картинку была своя переменная.

на уровне модуля:
dim p() as stdpicture

а в цикле после getico:
set p(i)=frm.pic.image

и в меню уже p(i).handl
Артур
 
   

netdemon
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 179
Зарегистрирован: 04.09.2007 (Вт) 15:51

Re: ico в BMP

Сообщение netdemon » 06.04.2009 (Пн) 21:58

И так тоже не получается. нету свойства Image у stdPicture.
Лишь разум потерянный бесповоротно мною. Наполнить может сердце мне тоской.
Нельзя обнять необъятное и впихнуть невпихуемое.

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

Re: ico в BMP

Сообщение Хакер » 06.04.2009 (Пн) 22:05

Image это свойство типа «ссылка на IPictureDisp», а не член интерфейса IPictureDisp.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Re: ico в BMP

Сообщение arthur2 » 06.04.2009 (Пн) 22:07

image - свойство пикчебокса, на котором ты рискуешь картинку.

чтобы понять, в чем косяк, напиши в цикле после getico

Код: Выделить всё
debug.print frm.pic.picther.handl 'здесь, скорее всего, вообще чихнёт, что картинка ещё не загружена
debug.print frm.pic.image.handl

:)
Последний раз редактировалось arthur2 06.04.2009 (Пн) 22:24, всего редактировалось 1 раз.
Артур
 
   

netdemon
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 179
Зарегистрирован: 04.09.2007 (Вт) 15:51

Re: ico в BMP

Сообщение netdemon » 06.04.2009 (Пн) 22:21

Я просто не догоняю. Нет таких глубоких познаний у меня.

Код: Выделить всё
retval = DrawIconEx(.pic.hdc, 0, 0, glSmallIcons, SMALL_ICON, SMALL_ICON, 0, 0, DI_NORMAL)
    .pic.Refresh
    Call SelectObject(.pic.hdc, hOldBitmap)
    StretchBlt .pic1.hdc, 0, 0, 13, 13, .pic.hdc, 0, 0, 16, 16, &HCC0020
    .pic.Refresh
    .pic1.Refresh
     SavePicture .pic1.Image, "1.bmp"
     .pic1.Picture = LoadPicture("1.bmp")
     .pic1.Refresh


если вот так написать то показывает только последнюю картинку в меню.
Вложения
2.jpg
2.jpg (91.84 Кб) Просмотров: 2652
Лишь разум потерянный бесповоротно мною. Наполнить может сердце мне тоской.
Нельзя обнять необъятное и впихнуть невпихуемое.

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

Re: ico в BMP

Сообщение arthur2 » 06.04.2009 (Пн) 22:25

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

и нафига в файл сохранять-то? сразу присаевай пикче имедж
Артур
 
   

netdemon
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 179
Зарегистрирован: 04.09.2007 (Вт) 15:51

Re: ico в BMP

Сообщение netdemon » 06.04.2009 (Пн) 22:28

arthur2 спс. Почти получилось вот только почемуто Internet Explorer и МТС коннект менеджер теперь без картинки. Буду вылавливать.
Вложения
3.jpg
3.jpg (95.47 Кб) Просмотров: 2652
Лишь разум потерянный бесповоротно мною. Наполнить может сердце мне тоской.
Нельзя обнять необъятное и впихнуть невпихуемое.

netdemon
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 179
Зарегистрирован: 04.09.2007 (Вт) 15:51

Re: ico в BMP

Сообщение netdemon » 06.04.2009 (Пн) 22:57

Вот теперь и проги запускаются по клику.

А есть разница между таким объявлением:

Код: Выделить всё
dim p() As New stdPicture

и вот таким:
Код: Выделить всё
dim p() As stdPicture
          set p()=New stdPicture

Мне кажется первый вариант Практичнее.
Лишь разум потерянный бесповоротно мною. Наполнить может сердце мне тоской.
Нельзя обнять необъятное и впихнуть невпихуемое.

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

Re: ico в BMP

Сообщение arthur2 » 07.04.2009 (Вт) 11:54

netdemon писал(а):dim p() As stdPicture
set p()=New stdPicture

Да пикчу вообще не надо инициировать :) Строка с new здесь совершенно лишняя.

Сразу пиши set p(i)= то что тебе надо. В данном случае set p(i)=frm.pic.image, можно и так: set p(i)=loadpicture("моя.bmp")
Артур
 
   

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

Re: ico в BMP

Сообщение alibek » 07.04.2009 (Вт) 12:25

arthur2 писал(а):Да пикчу вообще не надо инициировать :) Строка с new здесь совершенно лишняя.

А ты смысл new понимаешь?
Lasciate ogni speranza, voi ch'entrate.

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

Re: ico в BMP

Сообщение arthur2 » 07.04.2009 (Вт) 13:09

alibek
Понимаю. Создать новый объект. Без нью - присвоить ссылку на уже существующий объект.

В данном случае - создавать новый объект не надо, потому что мы присваиваем ссылку на уже существующющий объект.

Вообще, если честно, понимаю не до конца - если, например, присвоить stdfont ссылку на существующий шрифт, то это будет тот же самый объект, и это понятно. А если сделать это с пикчей - почему-то получается две независимые пикчи.

set lable.font=me.font
me.font.bold=thrue
жирность появится и у лейбла и у формы

а если так:
set pic1.picture=pic2.picture
pic2.picture=loadpicture(path)
картинки получились разные
Артур
 
   

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

Re: ico в BMP

Сообщение alibek » 07.04.2009 (Вт) 13:10

LoadPicture загрузит в pic2 новый объект, соответственно, pic1 и pic2 будут ссылаться на разные объекты. То что данная объектная проперть присваивается, в том числе, и через Let, это просто допущение.
Вместо LoadPicture сделай Debug.Pring pic1.Picture.Handle, pic2.Picture.Handle, хэндл будет одинаковый.
Lasciate ogni speranza, voi ch'entrate.

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

Re: ico в BMP

Сообщение arthur2 » 07.04.2009 (Вт) 13:26

То есть, реально p=loadpicture(path) - это set p=, так что ли?

А раз после присвоения объект и в pic1.picture и в pic1.picture всё же один и тот же, то можно ли тогда как-нибудь добиться того, чтобы изменяя картинку в одном пикчебоксе, мы изменили ее же и во всех других с той же ссылкой?
Артур
 
   

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

Re: ico в BMP

Сообщение alibek » 07.04.2009 (Вт) 13:29

Попробуй сделать что-нибудь с pic.Picture.Render.
Но, честно говоря, сомневаюсь что это поможет.
Picture может и один и тот же будет, а DC разный.
Lasciate ogni speranza, voi ch'entrate.

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

Re: ico в BMP

Сообщение arthur2 » 07.04.2009 (Вт) 14:07

pic.Picture.Render.

Ух ты, какая интересная функция... А как ей пользоваться? что за последний параметр бай эни?

А если не пикчебоксы, а имеджи, лежащие на одном и том же контейнере? тогда ведь дс общий должен быть?
Артур
 
   

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

Re: ico в BMP

Сообщение alibek » 07.04.2009 (Вт) 14:31

arthur2 писал(а):А если не пикчебоксы, а имеджи, лежащие на одном и том же контейнере? тогда ведь дс общий должен быть?

С чего бы такой вывод? Image размещаются где-то в памяти и выводятся на DC формы.

И даже если ты каким-то образом изменишь объект, на который ссылаются несколько Image, с чего ты взял, что VB отобразит эти изменения? У StdFont есть событие FontChanged, которое можно (и нужно) мониторить, а StdPicture будет отрисовываться только при необходимости.
Lasciate ogni speranza, voi ch'entrate.

netdemon
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 179
Зарегистрирован: 04.09.2007 (Вт) 15:51

Re: ico в BMP

Сообщение netdemon » 07.04.2009 (Вт) 16:19

arthur2 писал(а):То есть, реально p=loadpicture(path) - это set p=, так что ли?

А раз после присвоения объект и в pic1.picture и в pic1.picture всё же один и тот же, то можно ли тогда как-нибудь добиться того, чтобы изменяя картинку в одном пикчебоксе, мы изменили ее же и во всех других с той же ссылкой?


Придётся каждый экземпляр обновлять принудительно. Да возможно ещё и очищать перед этим. Я тут пробывал в один и тот же контрол отрисовывать с разными размерами начальный 16x16 а конечный 13x13. без копирования растра ничего не выйдет. picturebox->DC->Picturebox(через BitBlt) Picturebox.Image->stdPicture stdpicture.handl->menuItem.
А покороче никак? Это ж как проц усирается Да ещё и инициализация экземпляров да и памяти хавает массив stdpicture(...) порядочно.

Смотрите солько кушает при отрисовке менюшки: Конфига: P4M450 1,4 GHz cash 512Kb, 1Gb RAM
Вложения
proc.jpg
proc.jpg (122.01 Кб) Просмотров: 2652
Лишь разум потерянный бесповоротно мною. Наполнить может сердце мне тоской.
Нельзя обнять необъятное и впихнуть невпихуемое.

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

Re: ico в BMP

Сообщение arthur2 » 07.04.2009 (Вт) 17:12

alibek
С чего бы такой вывод?
я думал, что имедж - это просто обертка вокруг рисования на контейнере :)
а StdPicture будет отрисовываться только при необходимости.
ну, если бы дело было только в этом, то такую необходимость несложно было бы создать и искусственно... или нет?
У StdFont есть событие FontChanged,
А как? объявить переменную withevents и присвоить ей тот шрифт, за которым нужно следить? Хм, интересная мысль!

netdemon
думаю, память занимает не столько массив пикчей, сколько сами данные этих пикчей :)

А вообще - в твоем случае было бы лучше не загружать картинки в меню, а прямо на меню их и рисовать :) Не пришлось бы переводить в бмп (хватило бы того drawicon прямо на hdc самого меню), да и картинки при наведении не инвертировались бы :)
Артур
 
   

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

Re: ico в BMP

Сообщение iGrok » 07.04.2009 (Вт) 17:18

netdemon писал(а):А покороче никак? Это ж как проц усирается Да ещё и инициализация экземпляров да и памяти хавает массив stdpicture(...) порядочно.
Тебе в любом случае нужен массив валидных hBitmap. Ну в памяти он будет занимать чуть меньше, чем массив StdPicture.
Как их получить - я писал...
label:
cli
jmp label

netdemon
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 179
Зарегистрирован: 04.09.2007 (Вт) 15:51

Re: Ico в BMP -- новые разработки для Кащея

Сообщение netdemon » 08.04.2009 (Ср) 18:15

Вот что получилось. В архиве скрин и ActivX элемент кнопочки. Обязательно чтобы были папки "Prog" и "Games" c ярлыками на рабочем столе, "D:\Games", "D:\Видео" "D:\музыка\", "D:\Документы\" , а так же ярдык к "Мой компьютер" на рабочем столе. Это временно. Потом сделаю как надо.

А есть функция API для выковыриваеия картинки пользователя?
Вложения
DC.7z
(500.57 Кб) Скачиваний: 86
Лишь разум потерянный бесповоротно мною. Наполнить может сердце мне тоской.
Нельзя обнять необъятное и впихнуть невпихуемое.


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

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

Сейчас этот форум просматривают: AhrefsBot и гости: 52

    TopList