Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: CreateWindowEx Добавлено: 30.05.04 15:09  

Автор вопроса:  Дмитрий Щапов
Короче вообще надо создать форму(и даже не одну), в процессе выполнения.
Я вижу выход в стиле С++ Через всякие там CreateWindow.
Вообще создать получается, но(<=запарило уже) там входим в бесконечный цикл, а мне дальше продолжать надо.

Public Sub Main()
Dim aMsg As Msg
Dim lngTemp As Long
    If MyRegisterClass Then
        If MyCreateWindow Then
     XXX
'продолжить надо!!!
        End If
        MyUnregisterClass
    End If
End Sub
sub XXX
  Do While GetMessage(aMsg, 0, 0, 0)
if amsg.message=WM_QUIT then exit do
TranslateMessage aMsg
        DispatchMessage aMsg
   Loop
end sub


Я думал sub XXX в поток кинуть, но херсонина получается(почему-то я не удивился)
Добрым людям если подумают помочь > Пример из API Guide про createwindowex.Classical
Пример многопоточности("clsThreading" класс) я думаю у всех есть "Multithread".

Ответить

  Ответы Всего ответов: 13  

Номер ответа: 1
Автор ответа:
 Eddie



Вопросов: 11
Ответов: 120
 Профиль | | #1 Добавлено: 30.05.04 16:32
 А Другим способом не Пытался Создать Формы ??? Например ...as New Form , токо вот я не помню Она Создается в MDIForm'e или так без нее, я Помастрячу Получиться Подскажу , но посмотри пока ... as new form ...

Ответить

Номер ответа: 2
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #2
Добавлено: 30.05.04 17:28
Эх... а вот дальше после бесконечного цикла обычно стоит ExitProcess(0) :)

А все обрабатывается, делается, обрабатывается в процедуре обработки сообщений окошка... Напримерп те можно вызыватть процедуру при получении WM_CREATE или WM_SHOWWINDOW... на выбор ;)

Ответить

Номер ответа: 3
Автор ответа:
 Дмитрий Щапов



Вопросов: 71
Ответов: 321
 Профиль | | #3 Добавлено: 30.05.04 19:51
Другим способом БЕЗУСЛОВНО лучше(как-нибудь стандартными ср-ми, незамысловато), но не катит у меня и всё!
-Эх... а вот дальше после бесконечного цикла обычно стоит ExitProcess(0) :)
Не, ну это понятно! Это я привел пример без поточности, а с потоком у меня всё равно глюк.
А насчет "А все обрабатывается, дел...", дык помимо "процедуре обработки сообщений окошка" есть ещё изрядно надоевший бесконечный цикл,его не выкинешь... вроде...
Кстати глюк исключительно при "закрытии" окна т.е.
case WM_LMOUSEUP
     ;DestroyWindow hWnd
потом, как я понимаю моему окошку(моё окошко) посылается
case WM_DESTROY
     PostQuitMessage(0)
и после этого,как я понимаю, конец моему циклу без конца. Срабатывает if msg.msgmsg = WM_QUIT....
!!!А потом должен остановиться поток - вот на этот момент я и грешу.
Все сведения теоретические, но подтвержденные практикой.

А вообще, чем больше я ломаюсь над этой мурой, тем больше во мне возникает желание сделать окно как-нибудь "по-человечеси".

ЁПРСТ!!!!!Е@@ТЬ ВСЁ НА@@Й П@@Д@Ц ВАЩЕ БЛИИИИН
КАК ЖЕ ТАК???????????? ВАЩЕ ЗАСТРЕЛЮСЬ ПОДУ ОТ ТАКОЙ ТУПОСТИ!
                   !!!!ЛЮДИ!!!!
ЕСЛИ ЧТО СО МНОЙ БУДЕТ: ПРИЧИНА МОЕЙ СМЕРТИ>
Set Frm = New Form1
    Frm.Visible = True
И смешно и грустно

Ответить

Номер ответа: 4
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #4
Добавлено: 30.05.04 21:26
Это и есть по человечески! все так делают, а мы что? не человеки что-ли ;) И на VB так хорошо получается!

Ответить

Номер ответа: 5
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #5 Добавлено: 31.05.04 09:17

Странно, у меня создаются нормально. Правда, я создавал их из модуля, естественно, выполнение кода приостанавливалось до закрытия формы, затем продолжалось в обычном порядке...

