Дочернее окно внутри PictureBox'а

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Arcanoid
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 01.01.2005 (Сб) 15:44

Дочернее окно внутри PictureBox'а

Сообщение Arcanoid » 04.07.2005 (Пн) 13:09

И вопрос собстно в том, как правильно яго создать..

Я использую такой код:
Код: Выделить всё
Public Declare Function RegisterClassEx Lib "user32" Alias "RegisterClassExA" (ByRef lpWndClass As WNDCLASSEX) As Long

Public Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpszModuleName As Long) As Long

Public Declare Function GetStockObject Lib "gdi32" (ByVal fnObject As Long) As Long

Public Const WS_POPUP = 80000000
Public Const WS_CHILD = 40000000
Public Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" ( _
    ByVal dwExStyle As Long, _
    ByVal lpszClassName As String, _
    ByVal lpszWindowName As String, _
    ByVal dwStyle As Long, _
    ByVal x As Long, _
    ByVal y As Long, _
    ByVal nWidth As Long, _
    ByVal nHeight As Long, _
    ByVal hWndParent As Long, _
    ByVal hMenu As Long, _
    ByVal hInstance As Long, _
    ByVal lpParam As Long) As Long

Public Declare Function LoadCursor Lib "user32" Alias "LoadCursorA" (ByVal hModule As Long, ByVal lpStr As Long) As Long

Public Declare Function DefWindowProc Lib "user32" Alias "DefWindowProcA" (ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'------

Function WindowFunc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    WindowFunc = DefWindowProc(hWnd, uMsg, wParam, lParam)
End Function

Private Sub LetLong(ByRef lpLong As Long, ByVal nValue As Long)
    lpLong = nValue
End Sub

Public Sub Main()
    Dim n(100) As Byte, wnd As Long
    Dim wcl As WNDCLASSEX
   
    n(0) = Asc("C")
    n(1) = Asc("l")
    n(2) = Asc("s")
    n(3) = Asc("0")
    n(4) = Asc("0")
    n(5) = Asc("1")
    n(6) = 0
   
    wcl.cbSize = 48
    wcl.hInstance = GetModuleHandle(0)
    wcl.lpszClassName = VarPtr(n(0))
    LetLong wcl.lpfnWndProc, AddressOf Module1.WindowFunc
    wcl.style = CS_OWNDC Or CS_HREDRAW Or CS_VREDRAW

    wcl.hIcon = 0
    wcl.hCursor = LoadCursor(0, &H7F00) 'курсор IDC_ARROW
    wcl.lpszMenuName = 0

    wcl.cbClsExtra = 0
    wcl.cbWndExtra = 0
   
    wcl.hIconSm = 0

    wcl.hbrBackground = GetStockObject(0) 'кисть WHITE_BRUSH
    RegisterClassEx wcl
   
    Load Form1
    Form1.Show
    Form1.Hide
   
    wnd = CreateWindowEx(0, "Cls001", "Wnd0001", _
        WS_POPUP + WS_CHILD, _
        10, 10, 80, 40, _
        Form1.myPictureBox.hWnd, 0, 0, 0)
   
    Form1.Show vbModal
End Sub


Всё идёт нормально до вызова CreateWindowEx(). Во время вызова CreateWindowEx() ВБ вылетает с ошибкой! Что я здесь делаю неправильно?

При этом, если создавать окно НЕ дочернее, то есть так:
Код: Выделить всё
    ...
    wnd = CreateWindowEx(0, "Cls001", "Wnd0001", _
        WS_POPUP, _
        10, 10, 80, 40, _
        0, 0, 0, 0)
    ...

то оно вроде создаётся нормально (несколько раз вызывается WindowProc)

Заранее спасибо!
Invalid user or password...

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

Сообщение GSerg » 04.07.2005 (Пн) 13:13

Сначала скажи - зачем.
Потом скажи - зачем так.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 04.07.2005 (Пн) 14:19

WS_POPUP не может быть использовано вместе с WS_CHILD

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 04.07.2005 (Пн) 14:39

Интересно а как он будет работать если :
1. Константы стилей не объявлены
2. Нет дерегистрации класса
3. Константы стилей окна объявлены неправиоьно
4. Зачем мудрить с VarPtr , когда достаточно написать "Cls001"
5. Стиль WS_POPUP нельзя использовать к дочерним окнам т.к. окно с использованием этого стиля перестаёт принадлежать родителю по позиции
Вот работающий код сделанный из твоего :!: :
Код: Выделить всё
Public Declare Function RegisterClassEx Lib "user32" Alias "RegisterClassExA" (ByRef lpWndClass As WNDCLASSEX) As Long
Private Type WNDCLASSEX
    cbSize As Long
    style As Long
    lpfnWndProc As Long
    cbClsExtra As Long
    cbWndExtra As Long
    hInstance As Long
    hIcon As Long
    hCursor As Long
    hbrBackground As Long
    lpszMenuName As String
    lpszClassName As String
    hIconSm As Long
End Type

Private Const WS_VISIBLE As Long = &H10000000


Private Const CS_HREDRAW As Long = &H2
Private Const CS_VREDRAW As Long = &H1



Public Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpszModuleName As Long) As Long

Public Declare Function GetStockObject Lib "gdi32" (ByVal fnObject As Long) As Long

Public Const WS_POPUP = &H80000000
Public Const WS_CHILD = &H40000000
Public Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" ( _
    ByVal dwExStyle As Long, _
    ByVal lpszClassName As String, _
    ByVal lpszWindowName As String, _
    ByVal dwStyle As Long, _
    ByVal x As Long, _
    ByVal y As Long, _
    ByVal nWidth As Long, _
    ByVal nHeight As Long, _
    ByVal hWndParent As Long, _
    ByVal hMenu As Long, _
    ByVal hInstance As Long, _
    ByVal lpParam As Long) As Long

Public Declare Function LoadCursor Lib "user32" Alias "LoadCursorA" (ByVal hModule As Long, ByVal lpStr As Long) As Long

Public Declare Function DefWindowProc Lib "user32" Alias "DefWindowProcA" (ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'------

Function WindowFunc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    WindowFunc = DefWindowProc(hWnd, uMsg, wParam, lParam)
End Function

Private Sub LetLong(ByRef lpLong As Long, ByVal nValue As Long)
    lpLong = nValue
End Sub

Public Sub Main()
    Dim n(100) As Byte, wnd As Long
    Dim wcl As WNDCLASSEX
   

   
    wcl.cbSize = 48
    wcl.hInstance = GetModuleHandle(0)
    wcl.lpszClassName = "cls001" 'VarPtr(n(0))
    LetLong wcl.lpfnWndProc, AddressOf Module1.WindowFunc
    wcl.style = CS_HREDRAW Or CS_VREDRAW

    wcl.hIcon = 0
    wcl.hCursor = LoadCursor(0, &H7F00) 'курсор IDC_ARROW
    wcl.lpszMenuName = 0

    wcl.cbClsExtra = 0
    wcl.cbWndExtra = 0
   
    wcl.hIconSm = 0

    wcl.hbrBackground = GetStockObject(0) 'кисть WHITE_BRUSH
    RegisterClassEx wcl
   
    Load Form1
    Form1.Show
    Form1.Hide
   
    wnd = CreateWindowEx(0, "cls001", "Wnd0001", _
         WS_VISIBLE + WS_CHILD, _
        10, 10, 80, 40, _
      Form1.Picture1.hWnd, 0, App.hInstance, 0)
   
    Form1.Show vbModal
End Sub
Если всё делать своими ручками, они скоро отвалятся !

Arcanoid
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 01.01.2005 (Сб) 15:44

Сообщение Arcanoid » 04.07.2005 (Пн) 21:10

Ну блин я и деятель! Не заметил приставки "0x" в определениях констант в winuser.h! :oops:
Спасибо, Kovu!
Invalid user or password...


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

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

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 104

    TopList  
cron