powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Установка иконки "чужого" окна
18 сообщений из 18, страница 1 из 1
Установка иконки "чужого" окна
    #38425726
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В VB6 использовал следующую ф-цию (привожу целиком под спойлером -заумный бюрократический вариант):
Код: 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.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
Option Explicit

Private Declare Function GetSystemMetrics Lib "user32" ( _
 ByVal nIndex As Long _
 ) As Long

Private Const SM_CXICON = 11
Private Const SM_CYICON = 12

Private Const SM_CXSMICON = 49
Private Const SM_CYSMICON = 50
   
Private Declare Function LoadImageAsString Lib "user32" Alias "LoadImageA" ( _
 ByVal hInst As Long, _
 ByVal lpsz As String, _
 ByVal uType As Long, _
 ByVal cxDesired As Long, _
 ByVal cyDesired As Long, _
 ByVal fuLoad As Long _
 ) As Long
   
Private Const LR_DEFAULTCOLOR = &H0
Private Const LR_MONOCHROME = &H1
Private Const LR_COLOR = &H2
Private Const LR_COPYRETURNORG = &H4
Private Const LR_COPYDELETEORG = &H8
Private Const LR_LOADFROMFILE = &H10
Private Const LR_LOADTRANSPARENT = &H20
Private Const LR_DEFAULTSIZE = &H40
Private Const LR_VGACOLOR = &H80
Private Const LR_LOADMAP3DCOLORS = &H1000
Private Const LR_CREATEDIBSECTION = &H2000
Private Const LR_COPYFROMRESOURCE = &H4000
Private Const LR_SHARED = &H8000&

Private Const IMAGE_ICON = 1

Private Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" ( _
 ByVal hwnd As Long, ByVal wMsg As Long, _
 ByVal wParam As Long, ByVal lParam As Long _
 ) As Long

Private Const WM_SETICON = &H80

Private Const ICON_SMALL = 0
Private Const ICON_BIG = 1

Private Declare Function GetWindow Lib "user32" ( _
 ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Const GW_OWNER = 4


Public Sub SetIcon( _
 ByVal hwnd As Long, _
 ByVal sIconResName As String, _
 Optional ByVal bSetAsAppIcon As Boolean = True)
 
  Dim lhWndTop As Long
  Dim lhWnd As Long
  Dim cx As Long
  Dim cy As Long
  Dim hIconLarge As Long
  Dim hIconSmall As Long
      
  If (bSetAsAppIcon) Then
    ' Find VB's hidden parent window:
    lhWnd = hwnd
    lhWndTop = lhWnd
    Do While Not (lhWnd = 0)
      lhWnd = GetWindow(lhWnd, GW_OWNER)
      If Not (lhWnd = 0) Then
        lhWndTop = lhWnd
      End If
    Loop
  End If
   
  cx = GetSystemMetrics(SM_CXICON)
  cy = GetSystemMetrics(SM_CYICON)
  hIconLarge = LoadImageAsString( _
   App.hInstance, sIconResName, _
   IMAGE_ICON, _
   cx, cy, _
   LR_SHARED)
  If (bSetAsAppIcon) Then
    SendMessageLong lhWndTop, WM_SETICON, ICON_BIG, hIconLarge
  End If
  SendMessageLong hwnd, WM_SETICON, ICON_BIG, hIconLarge
   
  cx = GetSystemMetrics(SM_CXSMICON)
  cy = GetSystemMetrics(SM_CYSMICON)
  hIconSmall = LoadImageAsString( _
   App.hInstance, sIconResName, _
   IMAGE_ICON, _
   cx, cy, _
   LR_SHARED)
  If (bSetAsAppIcon) Then
    SendMessageLong lhWndTop, WM_SETICON, ICON_SMALL, hIconSmall
  End If
  SendMessageLong hwnd, WM_SETICON, ICON_SMALL, hIconSmall
   
End Sub


Т.е. код сводится к
Код: vbnet
1.
2.
  SetIcon hwndTarget, "#981", False
   '981 -номер иконки в классических ресурсах содержит 32х32 для отображении в Alt+TAB на Висте


Иконка 981 -я обычно беру иконку с 6-ю вариантами картинок:
32x32 (32бит, 256цветов, 16 цветов) + 16x16 (32бит, 256цветов, 16 цветов)

Суть ф-ции сводится к следующему(как я понимаю):
1) Ф-ция высчитывает метрики системы (SM_C<X,Y>ICON -хотя очевидно что это 32х32, SM_C<X,Y>SMICON -очевидно что это 16х16)
2) Вытаскивает эти иконки через LoadImage function
LoadImageAsString(имя ресурса, желаемый размер cx-cy согласно метрикам)
после чего имеем хэндлы иконок hIconLarge и hIconSmall
3) Тупо шлем эти иконки в сторону целевого окна:
Код: vbnet
1.
2.
  SendMessage hwndTarget, WM_SETICON, ICON_BIG, hIconLarge
  SendMessage hwndTarget, WM_SETICON, ICON_SMALL, hIconSmall



