Страница: 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 Автор ответа: 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 |
Поиск по форуму