Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Динамическое добавление иконки в трию Добавлено: 31.08.07 22:42  

Автор вопроса:  Patriot | ICQ: 439168318 
Для динамического изменения иконки в трие необходимо имеющийся IPictureDesp, StdPicture или hDC конвертировать в иконку, а уже после её можно добавлять в трию с помощью Shell_NotifyIcon. Код, приведённый ниже (он и является причиной ошибки приложения) конвертирует hDC в иконку. Ошибка происходит через достаточно продолжительное время работы программы, примерно после 4000-го вызова функции возникает ошибка времени выполнения (код шибки 480, содержание: Невозможно создать AutoRedraw картинки (Can’t create AutoRedraw image)), интервал между вызовом функции составляет пол секунды (500ms), в функцию в качестве входных данных поступает динамически меняющийся hDC PictureBox'а.
 Для того чтобы узреть ошибку как можно быстрее, вызывать функцию желательно через цикл или таймер с интервалом в единицу.
Комментировать код надеюсь ненужно.
 Мне кажется, что ошибка возникает из-за накапливания данных, в результате чего происходи превышения диапазона исчисления переменной и ошибка.
Если кто знает где ошибка подскажите пожалуйста.
‘Код формы
Option Explicit

Dim hDC_mask As Long, hDC_color As Long, new_hDC As Long
Dim hBm_mask As Long, hBm_color As Long
Dim hBm_color_old As Long, hBm_mask_old As Long
Dim IC As ICONINFO

Private Function Conver_to_Icon(ByVal hDC As Long) As Long
    hBm_color = CreateCompatibleBitmap(hDC, 16, 16)
    hBm_mask = CreateBitmap(16, 16, 1&, 1&, ByVal 0&)
    hDC_color = CreateCompatibleDC(hDC)
    hBm_color_old = SelectObject(hDC_color, hBm_color)
    Call SetBkColor(hDC_color, GetBkColor(hDC))
    Call BitBlt(hDC_color, 0&, 0&, 16, 16, hDC, 0&, 0&, vbSrcCopy)
    hDC_mask = CreateCompatibleDC(hDC)
    hBm_mask_old = SelectObject(hDC_mask, hBm_mask)
    Call BitBlt(hDC_mask, 0, 0, 16, 16, hDC_color, 0, 0, vbSrcCopy)
    Call BitBlt(hDC_color, 0, 0, 16, 16, hDC_mask, 0, 0, &H220326)
    IC.hBmColor = SelectObject(hDC_color, hBm_color_old)
    IC.hBmMask = SelectObject(hDC_mask, hBm_mask_old)
    Conver_to_Icon = CreateIconIndirect(IC)
End Function

Private Sub Delete_Conver_Icon()
Call DeleteObject(IC.hBmColor)
Call DeleteDC(hDC_color)
Call DeleteObject(IC.hBmMask)
Call DeleteDC(hDC_mask)
Call DeleteDC(new_hDC)
End Sub

‘Код модуля