В .Net я эту иконку MY_ICON
32x32 (32бит, 256цветов, 16 цветов) + 16x16 (32бит, 256цветов, 16 цветов)
кладу в MyResources.
Более удобная реализация ресурсов, но ДРУГАЯ. Кто б спорил.

Если надо установить иконку СВОЕГО окна, то вообще без проблем:
Код: vbnet
1.
    FormMy.Icon = My.Resources.MY_ICON

и оно само разберется где там big, где там small.

Но если окно чужое, то очевидно (поправьте если чего не знаю) что без вариантов WM_SETICON

И вот я не могу понять, как правильно выскрести
hIconLarge (SM_C<X,Y>ICON =32х32 ?)
hIconSmall (SM_C<X,Y>SMICON =16х16 ?)
из My.Resources.MY_ICON

LoadImage (API) работает ведь с классическими ресурсами, а не с .Net-овскими, в лоб не перекатаешь.

Один вариант (грубый) я вроде как вижу:
Засунуть в .Net ресурсы 2 иконки вместо одной (по одной картинке в каждой)
MY_ICON_32 (32бит)
MY_ICON_16 (32бит)

Тогда
Код: vbnet
1.
2.
hIconLarge = My.Resources.MY_ICON_32.Handle '->WM_SETICON,ICON_BIG
hIconSmall = My.Resources.MY_ICON_16.Handle '->WM_SETICON,ICON_SMALL


Но он базируется на
1) Использовании 2-х иконок вместо одной
2) Аксиоматического предположения про 32х32 и 16х16 вместо SystemMetrics

Как бы это пограмотней сделать?
...
Рейтинг: 0 / 0
Установка иконки "чужого" окна
    #38425806
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну я в принципе вот так подправил:

Применение:
Код: 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.
  SetIcon(hwndTarget, My.Resources.MY_ICON, False) 'MY_ICON содержит 32х32(32бит,256цв,16цв)+16х16(32бит,256цв,16цв)

  Public Sub SetIcon( _
   ByVal hwnd As Long, _
   ByVal resIcon As Icon, _
   Optional ByVal bSetAsAppIcon As Boolean = True)

    Dim lhWndTop As IntPtr
    Dim lhWnd As IntPtr
    Dim cx As Integer
    Dim cy As Integer

    If (bSetAsAppIcon) Then
      ' Find VB's hidden parent window:
      lhWnd = hwnd
      lhWndTop = lhWnd
      Do While Not (lhWnd = 0)
        lhWnd = GetWindow(lhWnd, GW_OWNER)
        If Not (lhWnd = 0) Then
          lhWndTop = lhWnd
        End If
      Loop
    End If

    cx = GetSystemMetrics(SM_CXICON)
    cy = GetSystemMetrics(SM_CYICON)
    Dim hIconLarge As IntPtr = New Icon(resIcon, cx, cy).Handle

    If (bSetAsAppIcon) Then
      SendMessage(lhWndTop, WM_SETICON, ICON_BIG, hIconLarge)
    End If
    SendMessage(hwnd, WM_SETICON, ICON_BIG, hIconLarge)

    cx = GetSystemMetrics(SM_CXSMICON)
    cy = GetSystemMetrics(SM_CYSMICON)
    Dim hIconSmall As IntPtr = New Icon(resIcon, cx, cy).Handle
    If (bSetAsAppIcon) Then
      SendMessage(lhWndTop, WM_SETICON, ICON_SMALL, hIconSmall)
    End If
    SendMessage(hwnd, WM_SETICON, ICON_SMALL, hIconSmall)

  End Sub


