Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Жрется память (GDI), где неправ чувствую, а сделать ничего не могу. / 4 сообщений из 4, страница 1 из 1
27.02.2014, 07:27
    #38573718
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Жрется память (GDI), где неправ чувствую, а сделать ничего не могу.
Суть кода ниже в том, что создается hbshBack_temp (Brush из большой картинки),
из него берется из заданного места кусок и пихается в новый bitmap hbmDst, из которого потом делается IPictureDisp, который как объяснял Бенедикт отвечает за битмат hbmDst и битмап удалять не надо. IPictureDisp потом подкладывается как фон Ребар, что делает ребар "прозрачным". Ну, Nothing для IPictureDisp я делаю.

Подвох скорее всего во "вложенных" SelectObject (я выделил) -в оригинальных кодах этого нет. В оригинальных градиент рисуется на hdcDst и есть только hbmDst, а здесь мне надо привязаться еще и к hbshBack_temp .
Но как извернуться не знаю. На авось когда-то проехало.
Счас играюсь со "слайдами" с высокой тестовой частотой (с этой же частотой работает код что ниже),
и этот код генерирует мне по +2 объекта GDI в процессах (при каждом срабатывании).

Аналогичный код с градиентами новых объектов не плодит (вроде).

При частоте 5 сек на XP нехватка ресурсов начинает ощущаться "по черному" довольно быстро, хотя на 8.1-ке вроде держится.




Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
Public Function CreateTransparentBackGround( _
 ByVal hwndRebar As Long) As IPictureDisp
  Dim rc As RECT
  Dim tPt As POINTAPI
  Dim hdcRef As Long
  Dim hdcDst As Long
  Dim hbmDst As Long
  Dim hbmOld As Long

  'Dim the_hdc As Long
  Dim hbmDstOld As Long
  Dim RebarHeight As Long
  Dim RebarWidth As Long
  
  Dim hbmpBack_temp As Long
  Dim hbshBack_temp As Long
  
  
  hbmpBack_temp = FormMain.PictureDigits.Picture.Handle
  If hbmpBack_temp <> 0 Then
    hbshBack_temp = CreatePatternBrush(hbmpBack_temp)
  Else
    'затычка на случай отсутствия фоновой картинки
    Dim the_ColorRef As Long
    OleTranslateColor FormMain.PictureDigits.BackColor, 0, the_ColorRef
    hbshBack_temp = CreateSolidBrush(the_ColorRef)
  End If
  
  GetWindowRect hwndRebar, rc
  If ThemesEnabled(hwndRebar) Then
    rc.Left = rc.Left + 2
  End If
  RebarWidth = rc.Right - rc.Left
  RebarHeight = rc.Bottom - rc.Top
  
  hdcRef = GetDC(hwndRebar)
  hdcDst = CreateCompatibleDC(hdcRef)
  hbmDst = CreateCompatibleBitmap(hdcRef, RebarWidth, RebarHeight)
  ReleaseDC hwndRebar, hdcRef
  hbmOld = SelectObject(hdcDst, hbmDst)

  hbmDstOld = SelectObject(hdcDst, hbshBack_temp)
  SetBkMode hdcDst, TRANSPARENT
  tPt.x = rc.Left
  tPt.y = rc.Top
  MapWindowPoints 0, FormMain.PictureDigits.hwnd, tPt, 2
  rc.Left = tPt.x
  rc.Top = tPt.y
  SetBrushOrgEx hdcDst, -rc.Left, -rc.Top, tPt
  PatBlt hdcDst, 0, 0, RebarWidth, RebarHeight, PATCOPY
  SelectObject hdcDst, hbmDstOld
  
  SelectObject hdcDst, hbmOld: hbmOld = 0
  DeleteDC hdcDst: hdcDst = 0
  
  DeleteObject hbshBack_temp
 
  Set CreateTransparentBackGround = CreateIPictureDispFromHBITMAP(hbmDst)
End Function
...
Рейтинг: 0 / 0
27.02.2014, 09:59
    #38573806
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Жрется память (GDI), где неправ чувствую, а сделать ничего не могу.
hbmOld = SelectObject
hbmDstOld = SelectObject

А где DeleteObject для этих переменных?
...
Рейтинг: 0 / 0
27.02.2014, 20:25
    #38574704
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Жрется память (GDI), где неправ чувствую, а сделать ничего не могу.
AntonariyhbmOld = SelectObject
hbmDstOld = SelectObject

А где DeleteObject для этих переменных?

Не помогает.
Помогло вроде вот это:
Код: vbnet
1.
  DeleteObject SelectObject(hdcDst, hbmDstOld)


По крайней мере GDI-объекты плодить перестал.

Смотрел сюда (похожий код):
Пример создания значков пунктов меню
...
Рейтинг: 0 / 0
28.02.2014, 10:40
    #38575013
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Жрется память (GDI), где неправ чувствую, а сделать ничего не могу.
Дмитрий77 Помогло вроде вот это:Все правильно, я почему-то не обратил внимания на SelectObject без переменной.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Жрется память (GDI), где неправ чувствую, а сделать ничего не могу. / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]