Option Explicit
    Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" _
        (ByVal dwExStyle As Long, ByVal lpClassName As String, _
        ByVal lpWindowName 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, lpParam As Any) As Long
    Declare Function LoadIcon Lib "user32" Alias "LoadIconA" _
        (ByVal hInstance As Long, ByVal lpIconName As String) As Long
    Declare Function LoadCursor Lib "user32" Alias "LoadCursorA" _
        (ByVal hInstance As Long, ByVal lpCursorName As String) As Long
    Declare Function GetStockObject Lib "gdi32" (ByVal nIndex As Long) As Long
    Declare Function RegisterClassEx Lib "user32" Alias "RegisterClassExA" _
        (pcWndClassEx As WNDCLASSEX) As Integer
    Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, _
        ByVal nCmdShow As Long) As Long
    Declare Function UpdateWindow Lib "user32" (ByVal hwnd As Long) As Long
    Declare Function SetFocus Lib "user32" (ByVal hwnd As Long) As Long
    Declare Function PostMessage Lib "user32" Alias "PostMessageA" _
        (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
        ByVal lParam As Long) As Long
    Declare Function DefWindowProc Lib "user32" Alias "DefWindowProcA" _
        (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
        ByVal lParam As Long) As Long
    Declare Function GetMessage Lib "user32" Alias "GetMessageA" _
        (lpMsg As MSG, ByVal hwnd As Long, ByVal wMsgFilterMin As Long, _
        ByVal wMsgFilterMax As Long) As Long
    Declare Function TranslateMessage Lib "user32" (lpMsg As MSG) As Long
    Declare Function DispatchMessage Lib "user32" Alias "DispatchMessageA" _
        (lpMsg As MSG) As Long
    Declare Sub PostQuitMessage Lib "user32" (ByVal nExitCode As Long)
    Declare Function BeginPaint Lib "user32" (ByVal hwnd As Long, _
        lpPaint As PAINTSTRUCT) As Long
    Declare Function EndPaint Lib "user32" (ByVal hwnd As Long, _
        lpPaint As PAINTSTRUCT) As Long
    Declare Function GetClientRect Lib "user32" (ByVal hwnd As Long, _
        lpRect As RECT) As Long
    Declare Function DrawText Lib "user32" Alias "DrawTextA" _
        (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, _
        lpRect As RECT, ByVal wFormat As Long) As Long
                                                       
    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
   
    Type POINTAPI
            x As Long
            y As Long
    End Type
   
    Type MSG
        hwnd As Long
        message As Long
        wParam As Long
        lParam As Long
        time As Long
        pt As POINTAPI
    End Type
   
    Type RECT
            Left As Long
            Top As Long
            Right As Long
            Bottom As Long
    End Type
   
    Type PAINTSTRUCT
            hdc As Long
            fErase As Long
            rcPaint As RECT
            fRestore As Long
            fIncUpdate As Long
            rgbReserved(32) As Byte 'this was declared incorrectly in VB API viewer
    End Type
   
    Public Const WS_VISIBLE As Long = &H10000000
    Public Const WS_VSCROLL As Long = &H200000
    Public Const WS_TABSTOP As Long = &H10000
    Public Const WS_THICKFRAME As Long = &H40000
    Public Const WS_MAXIMIZE As Long = &H1000000
    Public Const WS_MAXIMIZEBOX As Long = &H10000
    Public Const WS_MINIMIZE As Long = &H20000000
    Public Const WS_MINIMIZEBOX As Long = &H20000
    Public Const WS_SYSMENU As Long = &H80000
    Public Const WS_BORDER As Long = &H800000
    Public Const WS_CAPTION As Long = &HC00000                  '  WS_BORDER Or WS_DLGFRAME
    Public Const WS_CHILD As Long = &H40000000
    Public Const WS_CHILDWINDOW As Long = (WS_CHILD)
    Public Const WS_CLIPCHILDREN As Long = &H2000000
    Public Const WS_CLIPSIBLINGS As Long = &H4000000
    Public Const WS_DISABLED As Long = &H8000000
    Public Const WS_DLGFRAME As Long = &H400000
    Public Const WS_EX_ACCEPTFILES As Long = &H10&
    Public Const WS_EX_DLGMODALFRAME As Long = &H1&
    Public Const WS_EX_NOPARENTNOTIFY As Long = &H4&
    Public Const WS_EX_TOPMOST As Long = &H8&
    Public Const WS_EX_TRANSPARENT As Long = &H20&
    Public Const WS_GROUP As Long = &H20000
    Public Const WS_HSCROLL As Long = &H100000
    Public Const WS_ICONIC As Long = WS_MINIMIZE
    Public Const WS_OVERLAPPED As Long = &H0&
    Public Const WS_OVERLAPPEDWINDOW As Long = (WS_OVERLAPPED Or WS_CAPTION Or WS_SYSMENU Or WS_THICKFRAME Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX)
    Public Const WS_POPUP As Long = &H80000000
    Public Const WS_POPUPWINDOW As Long = (WS_POPUP Or WS_BORDER Or WS_SYSMENU)
    Public Const WS_SIZEBOX As Long = WS_THICKFRAME
    Public Const WS_TILED As Long = WS_OVERLAPPED
    Public Const WS_TILEDWINDOW As Long = WS_OVERLAPPEDWINDOW
    Public Const CW_USEDEFAULT As Long = &H80000000
    Public Const CS_HREDRAW As Long = &H2
    Public Const CS_VREDRAW As Long = &H1
    Public Const IDI_APPLICATION As Long = 32512&
    Public Const IDC_ARROW As Long = 32512&
    Public Const WHITE_BRUSH As Integer = 0
    Public Const BLACK_BRUSH As Integer = 4
    Public Const WM_KEYDOWN As Long = &H100
    Public Const WM_CLOSE As Long = &H10
    Public Const WM_DESTROY As Long = &H2
    Public Const WM_PAINT As Long = &HF
    Public Const SW_SHOWNORMAL As Long = 1
    Public Const DT_CENTER As Long = &H1
    Public Const DT_SINGLELINE As Long = &H20
    Public Const DT_VCENTER As Long = &H4
   
    Sub Main()
        Call vbWinMain
        MsgBox "End"
    End Sub
    
    Public Function vbWinMain() As Long
   
        Const CLASSNAME = "Hello_VB"
        Const TITLE = "Hello VB"
        Dim hwnd As Long
        Dim wc As WNDCLASSEX
        Dim message As MSG
    
        ' Set up and register window class
        wc.cbSize = Len(wc)
        wc.style = CS_HREDRAW Or CS_VREDRAW
        wc.lpfnWndProc = GetFuncPtr(AddressOf WindowProc)
        wc.cbClsExtra = 0&
        wc.cbWndExtra = 0&
        wc.hInstance = App.hInstance
        wc.hIcon = LoadIcon(App.hInstance, IDI_APPLICATION)
        wc.hCursor = LoadCursor(App.hInstance, IDC_ARROW)
        wc.hbrBackground = GetStockObject(WHITE_BRUSH)
        wc.lpszMenuName = 0&
        wc.lpszClassName = CLASSNAME
        wc.hIconSm = LoadIcon(App.hInstance, IDI_APPLICATION)
       
        RegisterClassEx wc
       
        ' Create a window
        hwnd = CreateWindowEx(0&, _
                            CLASSNAME, _
                            TITLE, _
                            WS_OVERLAPPEDWINDOW, _
                            CW_USEDEFAULT, _
                            CW_USEDEFAULT, _
                            CW_USEDEFAULT, _
                            CW_USEDEFAULT, _
                            0&, _
                            0&, _
                            App.hInstance, _
                            0&;)
       
        ' Show the window
        ShowWindow hwnd, SW_SHOWNORMAL
        UpdateWindow hwnd
        SetFocus hwnd
       
        'enter message loop
        '(all window messages are handles in WindowProc())
        Do While 0 <> GetMessage(message, 0&, 0&, 0&;)
            TranslateMessage message
            DispatchMessage message
        Loop
       
        vbWinMain = message.wParam
    End Function
   
    Public Function WindowProc(ByVal hwnd As Long, ByVal message As Long, _
        ByVal wParam As Long, ByVal lParam As Long) As Long
        'Main message handler for this program
        Dim ps As PAINTSTRUCT
        Dim rc As RECT
        Dim hdc As Long
        Dim str As String
       
        Select Case message
            'Handle 3 select messages "manually"
            Case WM_PAINT
                hdc = BeginPaint(hwnd, ps)
                Call GetClientRect(hwnd, rc)
                str = "Hello Visual Basic 5!"
                Call DrawText(hdc, str, Len(str), rc, DT_SINGLELINE _
                    Or DT_CENTER Or DT_VCENTER)
                Call EndPaint(hwnd, ps)
                Exit Function
       
            Case WM_KEYDOWN
                Call PostMessage(hwnd, WM_CLOSE, 0, 0)
                Exit Function
               
            Case WM_DESTROY
                PostQuitMessage 0&
                Exit Function
               
            Case Else
            'pass all other messages to default window procedure
                WindowProc = DefWindowProc(hwnd, message, wParam, lParam)
        End Select
    End Function
    
    Function GetFuncPtr(ByVal lngFnPtr As Long) As Long
        'wrapper function to allow AddressOf to be used within VB
        GetFuncPtr = lngFnPtr
    End Function

Ответить

Номер ответа: 6
Автор ответа:
 Дмитрий Щапов



Вопросов: 71
Ответов: 321
 Профиль | | #6 Добавлено: 31.05.04 09:26
А ты реши другой пример > Опять Объекты

Ответить

Номер ответа: 7
Автор ответа:
 Дмитрий Щапов



Вопросов: 71
Ответов: 321
 Профиль | | #7 Добавлено: 31.05.04 09:30
" естественно, выполнение кода приостанавливалось до закрытия формы,"
Воот - воот, что мне и не нравилось

Ответить

Номер ответа: 8
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #8 Добавлено: 31.05.04 11:49
ну а как ты хотел... VB не поддерживает многопоточность стандратными средствами. Использование её в программе не рекомендуется в следствие крайней нестабильности. Лучше перекинь остальной код на событие Load создаваемой формы.

Ответить

Номер ответа: 9
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #9
Добавлено: 31.05.04 12:27
Блин! ну и что что выполнение приолстанавливается ??? после цикла там вообще ничего не должно быть, никакого кода!!! Какая еще много поточность, зачем она там !?

Вот что значит VB скрывает код своих форм :)))

1. Если форма у тебя первая в проекте, то ты ее создаешь, и ориентируешься по событиям, ты же ведь когда программишь на обычной форме, не лезешь во внутрь кода, чтобы дописать пару строчек кода, за пределы того самого цикла :)
Ты просто аккуратненько вписываешь свой код в уже подготовленные для тебя события...