P.S.
1) Применение для СВОИХ окон - не планируется
2) Применение для установки иконки всего приложения (bSetAsAppIcon=True) -не планируется

Вопросы:
Должен ли я заботиться об освобождении ресурсов для
1) New Icon( ... As Icon
2) hIconLarge и hIconSmall= .New Icon(...) .Handle
???

По идее объект New Icon должен вроде убиться и освободить ресурсы по выходу из ф-ции SetIcon()

Если верить комментарию к WM_SETICON message :
Notes* The system does not make a copy of the icon. Do not destroy the icon before destroying the window.
то New Icon() не рушится по выходу из SetIcon() потому что все работает и установленная иконка никуда не девается.

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

P.S. Вменяемого аналога для GetSystemMetrics в .Net не нашел. Как вариант можно просто подставлять цифры 16 и 32
...
Рейтинг: 0 / 0
Установка иконки "чужого" окна
    #38425832
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу освобождения ресурсов:
Вот так не работает (понятно почему):
Код: vbnet
1.
2.
3.
4.
    Dim IconSmall As Icon = New Icon(resIcon, cx, cy)
    Dim hIconSmall As IntPtr = IconSmall.Handle
    IconSmall.Dispose()
    SendMessage(hwnd, WM_SETICON, ICON_SMALL, hIconSmall)


Вот так на первый взгляд работает, но стоит свернуть окно на панель задач/развернуть, установленная иконка заменяется оригинальной:
Код: vbnet
1.
2.
3.
4.
    Dim IconSmall As Icon = New Icon(resIcon, cx, cy)
    Dim hIconSmall As IntPtr = IconSmall.Handle
    SendMessage(hwnd, WM_SETICON, ICON_SMALL, hIconSmall)
    IconSmall.Dispose()


Отсюда вывод - где-то надо делать IconSmall.Dispose() (при закрытии главной формы?) и следить за этим, если например ф-ция вызывается дважды.
Либо тупо использовать 2 иконки (числа 16 и 32 брать на веру) и обращаться к My.Resource.MY_ICON_32.handle и My.Resource.MY_ICON_16.handle (что очевидно очистки не требует).
...
Рейтинг: 0 / 0
Установка иконки "чужого" окна
    #38425867
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

IconSmall.Dispose() убьёт икону и сделает хэндл невалидным. Мусоросборщик сдедает то же самое но чуть позже
...
Рейтинг: 0 / 0
Установка иконки "чужого" окна
    #38425879
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилIconSmall.Dispose() убьёт икону и сделает хэндл невалидным.
Естественно. Это были тесты.

ИзопропилМусоросборщик сдедает то же самое но чуть позже
Слыхал про такого.

Т.е. ты хочешь сказать что надо оставить код в первоначальном варианте и довериться этому "мусоросборщику"? Так?

Просто я уже придумал новый (более аккуратный) вариант кода (речь идет об окне хэлпа чтоб было понятней):

Код: 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.
60.
61.
62.
63.
  Public H_HTMLHELP_large As Icon
  Public H_HTMLHELP_small As Icon
'код вызова
...
    If IsNothing(H_HTMLHELP_large) Then _
     H_HTMLHELP_large = CreateIcon_LargeSmall(My.Resources.H_HTMLHELP, True)
    If IsNothing(H_HTMLHELP_small) Then _
     H_HTMLHELP_small = CreateIcon_LargeSmall(My.Resources.H_HTMLHELP, False)
    SetIcon_LargeSmall(hwndHelp, H_HTMLHELP_large, H_HTMLHELP_small, False)

'код "очистки"
  Private Sub Form1_FormClosed(ByVal sender As Object,
   ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
...
    If IsNothing(H_HTMLHELP_large) = False Then H_HTMLHELP_large.Dispose()
    If IsNothing(H_HTMLHELP_small) = False Then H_HTMLHELP_small.Dispose()
  End Sub

'код ф-ций

  Public Function CreateIcon_LargeSmall(ByVal resIcon As Icon, ByVal large As Boolean) As Icon
    Dim cx As Integer
    Dim cy As Integer
    If large Then
      cx = GetSystemMetrics(SM_CXICON)
      cy = GetSystemMetrics(SM_CYICON)
    Else
      cx = GetSystemMetrics(SM_CXSMICON)
      cy = GetSystemMetrics(SM_CYSMICON)
    End If
    Return New Icon(resIcon, cx, cy)
  End Function

  Public Sub SetIcon_LargeSmall( _
   ByVal hwnd As Long, _
   ByVal the_large_icon As Icon, ByVal the_small_icon As Icon, _
   Optional ByVal bSetAsAppIcon As Boolean = True)

    Dim lhWndTop As IntPtr
    Dim lhWnd As IntPtr

    If (bSetAsAppIcon) Then
      ' Find VB's hidden parent window:
      lhWnd = hwnd
      lhWndTop = lhWnd
      Do While Not (lhWnd = 0)
        lhWnd = GetWindow(lhWnd, GW_OWNER)
        If Not (lhWnd = 0) Then
          lhWndTop = lhWnd
        End If
      Loop
    End If

    If (bSetAsAppIcon) Then
      SendMessage(lhWndTop, WM_SETICON, ICON_BIG, the_large_icon.Handle)
    End If
    SendMessage(hwnd, WM_SETICON, ICON_BIG, the_large_icon.Handle)

    If (bSetAsAppIcon) Then
      SendMessage(lhWndTop, WM_SETICON, ICON_SMALL, the_small_icon.Handle)
    End If
    SendMessage(hwnd, WM_SETICON, ICON_SMALL, the_small_icon.Handle)
  End Sub


Негативчик в том, окно хэлпа закрывается на долю секунду позже
чем срабатывает мой "код очистки"
и может промелькнуть оригинальная иконка.

Оставить первый вариант вообще без Dispose()?
Там есть еще момент, что окно help может вызываться и закрываться несколько раз
в процессе работы приложения и иконка будет каждый раз новая ("поверх старой").
Ваш "сборщик" с этим справится?

Это код сборщика мусора?
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    'Форма переопределяет dispose для очистки списка компонентов.
    <System.Diagnostics.DebuggerNonUserCode()> _
    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
        Try
            If disposing AndAlso components IsNot Nothing Then
                components.Dispose()
            End If
        Finally
            MyBase.Dispose(disposing)
        End Try
    End Sub
...
Рейтинг: 0 / 0
Установка иконки "чужого" окна
    #38425893
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилМусоросборщик сдедает то же самое но чуть позже
Почитал я чуток про этого чудо-сборщика.
Но тогда другой вопрос.
Где гарантия, что это "чуть позже" не наступит "чуть раньше" чем НАДО?
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
  Public Sub SetIcon( _
   ByVal hwnd As Long, _
   ByVal resIcon As Icon, _
   Optional ByVal bSetAsAppIcon As Boolean = True)
...
  Dim hIconSmall As IntPtr = New Icon(resIcon, cx, cy).Handle
...
End Sub


Область видимости New Icon
ограничивается ф-цией SetIcon
Сборщику вряд ли что-либо известно про WM_SETICON, про мое окно htmlHelp, закрыли ли его уже или нет,
про то что New Icon еще нужна.
Он ее возьмет и грохнет в любой момент.
И будет тоже самое что во втором тесте , но "чуть позже".

Следуя этой логике, я бы оставил второй вариант кода, где "New Icon" иконки "видимы" до конца работы приложения
Код: vbnet
1.
2.
  Public H_HTMLHELP_large As Icon
  Public H_HTMLHELP_small As Icon

Но убрал бы собственный "код очистки" в Form1_FormClosed, рассчитывая на "уборку" при закрытии App.
Покритикуешь?
...
Рейтинг: 0 / 0
Установка иконки "чужого" окна
    #38425922
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Где гарантия, что это "чуть позже" не наступит "чуть раньше" чем НАДО?
Наступит! У Рихтера пример с таймером на сей счёт имеется.

после этой строки мусоросборщик имеет полное право грохнуть Icon
Код: vbnet
1.
Dim hIconSmall As IntPtr = New Icon(resIcon, cx, cy).Handle



забыть про область видимости идентификаторов, к сборке мусора это отношения не имеет.
Запомнить ссылку на Icon нужно, например в статической переменной(ли другом месте до которого мусоросборщик не доберётся
...
Рейтинг: 0 / 0
Установка иконки "чужого" окна
    #38425934
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Это код сборщика мусора?
НЕТ!

бегом Рихтера читать!
...
Рейтинг: 0 / 0
Установка иконки "чужого" окна
    #38425971
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилзабыть про область видимости идентификаторов, к сборке мусора это отношения не имеет.
Запомнить ссылку на Icon нужно, например в статической переменной(ли другом месте до которого мусоросборщик не доберётся
Не забыл,
с самого начала поставил под сомнение правомерность конструкции
Код: vbnet
1.
New Icon(resIcon, cx, cy).Handle


И очень удивился тому что код работает.
А это могло быть только по двум причинам:
1) WM_SETICON все-таки делает копию (комментарий приведенный в документации на WM_SETICON не есть документация, и вполне мог быть ошибочным утверждением того кто это дописал)
2) Объект Icon не уничтожается по выходу из ф-ции.

Тест явно показал, что утверждение из MSDN верное, а объект сам не уничтожается.
А раз не уничтожается, значит его надо уничтожить (самому) - опыт есть, поэтому за такими вещами предпочитаю следить даже по мелочам.
А про всяких там "сборщиков" извините не думал, не привык на них рассчитывать.

Ну, тогда,
Дмитрий77...я бы оставил второй вариант кода, где "New Icon" иконки "видимы" до конца работы приложения
Код: vbnet
1.
2.
  Public H_HTMLHELP_large As Icon
  Public H_HTMLHELP_small As Icon

Но убрал бы собственный "код очистки" в Form1_FormClosed, рассчитывая на "уборку" при закрытии App...
ИзопропилДмитрий77Это код сборщика мусора?
НЕТ!
бегом Рихтера читать!
Да понял я и без Рихтера идею этого сборщика, иначе б не задал.
этого вопросаГде гарантия, что это "чуть позже" не наступит "чуть раньше" чем НАДО?
...
Рейтинг: 0 / 0
Установка иконки "чужого" окна
    #38425981
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77А про всяких там "сборщиков" извините не думал, не привык на них рассчитывать.
придётся привыкать и взаимодействовать с ними

Дмитрий772) Объект Icon не уничтожается по выходу из ф-ции.
да. выход идентификатора из области вмдимости и процесс сборки мусора никак не связаны
Дмитрий77А раз не уничтожается, значит его надо уничтожить (самому) - опыт есть, поэтому за такими вещами предпочитаю следить даже по мелочам.
Старый опыт здесь неприменим.
Что имеет смысл делать руками -вызывать Dispose() у тех, кто реализует IDisposable ( явно или посредством конструкции using)

