PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Многооконное приложение


Многооконное приложение

Сообщений 1 страница 30 из 76

1

Я вот собираюсь сделать программку, и окон в ней планируется бесчисленное множество. А именно дочерних окон как на картинке http://www.litmir.net/BookBinary/114992/1333245877/i_019.png. Плюс, некоторые окна должны будут блокировать окно-родителя, а так же не позволять открывать себя более одного раза.
И сам вопрос: есть ли какая-нибудь готовая метода как это сделать?

0

2

Посмотри MDIGadget().

+1

3

А как привязать одно окно к другому окну?

0

4

В каком плане привязать?
Если речь про MDI, то окна создаются функцией AddGadgetItem.

Код:
#Main = 0
#MDIChild = 1
If OpenWindow(#Main, 0, 0, 400, 300, "MDIGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
  If CreateMenu(#Main, WindowID(#Main))
    MenuTitle("Menu index 0")
    MenuTitle("MDI windows menu")
    MenuItem(0, "self created item")
    MenuItem(1, "self created item")
    
    MDIGadget(0, 0, 0, 0, 0, 1, 2, #PB_MDI_AutoSize)
    For i = 1 To 8
      AddGadgetItem(0, #MDIChild+i, "child window "+Str(i))
    Next 
    ; add gadgets here...
    UseGadgetList(WindowID(#Main)) ; go back to the main window gadgetlist
  EndIf
  Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
EndIf

0

5

Пётр Как в современных IDE (окно свойств, окно элементов, окно подсказок). Которые можно отделить от главной формы или присоединить снизу, справа или слева.

0

6

А чье замолчали?

0

7

Это необходимо реализовывать в коде.
В винде готовых решений нет.

0

8

Пётр а как можно реализовать или что и где можно прочитать про эту реализацию.

0

9

Пётр Чье замолчал?

0

10

Я подобное не реализовывал в своих проектах.

0

11

Пётр

Я подобное не реализовывал в своих проектах.

Это понятно, а какие нибудь соображения, нету, на этот счет?

0

12

Попробуй что нибудь придумать, очень интересно как это будет выглядит .

0

13

Пётр
Из этого можно что нибудь придумать

Код:
Procedure WinProc(hwnd, msg, wParam, lParam)
  Shared *PointOldWinFunc
  Protected MainWin.RECT, ChildWin.RECT
  Protected NewPosWin.POINT, Mouse.POINT
  
  If msg = #WM_MOVE
    GetWindowRect_(WindowID(0), @MainWin)
    GetWindowRect_(WindowID(1), @ChildWin)
    
    NewPosWin\x = ChildWin\left
    NewPosWin\y = ChildWin\top
    
    State=0
    If MainWin\left > ChildWin\left
      NewPosWin\x = MainWin\left
      State=1
    EndIf
    
    If MainWin\top > ChildWin\top
      NewPosWin\y = MainWin\top
      State=1
    EndIf
    
    If MainWin\right < ChildWin\right
      NewPosWin\x = MainWin\Right - (ChildWin\right - ChildWin\left)
      State=1
    EndIf
    
    If MainWin\bottom < ChildWin\bottom
      NewPosWin\y = MainWin\bottom - (ChildWin\bottom - ChildWin\top)
      State=1
    EndIf
    
    If State=1
      ;GetCursorPos_(@Mouse)
      ;mouse_event_(#MOUSEEVENTF_ABSOLUTE | #MOUSEEVENTF_LEFTUP, Mouse\x, Mouse\y,0,0)
      SetWindowPos_(hwnd, #HWND_TOP, NewPosWin\x, NewPosWin\y, 0, 0, #SWP_NOSIZE)
      msg = 0
      ;Debug "Блокирование перемещения окна"
    EndIf
    
  EndIf
  
  ProcedureReturn CallWindowProc_(*PointOldWinFunc,hwnd, msg, wParam, lParam)
EndProcedure
 
OpenWindow(0, 0, 0, 800, 600, "", #PB_Window_ScreenCentered)
OpenWindow(1, 0, 0, 80, 60, "",#PB_Window_WindowCentered, WindowID(0))
 
*PointOldWinFunc = GetWindowLongPtr_(WindowID(1), #GWL_WNDPROC)
SetWindowLongPtr_(WindowID(1), #GWL_WNDPROC, @WinProc() )
 
Repeat
  Event=WaitWindowEvent()
Until Event=#PB_Event_CloseWindow

0

14

Зачем же все так усложнять?

Код:
OpenWindow(0, 0, 0, 800, 600, "", #PB_Window_ScreenCentered)
OpenWindow(1, 0, 0, 80, 60, "",#PB_Window_WindowCentered, WindowID(0))

SetParent_(WindowID(1), WindowID(0))
 
Repeat
  Event=WaitWindowEvent()
Until Event=#PB_Event_CloseWindow

0

15

А зачем 2 раза делать окно дочерним (первый раз при открытии, второй раз при юзании SetParent_()) ?

0

16

Пётр

Код:
OpenWindow(0, 0, 0, 800, 600, "Главное окно",#PB_Window_Invisible | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered)
OpenWindow(1, 0, 0, 280, 60, "Дочернее окно",#PB_Window_Invisible | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget, WindowID(0))

SetParent_(WindowID(1), WindowID(0))
HideWindow(0,0)
HideWindow(1,0)
    
Repeat
  Event=WaitWindowEvent()
Until Event=#PB_Event_CloseWindow

Почему дочерное окно, принимает отступ с верху и отступ с лева, главного окна при растягивании дочерного окна?

0

17

Пётр
Ну очень надо.

Отредактировано mestnyi (20.08.2013 17:58:44)

0

18

Имеется  в виду этот код?

0

19

Пётр
Да.

0

20

На WinAPI такое поведение не наблюдается.

Код:
Procedure WindowCallback(hWnd, Msg, wParam, lParam)
  
  Select Msg
    Case #WM_CLOSE 
      DestroyWindow_(hWnd) 
    Case #WM_DESTROY 
      PostQuitMessage_(0) : Result  = 0 
    Default 
      Result  = DefWindowProc_(hWnd, Msg, wParam, lParam) 
  EndSelect 
  
  ProcedureReturn Result 
EndProcedure  

Procedure Win(Class.s, Win)
  wc.WNDCLASSEX 
  wc\cbsize        = SizeOf(WNDCLASSEX) 
  wc\lpfnWndProc   = @WindowCallback() 
  wc\hCursor       = LoadCursor_(0, #IDC_ARROW) 
  wc\hbrBackground = #COLOR_WINDOW
  wc\lpszClassName = @Class 
  RegisterClassEx_(@wc) 
  ProcedureReturn CreateWindowEx_(0, Class, "", #WS_VISIBLE|#WS_SYSMENU | #WS_MINIMIZEBOX|#WS_MAXIMIZEBOX|#WS_SIZEBOX, 0, 0, 200, 120, Win,0,  0, 0)
EndProcedure

hWnd=Win("Win1", 0)
w=Win("Win1", hWnd)

SetParent_(w, hWnd)

While GetMessage_(msg.MSG, #Null, 0, 0) 
  TranslateMessage_(msg) 
  DispatchMessage_(msg) 
Wend

Значит это одна из корректировок в PB либе. Можешь написать на официальном форуме. Возможно подскажут что делать.

0

21

Пётр
Я там не смог регистрацию сделать, можешь поможешь?

0

22

Код:
Case #WM_SIZE 
     RedrawWindow_(w, 0, 0, #RDW_ALLCHILDREN|#RDW_UPDATENOW) ; Уменьшаем мерцания окна с помошью Api при изменении его размеров.

Почему не действует? Имеется в виду не убирает мерцание, везде работало же.

0

23

mestnyi написал(а):

Я там не смог регистрацию сделать, можешь поможешь?

Где? На http://forums.purebasic.com?
Мыло какое использовал при регистрации? Лучше всего от гугла. как зарегится на оф сайте?

mestnyi написал(а):

Почему не действует?

SmartWindowRefresh() есть в коде?

0

24

Пётр

SmartWindowRefresh() есть в коде?

это ерунда она почти не помогает, а вот

RedrawWindow_(w, 0, 0, #RDW_ALLCHILDREN|#RDW_UPDATENOW)

чётко срабативает даже с гаджетамы .
вот handle - w -дочерного окна получаю 0, почему?

SetParent_(w, hWnd) убирает стиль дочерного окна, возможно ли этому помешать.

0

25

mestnyi написал(а):

вот handle - w -дочерного окна получаю 0, почему?

Потому что что-то  неправильно делаешь. Без кода больше нечего добавить.

mestnyi написал(а):

SetParent_(w, hWnd) убирает стиль дочерного окна

Какой именно стиль?

0

26

Без кода больше нечего добавить.

вот

Код:
Declare WindowCallback(hWnd, Msg, wParam, lParam)

Procedure WinChild(Class.s, x, y, width, height,Caption$,Win)
  wc.WNDCLASSEX 
  wc\cbsize        = SizeOf(WNDCLASSEX) 
  wc\lpfnWndProc   = @WindowCallback() 
  wc\hCursor       = LoadCursor_(0, #IDC_ARROW) 
  wc\hbrBackground = #COLOR_WINDOW
  wc\lpszClassName = @Class 
  RegisterClassEx_(@wc) 
  ProcedureReturn CreateWindowEx_(0, Class, Caption$, #WS_VISIBLE|#WS_SYSMENU | #WS_MINIMIZEBOX|#WS_MAXIMIZEBOX|#WS_SIZEBOX, x, y, width, height, Win,0,  0, 0)
EndProcedure

Procedure WinMain(Class.s, x, y, width, height,Caption$, Win)
  wc.WNDCLASSEX 
  wc\cbsize        = SizeOf(WNDCLASSEX) 
  wc\lpfnWndProc   = @WindowCallback() 
  wc\hCursor       = LoadCursor_(0, #IDC_ARROW) 
  wc\hbrBackground = #COLOR_WINDOW
  wc\lpszClassName = @Class 
  RegisterClassEx_(@wc) 
  ProcedureReturn CreateWindowEx_(0, Class, Caption$, #WS_VISIBLE|#WS_SYSMENU | #WS_MINIMIZEBOX|#WS_MAXIMIZEBOX|#WS_SIZEBOX, x, y, width, height, Win,0,  0, 0)
EndProcedure


hWnd=WinMain("Win1", 0, 0, 800, 600,"Средствами WinAPI - "+Chr(34)+" Главное окно "+Chr(34), 0)
w=WinChild("Win2", 0, 0, 280, 60, "Дочернее окно", hWnd)

SetParent_(w, hWnd)

While GetMessage_(msg.MSG, #Null, 0, 0) 
  TranslateMessage_(msg) 
  DispatchMessage_(msg)
  
Wend
Procedure WindowCallback(hWnd, Msg, wParam, lParam)
  
  Select Msg
    Case #WM_CLOSE 
      DestroyWindow_(hWnd) 
    Case #WM_DESTROY 
      PostQuitMessage_(0) : Result  = 0 
    Case #WM_SIZE 
     Debug w  
     RedrawWindow_(w, 0, 0, #RDW_ALLCHILDREN|#RDW_UPDATENOW) ; Уменьшаем мерцания окна с помошью Api при изменении его размеров.
     
    Default 
      Result  = DefWindowProc_(hWnd, Msg, wParam, lParam) 
  EndSelect 
  
  ProcedureReturn Result 
EndProcedure

0

27

Какой именно стиль?

не знаю, но вид меняться на win8.

0

28

mestnyi написал(а):

w -дочерного окна получаю 0, почему?

Потому что область видимости переменной w ограничивается глобальной областью. У процедур своя (локальная) область видимости.
Об этом написано здесь. http://pure-basic.narod.ru/docs/books/6.htm
Нужно переменную w сделать глобальной. Но в этом смысла нет, т. к. в аргументе hWnd будет хендл текущего окна. Замени в RedrawWindow, переменную w на hWnd.

mestnyi написал(а):

вид меняться на win8

На XP стили не меняются.

0

29

Пётр только так получается правильно получит handle обоих окон, мерцание не уходит. 

Код:
Declare WinMainCallback(hWnd, Msg, wParam, lParam)
Declare WinChildCallback(hWnd, Msg, wParam, lParam)



Procedure WinMain(Class.s, x, y, width, height,Caption$, Win)
  wc.WNDCLASSEX 
  wc\cbsize        = SizeOf(WNDCLASSEX) 
  wc\lpfnWndProc   = @WinMainCallback() 
  wc\hCursor       = LoadCursor_(0, #IDC_ARROW) 
  wc\hbrBackground = #COLOR_WINDOW
  wc\lpszClassName = @Class 
  RegisterClassEx_(@wc) 
  ProcedureReturn CreateWindowEx_(0, Class, Caption$, #WS_VISIBLE|#WS_SYSMENU | #WS_MINIMIZEBOX|#WS_MAXIMIZEBOX|#WS_SIZEBOX, x, y, width, height, Win,0,  0, 0)
EndProcedure

Procedure WinChild(Class.s, x, y, width, height,Caption$,Win)
  wc.WNDCLASSEX 
  wc\cbsize        = SizeOf(WNDCLASSEX) 
  wc\lpfnWndProc   = @WinChildCallback() 
  wc\hCursor       = LoadCursor_(0, #IDC_ARROW) 
  wc\hbrBackground = #COLOR_WINDOW
  wc\lpszClassName = @Class 
  RegisterClassEx_(@wc) 
  ProcedureReturn CreateWindowEx_(0, Class, Caption$, #WS_VISIBLE|#WS_SYSMENU | #WS_MINIMIZEBOX|#WS_MAXIMIZEBOX|#WS_SIZEBOX, x, y, width, height, Win,0,  0, 0)
EndProcedure

hWnd1=WinMain("Win1", 0, 0, 800, 600,"Средствами WinAPI - "+Chr(34)+" Главное окно "+Chr(34), 0)
hWnd=WinChild("Win2", 0, 0, 280, 60, "Дочернее окно", hWnd1)

SetParent_(hWnd, hWnd1)

While GetMessage_(msg.MSG, #Null, 0, 0) 
  TranslateMessage_(msg) 
  DispatchMessage_(msg)
Wend

Procedure WinMainCallback(hWnd, Msg, wParam, lParam)
  
  Select Msg
    Case #WM_CLOSE 
      DestroyWindow_(hWnd) 
    Case #WM_DESTROY 
      PostQuitMessage_(0) : Result  = 0 
    Case #WM_SIZE 
     Debug hWnd 
     RedrawWindow_(hWnd, 0, 0, #RDW_UPDATENOW|#RDW_UPDATENOW) ; Уменьшаем мерцания окна с помошью Api при изменении его размеров.
     
    Default 
      Result  = DefWindowProc_(hWnd, Msg, wParam, lParam) 
  EndSelect 
  
  ProcedureReturn Result 
EndProcedure

Procedure WinChildCallback(hWnd, Msg, wParam, lParam)
  
  Select Msg
    Case #WM_CLOSE 
      DestroyWindow_(hWnd) 
    Case #WM_DESTROY 
      PostQuitMessage_(0) : Result  = 0 
    Case #WM_SIZE 
     Debug hWnd 
     RedrawWindow_(hWnd, 0, 0, #RDW_UPDATENOW|#RDW_UPDATENOW) ; Уменьшаем мерцания окна с помошью Api при изменении его размеров.
     
    Default 
      Result  = DefWindowProc_(hWnd, Msg, wParam, lParam) 
  EndSelect 
  
  ProcedureReturn Result 
EndProcedure

Отредактировано mestnyi (22.08.2013 21:15:33)

0

30

С handle не могу никак разобраться. Почему не работает?

Код:
Procedure  hDrawPoints(hWnd)
    If LoadFont(1, "Arial", 8)
    If CreateImage(0, WindowWidth(WindowID(hWnd)), WindowHeight(WindowID(hWnd))) And StartDrawing(ImageOutput(0))
      DrawingMode(#PB_2DDrawing_Transparent)
      Box(0, 0, WindowWidth(WindowID(hWnd)), WindowHeight(WindowID(hWnd)), RGB(245,245,245))
     For i = 8 To (WindowWidth(WindowID(hWnd))) Step 10
        DrawingFont(FontID(1))
        DrawText( i,-2, ".", RGB(55, 55, 55))
      For j = 8 To (WindowHeight(WindowID(hWnd))) Step 10
        DrawingFont(FontID(1))
        DrawText( i,j, ".", RGB(55, 55, 55))
      Next
     Next 
      StopDrawing() 
      ImageGadget(#PB_Any, 0, 0, 200, 200, ImageID(0))
    EndIf
   EndIf
 EndProcedure 
 
Procedure WinChildCallback(hWnd, Msg, wParam, lParam)
  
  Select Msg
    Case #WM_CLOSE 
      DestroyWindow_(hWnd) 
    Case #WM_DESTROY 
      PostQuitMessage_(0) : Result  = 0 
    Case #WM_SIZE 
     hDrawPoints(hWnd)
    Default 
      Result  = DefWindowProc_(hWnd, Msg, wParam, lParam) 
  EndSelect 
  
  ProcedureReturn Result 
EndProcedure 
 

Procedure WinChild(Class.s, x, y, width, height,Caption$,Win)
  wc.WNDCLASSEX 
  wc\cbsize        = SizeOf(WNDCLASSEX) 
  wc\lpfnWndProc   = @WinChildCallback() 
  wc\hCursor       = LoadCursor_(0, #IDC_ARROW) 
  wc\hbrBackground = #COLOR_WINDOW
  wc\lpszClassName = @Class 
  RegisterClassEx_(@wc) 
  ProcedureReturn CreateWindowEx_(0, Class, Caption$, #WS_VISIBLE|#WS_SYSMENU | #WS_MINIMIZEBOX|#WS_MAXIMIZEBOX|#WS_SIZEBOX, x, y, width, height, Win,0,  0, 0)
EndProcedure




hWnd1=WinChild("Win2", 0, 0, 480, 220, "Дочернее окно", hWnd)

 


While GetMessage_(msg.MSG, #Null, 0, 0) 
  TranslateMessage_(msg) 
  DispatchMessage_(msg)
Wend

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Многооконное приложение