2. Если форм несколько, то одна (первая) с циклом, а остальным он совсем не обязателен !!! Если конечно же ты не хочешь сделать форму модальной!!! Т.е. просто не ставь этот цикл! Только не забудь потом все подестроить...

Ответить

Номер ответа: 10
Автор ответа:
 Дмитрий Щапов



Вопросов: 71
Ответов: 321
 Профиль | | #10 Добавлено: 31.05.04 19:20
Насчет многопоточности: Ну я пользовался одним примерчиком, там всё работает, только при выходе нужно не забыть удалить поток, а так всё ОК.

А теперь sne с тобой разберусь...
   __________
|\/ \/|
| | o\ /o | |
 \| | |/
  | /------\ |
  \----------/

Значит так: создать форму по обычному я немогу(на тот момент), остается через createWindow. Всякий код по созданию, обработки я кинул в класс, сделал события, чтоб работать нормально.

Вот работает моя прога, работает и тут бац, приспичило ей новую форму создать она вызывает метод из КЛАССА.КЛАСС в бесконечность, а у неё горы не переработанный команд. Во блин пострял.

Всё. забросил я давно автоCreateWndow.

Ответить

Номер ответа: 11
Автор ответа:
 Дмитрий Щапов



Вопросов: 71
Ответов: 321
 Профиль | | #11 Добавлено: 31.05.04 19:21

НУ БЛИН! Вся картинка измазалась!

Ответить

Номер ответа: 12
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #12
Добавлено: 22.04.05 20:11
Это не архололгия. Я ищу инфу по этой функции. Код чайника из секи работает, но как только удаляю строку msgbox "End" то вб вылетает :(

А вообще (извиняюсь, что вопрос большей частью не по ВБ) мне больше интересно как из под делфи создать форму? А если я создам консольное приложение и сотру диррективу, о том что оно консольное можно как нить форму создать?
Буду очень благодарен за помощь!!!

Ответить

Номер ответа: 13
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #13
Добавлено: 22.04.05 21:12
Создаешь главную форму, далее зацикливаешь...

Все остальное работает в WndProc, т.е. отлавливаешь WM_CREATE, WM_COMMAND и реагируешь на них...
При создании остальных окошек циклить надобности нет...

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам