Как сделать Common Dialog Always On Top ?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
DiQ
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 22.08.2003 (Пт) 13:09
Откуда: СПб

Как сделать Common Dialog Always On Top ?

Сообщение DiQ » 22.08.2003 (Пт) 13:13

Собственно, сабж. Что-то никак не получается.

Хой
Не математик
Не математик
 
Сообщения: 541
Зарегистрирован: 26.08.2002 (Пн) 0:21
Откуда: Россия

Сообщение Хой » 22.08.2003 (Пт) 13:37

иешь hWnd по названию или ещё как-нибудь и потом:
Код: Выделить всё
Const HWND_TOPMOST = -1
Const HWND_NOTOPMOST = -2
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2
Const SWP_NOACTIVATE = &H10
Const SWP_SHOWWINDOW = &H40
Private Declare Sub SetWindowPos Lib "User32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)

Private Sub Command1_Click()

'------------------   
'Здесь код показа Коммон Диалога
'------------------
    SetWindowPos hWnd Окна, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE
End Sub

DiQ
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 22.08.2003 (Пт) 13:09
Откуда: СПб

Сообщение DiQ » 22.08.2003 (Пт) 13:47

так в том-то и проблема - как бы отловить этот самый hwnd?

Хой
Не математик
Не математик
 
Сообщения: 541
Зарегистрирован: 26.08.2002 (Пн) 0:21
Откуда: Россия

Сообщение Хой » 22.08.2003 (Пт) 14:39

Ну опятьже, с помощью техже WinAPI
гляди:
Код: Выделить всё
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Sub Form_Load()
Dim textZagolovka As String
Dim hWndOkna as Integer
textZagolovka = "Текст заголовка формы"
hWndOkna = FindWindow(vbNullString, ret)
MsgBox hWndOkna
End Sub

DiQ
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 22.08.2003 (Пт) 13:09
Откуда: СПб

Сообщение DiQ » 22.08.2003 (Пт) 15:10

Да, да, все понятноно... Не работает.

Хоть с верхним вариантом кода, хоть с таким

Код: Выделить всё
Private Sub mnuSaveAs_Click()
    With CommonDialog1
        .DialogTitle = "Сохранить"
        .CancelError = False
        .Filter = "Save File (*.*)|*.*"
        .ShowSave

Dim textZagolovka As String
Dim hWndOkna As Integer
textZagolovka = "Сохранить"
hWndOkna = FindWindow(vbNullString, textZagolovka)
MsgBox hWndOkna
SetWindowPos hWndOkna, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE
   
        If Len(.FileName) = 0 Then
           Exit Sub
        End If
        sFile = .FileName
    End With
End Sub


Месседж Бокс выдает "0"

Хой
Не математик
Не математик
 
Сообщения: 541
Зарегистрирован: 26.08.2002 (Пн) 0:21
Откуда: Россия

Сообщение Хой » 22.08.2003 (Пт) 17:05

Ты знаещь, я долго перементировал, но так ничего и неполучилось...
вот бы по hDc найтибы hWnd тогда всё былобы путём, а такой АПИ а ещё ниразу невидел.....
------------
Там проблема в том, что после открытия диалога, приостонавливается работа приложения и собственно никакие функции далее не вызываются. А после закрытия диалога выполнение идёт дальше, но по скольку диалога уже нет, то и найти его невозможно....!
А ты ваще, где-нибудь такую пальбу видел?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 23.08.2003 (Сб) 14:47

Никогда этим не заморачивался...
Но если зачем-то нужно узнать hwnd по dc, то вот
Код: Выделить всё
Declare Function WindowFromDC Lib "user32" (ByVal hdc As Long) As Long
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение alibek » 23.08.2003 (Сб) 15:48

Когда ты делаешь ShowSave, у тебя показывается окно диалога и показывается модально. Т.е. твой код дальше не отрабатывает, пока ты не закроешь окно. Таким образом ты делаешь окно OnTop тогда, когда оно уже закрыто. Поэтому ничего удивительного, что у тебя ничего не выходит.
Если ты будешь открывать окно через API (функция GetSaveFileName), то в структуре OPENFILENAME ты можешь указать указатель на функцию обработки сообщений lpfnHook. И уже в этой функции делать окно OnTop.

Но, хотя я не уверен, мне кажется, что если родительское окно OnTop, то и дочернее тоже будет OnTop. Я разумею, попробуй посылать сообщение SetWindowPos hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE своему окну перед тем, как показать окно диалога.
Lasciate ogni speranza, voi ch'entrate.

DiQ
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 22.08.2003 (Пт) 13:09
Откуда: СПб

Сообщение DiQ » 24.08.2003 (Вс) 17:26

Тут такая ситуация не простая. Common Dialog вызывается из окна, которое является фоном всего проекта и ему же принадлежит меню. Так вот, я не могу сделать его On Top - оно закроет собой все другие окна, что не есть красиво. Про "модальность" диалога я понял сразу же, и неужели никак не обойти эту заковыку, кроме как открывать окно через GetSaveFileName?


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

    TopList