P.S. Может сначала Рихтера, а?
...
Рейтинг: 0 / 0
Установка иконки "чужого" окна
    #38425982
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77рассчитывая на "уборку" при закрытии App..
По-хорошему, при закрытии приложения самому подчистить неуправляемые ресурсы нужно
...
Рейтинг: 0 / 0
Установка иконки "чужого" окна
    #38425995
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилДмитрий77рассчитывая на "уборку" при закрытии App..
По-хорошему, при закрытии приложения самому подчистить неуправляемые ресурсы нужно
OK, я не против и всегда это делал.
В VB6 для этого Form_Unload
Здесь я использую
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
'код "очистки"
  Private Sub Form1_FormClosed(ByVal sender As Object,
   ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
...
    If IsNothing(H_HTMLHELP_large) = False Then H_HTMLHELP_large.Dispose()
    If IsNothing(H_HTMLHELP_small) = False Then H_HTMLHELP_small.Dispose()
  End Sub


Но при этом сталкиваюсь с эффектом:
Дмитрий77Негативчик в том, окно хэлпа закрывается на долю секунду позже
чем срабатывает мой "код очистки"
и может промелькнуть оригинальная иконка.

Это наводит меня на мысль, что Form1_FormClosed (основной формы) не лучшее место и не конечная инстанция где это можно сделать.
Где тогда я должен "подчищать"?

ИзопропилСтарый опыт здесь неприменим.
Что имеет смысл делать руками -вызывать Dispose() у тех, кто реализует IDisposable ( явно или посредством конструкции using).
Думаю местами применим и необходим.

Для .Net -объектов -ДА,
но если я использую
Код: vbnet
1.
m_hIml = ImageList_Create(16, 16, ILC_MASK Or ILC_COLOR32, 1, 0)


то я просто обязан сделать
Код: vbnet
1.
   ImageList_Destroy(m_hIml )


Уборщик за меня это точно не сделает, он очевидно "не знает" что это такое.
Т.е. в данном примере я обязан руководствоваться документацией MSDN а не документацией .NET.
...
Рейтинг: 0 / 0
Установка иконки "чужого" окна
    #38425999
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77OK, я не против и всегда это делал.
В VB6 для этого Form_Unload
Дмитрий77 Где тогда я должен "подчищать"?

Почему Form_Unload а не Application_ApplicationExit ?
Никакой "главной" формы в net приложении нет.

Дмитрий77Уборщик за меня это точно не сделает, он очевидно "не знает" что это такое.
Уборщику можно помочь. См класс SafeHandle, но сначала - Рихтера


Дмитрий77Думаю местами применим и необходим.
Скорее вреден. Подсчёт ссылок в стиле COM (VB/VBA) не производится, для взаимодействия с COM - другие механизмы - RCW,CCW
Семантика финализатора радикально отличается от деструктора с++
...
Рейтинг: 0 / 0
Установка иконки "чужого" окна
    #38426000
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Т.е. в данном примере я обязан руководствоваться документацией MSDN а не документацией .NET.
Ошибка. Документация NET входит в MSDN.

А вот без понимания работы мусоросборщика можно много дров наломать при использовании неуправляемого API
...
Рейтинг: 0 / 0
Установка иконки "чужого" окна
    #38426005
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

обрати ещё внимание на GC.KeepAlive и посмотри на пример в MSDN
...
Рейтинг: 0 / 0
Установка иконки "чужого" окна
    #38426016
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилПочему Form_Unload а не Application_ApplicationExit ?
Потому что я не знал про Application_ApplicationExit.
И оно не лежит на поверхности.

Погляди, так правильно? Портачить в служебных файлах (которые по команде "Показать все файлы") я не рискнул
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  Private Sub Form1_Load(ByVal sender As System.Object,
                         ByVal e As System.EventArgs) Handles MyBase.Load
    ' Handle the ApplicationExit event to know when the application is exiting.
    AddHandler Application.ApplicationExit, AddressOf OnApplicationExit
...
  Private Sub OnApplicationExit(ByVal sender As Object, ByVal e As EventArgs)
    DataBaseDisConnect()

    'удаление ImageList-ов
    ImageList_Destroy(m_hImlTV_help)
    ImageList_Destroy(m_hImlTB_help)

    If IsNothing(H_HTMLHELP_large) = False Then H_HTMLHELP_large.Dispose()
    If IsNothing(H_HTMLHELP_small) = False Then H_HTMLHELP_small.Dispose()
...
  End Sub


Но все же я б не рискнул запихивать туда "все что можно", сдуру это было сделал
например сохранять положение и размеры формы в реестре думаю надо таки из Form1_FormClosed формы о кот. речь(по очевидным причинам).

ИзопропилНикакой "главной" формы в net приложении нет.
Да, но есть "начальная форма" Проект -> Свойства -> Приложение
и как правило когда она закрывается, то закрывается приложение.
(хотя обеспечить его закрытие - чтоб другие формы случайно не висели и т.д. - это и моя задача тоже)

Просто когда я задавал вопрос про
Sub Main() -стандартный прием в VB6, когда до загрузки формы делаешь действия по типу
Код: vbnet
1.
2.
3.
4.
5.
DataBaseConnect()
ReadSettingsFromRegistry()
ReadSettingsFromIniFile()
GetSystemSettings()
и т.д.


то я натолкнулся на нек. непонимание (или кто-то там до меня натолкнулся в похожем посте).

Тогда вопрос:
Куда я могу засунуть те действия ДО ЗАГРУЗКИ ФОРМЫ (до Form_Load), пример которых я привел выше.
Может я на основании "предварительных результатов" хочу селективно вообще отказаться от загрузки формы, сделать какие-то действия и завершить приложение.

Application_ApplicationExit -вроде как разобрались.
А что тогда есть Application_ApplicationStart?

ИзопропилОшибка. Документация NET входит в MSDN.Не цепляйся. Имелось ввиду то, что в Google обычно отображается с ключевыми словами
(Windows) - MSDN - Microsoft
а не
( System.что-то там ) - MSDN - Microsoft

Код: vbnet
1.
2.
См класс SafeHandle
обрати ещё внимание на GC.KeepAlive... 


Посмотрел, но не хочу сейчас в это сильно влезать. Тяжело для понимания.
Как и злоупотребление Marshal-ом.

Про сборщика пару основных идей я вроде как понял.

То же про Рихтера. Я начал было честно читать CLR via C# - но довольно быстро обнаружил что я перестал понимать большую часть из того что читаю, а когда мозг отказывается воспринимать, то вряд ли это на пользу. Поэтому я ее пока отложил в сторону. Было б у него тоже самое хотя б на примере VB.NET написано, м.б. проще понималось бы. Не знаю, но пока есть чем заниматься.
...
Рейтинг: 0 / 0
Установка иконки "чужого" окна
    #38426139
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторКуда я могу засунуть те действия ДО ЗАГРУЗКИ ФОРМЫ (до Form_Load)
Никакой мистики нет. Бейсик автоматом генерит Public Sub Main() со стандартным открытием одинокой "главеной" формы .
В свойствах проекта сними флажок Enable application framework
и сделай свою процедуру Main
Пример с ApplicationContext - http://msdn.microsoft.com/en-us/library/vstudio/System.Windows.Forms.ApplicationContext(v=vs.100).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1
...
Рейтинг: 0 / 0
Установка иконки "чужого" окна
    #38426144
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Было б у него тоже самое хотя б на примере VB.NET написано
Не будет этого.
Изучай с# - в итоге сэкономишь время, даже если писать будешь на VB.NET
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Установка иконки "чужого" окна
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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