Option Explicit

Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Declare Function DeleteDC Lib "gdi32.dll" (ByVal hDC As Long) As Long
Declare Function CreateCompatibleDC Lib "gdi32.dll" (ByVal hDC As Long) As Long
Declare Function CreateCompatibleBitmap Lib "gdi32.dll" (ByVal hDC As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Declare Function CreateBitmap Lib "gdi32.dll" (ByVal nWidth As Long, ByVal nHeight As Long, ByVal nPlanes As Long, ByVal nBitCount As Long, lpBits As Any) As Long
Declare Function SelectObject Lib "gdi32.dll" (ByVal hDC As Long, ByVal hObject As Long) As Long
Declare Function CreateIconIndirect Lib "user32.dll" (piconinfo As ICONINFO) As Long

Type ICONINFO
    fIcon As Long
    xHotspot As Long
    yHotspot As Long
    hBmMask As Long
    hBmColor As Long
End Type

Type PictDesc
    cbSizeofStruct As Long
    picType As Long
    hImage As Long
    xExt As Long
    yExt As Long
End Type

Type Guid
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(0 To 7) As Byte
End Type

Ответить

  Ответы Всего ответов: 4  

Номер ответа: 1
Автор ответа:
 Millenium



ICQ: 629966 

Вопросов: 118
Ответов: 903
 Web-сайт: www.aliyev.us
 Профиль | | #1
Добавлено: 01.09.07 11:08
Тут есть рабочая: http://vbnet.ru/samples/

Напиши это в суппорт центр МелкоМягких!

Ответить

Номер ответа: 2
Автор ответа:
 Patriot



ICQ: 439168318 

Вопросов: 5
Ответов: 50
 Профиль | | #2 Добавлено: 02.09.07 02:51
Тут есть рабочая: http://vbnet.ru/samples/

Если не трудно, можно адрес по точнее. В графике куча примеров в коком именно, я посмотрел более подходящие по описанию, но там не то, конвертация в битмапы, но не в иконку.

Центр
МелкоМягких!
- это что за центр такой?

Ответить

Номер ответа: 3
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #3
Добавлено: 02.09.07 11:22
такая ошибка возникает если ты много всего создаешь, а потом мало чего удаляешь :)
Вобщем ошибка возникает когда заканчивается память и новые GDI объекты уже не могут создаваться.
Ищи где течь.

Ответить

Номер ответа: 4
Автор ответа:
 Patriot



ICQ: 439168318 

Вопросов: 5
Ответов: 50
 Профиль | | #4 Добавлено: 02.09.07 23:52
sne ты был абсолютно прав “много создаешь” и вот она ошибка, да, ума у меня сразу то, не хватило сообразить, ошибка возникает из-за многократного вызова функций, которые создают маски и тому подобные шаблоны.
Вызывать функции вроде CreateCompatibleDC, CreateCompatibleBitmap и CreateBitmap нужно не каждый раз, а лишь один, при первом вызове функции, далее просто не удаляем готовые шаблоны, а пользуемся ими. Вот и всё проблема решена.
Этой ошибки не было бы, если бы наши доблестные программёры из майкрософт сделали бы очистку в функциях, с течением n-го количество вызовов, но в тоже время, они ведь не предполагали, что у кого-то хватит ума вызывать эти функции так многократно.

Может кому-то пригодится уже работоспособный код:

‘Код формы
Option Explicit

Dim hDC_mask As Long, hDC_color As Long, new_hDC As Long
Dim hBm_mask As Long, hBm_color As Long
Dim hBm_color_old As Long, hBm_mask_old As Long
Dim IC As ICONINFO

‘==============================================
‘Этот код нужно вызывать только один раз перед созданием иконки
    hBm_color = CreateCompatibleBitmap(pic_Icon.hdc, 16, 16)
    hBm_mask = CreateBitmap(16, 16, 1&, 1&, ByVal 0&;)
    hDC_color = CreateCompatibleDC(pic_Icon.hdc)
    hDC_mask = CreateCompatibleDC(hdc)
‘==============================================

Private Function Conver_Icon(ByVal hdc As Long) As Long
    hBm_color_old = SelectObject(hDC_color, hBm_color)
    Call SetBkColor(hDC_color, GetBkColor(hdc))
    Call BitBlt(hDC_color, 0&, 0&, 16, 16, hdc, 0&, 0&, vbSrcCopy)
    hBm_mask_old = SelectObject(hDC_mask, hBm_mask)
    Call BitBlt(hDC_mask, 0, 0, 16, 16, hDC_color, 0, 0, vbSrcCopy)
    Call BitBlt(hDC_color, 0, 0, 16, 16, hDC_mask, 0, 0, &H220326)
    IC.hBmColor = SelectObject(hDC_color, hBm_color_old)
    IC.hBmMask = SelectObject(hDC_mask, hBm_mask_old)
    Conver_Icon = CreateIconIndirect(IC)
End Function

Private Sub Delete_Conver_Icon() 'Это вызываем во времяunload_form
Call DeleteObject(IC.hBmColor)
Call DeleteDC(hDC_color)
Call DeleteObject(IC.hBmMask)
Call DeleteDC(hDC_mask)
Call DeleteDC(new_hDC)
End Sub

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам