linker problem

Everything else that doesn't fall into one of the other PB categories.
localmotion34
Enthusiast
Enthusiast
Posts: 665
Joined: Fri Sep 12, 2003 10:40 pm
Location: Tallahassee, Florida

linker problem

Post by localmotion34 »

i get an error message when i try to use a library i made with tailbite. it says "likner error: undefined reference to TB/temp dockwindow_lib mywindowproc"

Code: Select all

Global Dock.TB_GadgetVT

Structure dockwindow
  parenthandle.l
  x.l
  y.l
  Width.l
  Height.l
  Caption.s
EndStructure

Procedure MyWindowProc(parenthandle,msg,wParam,lParam)  
  Select msg
    Case #WM_LBUTTONDOWN
      SendMessage_(parenthandle,#WM_PARENTNOTIFY,wParam,lParam)
  EndSelect 
  ProcedureReturn  DefWindowProc_(parenthandle,msg,wParam,lParam) 
EndProcedure

ProcedureDLL createdockedwindow(parenthandle,x,y,Width,Height,Title$); Create a window in a "Docked" state 
  ClassName.s = "Dockwindow" 
  wc.WNDCLASSEX 
  wc\cbSize = SizeOf(WNDCLASSEX) 
  wc\style = #CS_HREDRAW | #CS_VREDRAW | #CS_GLOBALCLASS 
  wc\lpfnWndProc = @MyWindowProc()
  wc\cbClsExtra = 0 
  wc\cbWndExtra = 0 
  wc\hInstance = GetModuleHandle_(0) 
  wc\hIcon = 0 
  wc\hbrBackground = GetStockObject_(#LTGRAY_BRUSH);#WHITE_BRUSH); 
  wc\lpszMenuName = 0 
  wc\lpszClassName = @ClassName 
  wc\hIconSm = 0 
  If RegisterClassEx_(@wc) 
  Else 
    MessageRequester("","Failed to register the window class...",0) 
    End 
  EndIf 
  hInstance.l = GetModuleHandle_(0) 
  hwnd = CreateWindowEx_(#WS_EX_TOOLWINDOW,"Dockwindow",Title$,#WS_EX_WINDOWEDGE|#WS_CHILD|#WS_EX_CLIENTEDGE|#WS_POPUPWINDOW|#WS_VISIBLE,x,y,Width,Height,0,0,GetModuleHandle_(0),0) 
  Brush.LOGBRUSH\lbColor = GetSysColor_(#COLOR_BTNFACE) 
  SetClassLong_(hwnd, #GCL_HBRBACKGROUND, CreateBrushIndirect_(Brush)) 
  RedrawWindow_(hwnd,0,0,7)
  SetParent_(hwnd,parenthandle) 
  SetWindowLong_( hwnd,#GWL_STYLE, #WS_DLGFRAME|#WS_CLIPCHILDREN|#WS_CLIPSIBLINGS ) 
  ShowWindow_(hwnd,#SW_SHOW)
  MoveWindow_(hwnd,x,y,Width,Height, #True )
  ProcedureReturn hwnd 
EndProcedure 

ProcedureDLL dock_window(dockhandle,parenthandle,x,y,Width,Height);Docks Your Window and Makes it Immobile 
  Brush.LOGBRUSH\lbColor = GetSysColor_(#COLOR_BTNFACE)  
  RedrawWindow_(dockhandle,0,0,7)
  SetParent_(dockhandle,parenthandle) ;DOESNT WORK
  SetWindowLong_( dockhandle,#GWL_STYLE, #WS_DLGFRAME|#WS_CLIPCHILDREN|#WS_CLIPSIBLINGS ) 
  ShowWindow_(dockhandle,#SW_SHOW)
  MoveWindow_(dockhandle,x,y,Width,Height, #True )
EndProcedure 

ProcedureDLL closedockwindow(dockwindownumber); Close a Dockwindow
  DestroyWindow_(dockwindownumber)
EndProcedure

ProcedureDLL undockwindow(dockhandle,x,y,Width,Height);Undocks Your Window and Makes it a Free Toolwindow
  ShowWindow_(dockhandle,#SW_HIDE)
  SetWindowLong_(dockhandle,#GWL_STYLE,#WS_BORDER|#WS_CAPTION|#WS_DLGFRAME|#WS_CLIPCHILDREN|#WS_CLIPSIBLINGS )
  RedrawWindow_(dockhandle,0,0,7)
  MoveWindow_(dockhandle,x,y,Width,Height, #True )
  RedrawWindow_(dockhandle,0,0,7)
  SetParent_(dockhandle,#NULL)
  ShowWindow_(dockhandle,#SW_SHOW)
EndProcedure

ProcedureDLL undockToMDI(dockhandle,MDIGadget,newMDIx,newMDIy,newMDIWidth,newMDIHeight);Undocks Your Window and sets its parent to a local MDIgadget 
 ShowWindow_(dockhandle,#SW_HIDE)
leftoffset=GetSystemMetrics_(#SM_CXMIN)
  SetWindowLong_(dockhandle,#GWL_STYLE,#WS_BORDER|#WS_CAPTION|#WS_DLGFRAME|#WS_CLIPCHILDREN|#WS_CLIPSIBLINGS )
  MoveWindow_(dockhandle,0,0,leftoffset,newMDIHeight-20, #True )
  ResizeGadget(MDIGadget,newMDIx,newMDIy,newMDIWidth, newMDIHeight)
  SetParent_(dockhandle,GadgetID(MDIGadget))
  RedrawWindow_(dockhandle,0,0,7)
  ShowWindow_(dockhandle,#SW_SHOW)
EndProcedure 

ProcedureDLL dynamicRelease(dockhandle,MDIGadget);undocks the window and automatically resizes the MDI Gadget to the MDI width + the width of the dockwindow

EndProcedure 

ProcedureDLL dynamicDock(dockhandle,MDIGadget);docks the window and automatically resizes the MDI Gadget to the MDI width - the width of the dockwindow
EndProcedure 

ProcedureDLL getDockstate(dockhandle);returns a dockwindow state
  ProcedureReturn dockstate 
EndProcedure

ProcedureDLL flipDockstate(dockhandle,parenthandle);flips a dockwindow state to the opposite
  dockstate =GetWindowLong_(dockhandle,#GWL_HWNDPARENT)
  If dockstate=parenthandle
    SetActiveWindow_(dockhandle)
    x=WindowX()
    y=WindowY()
    SetWindowLong_(dockhandle,#GWL_STYLE,#WS_BORDER|#WS_CAPTION|#WS_DLGFRAME|#WS_CLIPCHILDREN|#WS_CLIPSIBLINGS )
    RedrawWindow_(dockhandle,0,0,7)
    SetWindowPos_(dockhandle,0,x,y,0,0,#SWP_NOSIZE) 
    SetParent_(dockhandle,#NULL)  
    ShowWindow_(dockhandle,#SW_SHOW)
  Else 
    ShowWindow_(dockhandle,#SW_HIDE)
    SetWindowLong_( dockhandle,#GWL_STYLE, #WS_DLGFRAME|#WS_CLIPCHILDREN|#WS_CLIPSIBLINGS )
    RedrawWindow_(dockhandle,0,0,7)
    SetWindowPos_(dockhandle,0,x,y,0,0,#SWP_NOSIZE)
    SetParent_(dockhandle,parenthandle)
    ShowWindow_(dockhandle,#SW_SHOW)
  EndIf 
EndProcedure
anyone know why it is doing this. my source above is the source to my lib. thanks.

Code: Select all

!.WHILE status != dwPassedOut
! Invoke AllocateDrink, dwBeerAmount
!MOV Mug, Beer
!Invoke Drink, Mug, dwBeerAmount
!.endw
El_Choni
TailBite Expert
TailBite Expert
Posts: 1007
Joined: Fri Apr 25, 2003 6:09 pm
Location: Spain

Post by El_Choni »

The lib is created here without problem (try it), but I guess the problem is using the lib. Could you post some test code, please?

Regards,
El_Choni
localmotion34
Enthusiast
Enthusiast
Posts: 665
Joined: Fri Sep 12, 2003 10:40 pm
Location: Tallahassee, Florida

Post by localmotion34 »

Code: Select all

#WindowFlags = #PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget
#GADGET_MDI=0
#MENU=0
Enumeration
  #MENU_Dock
  #MENU_unDock
  #MENU_undocktoMDI
EndEnumeration
wind=OpenWindow(0, 0, 0, 800, 600, #WindowFlags, "MDI ImageViewer/Docked ToolWindow")
If CreateMenu(#MENU, WindowID())
  MenuTitle("File")
  MenuItem(#MENU_Dock, "Dock Window")
  MenuItem(#MENU_unDock, "UnDock Window")
  MenuItem(#MENU_undocktoMDI, "Undock to MDI")
EndIf
If CreateGadgetList(WindowID())
  MDIGadget(#GADGET_MDI, 110, 30, 700, 500, 1, 0 )
  CloseGadgetList()
EndIf
Quit = 0
x1 = GadgetX(#GADGET_MDI)
dockheight=GadgetHeight(#GADGET_MDI)
Dock1=createdockedwindow(wind,0,30,x1,dockheight,"hi")
CreateGadgetList(Dock1)
ButtonGadget(100,10,30,60,20,"Docked")
ButtonGadget(101,10,60,60,20,"Toolwindow")
CloseGadgetList()

Repeat
  Event = WaitWindowEvent()
  
  Select  Event 
    Case #PB_Event_CloseWindow
    Quit = 1   

  Case  #PB_Event_Menu 
    Select EventMenuID()
      Case #MENU_Dock
        ResizeGadget(#GADGET_MDI,100,30,700, 500)
        x1 = GadgetX(#GADGET_MDI)
        dockheight=GadgetHeight(#GADGET_MDI)
        dock_window(Dock1,wind,0,30,x1,dockheight)
      Case #MENU_undocktoMDI
        undockToMDI(Dock1,#GADGET_MDI,0,30,800,500)
      Case #MENU_unDock
        undockwindow(Dock1,0,30,100,500)
        ResizeGadget(#GADGET_MDI,100,30,700, 500)
    EndSelect 
  Case #PB_Event_Gadget
    event1=EventGadgetID()
    Select event1 
      
      Case 101  ;toolwindow 
        MessageRequester("","hi")
      Case 100;docked  
        MessageRequester("","hi")
    EndSelect 
EndSelect 
  
Until Quit = 1  

Code: Select all

!.WHILE status != dwPassedOut
! Invoke AllocateDrink, dwBeerAmount
!MOV Mug, Beer
!Invoke Drink, Mug, dwBeerAmount
!.endw
El_Choni
TailBite Expert
TailBite Expert
Posts: 1007
Joined: Fri Apr 25, 2003 6:09 pm
Location: Spain

Post by El_Choni »

Your test code had some errors, but compiles fine, and works:

Code: Select all

#WindowFlags = #PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget
#GADGET_MDI=0
#MENU=0
Enumeration
  #MENU_Dock
  #MENU_unDock
  #MENU_undocktoMDI
EndEnumeration
wind=OpenWindow(0, 0, 0, 800, 600, #WindowFlags, "MDI ImageViewer/Docked ToolWindow")
If CreateMenu(#MENU, wind)
  MenuTitle("File")
  MenuItem(#MENU_Dock, "Dock Window")
  MenuItem(#MENU_unDock, "UnDock Window")
  MenuItem(#MENU_undocktoMDI, "Undock to MDI")
EndIf
If CreateGadgetList(wind)
  MDIGadget(#GADGET_MDI, 110, 30, 700, 500, 0, #MENU_undocktoMDI)
EndIf
Quit = 0
x1 = GadgetX(#GADGET_MDI)
dockheight=GadgetHeight(#GADGET_MDI)
Dock1=createdockedwindow(wind,0,30,x1,dockheight,"hi")
If CreateGadgetList(Dock1)
  ButtonGadget(100,10,30,60,20,"Docked")
  ButtonGadget(101,10,60,60,20,"Toolwindow")
EndIf

Repeat
  Event = WaitWindowEvent()
 
  Select  Event
    Case #PB_Event_CloseWindow
    Quit = 1   

  Case  #PB_Event_Menu
    Select EventMenuID()
      Case #MENU_Dock
        ResizeGadget(#GADGET_MDI,100,30,700, 500)
        x1 = GadgetX(#GADGET_MDI)
        dockheight=GadgetHeight(#GADGET_MDI)
        dock_window(Dock1,wind,0,30,x1,dockheight)
      Case #MENU_undocktoMDI
        undockToMDI(Dock1,#GADGET_MDI,0,30,800,500)
      Case #MENU_unDock
        undockwindow(Dock1,0,30,100,500)
        ResizeGadget(#GADGET_MDI,100,30,700, 500)
    EndSelect
  Case #PB_Event_Gadget
    event1=EventGadgetID()
    Select event1
     
      Case 101  ;toolwindow
        MessageRequester("","hi")
      Case 100;docked 
        MessageRequester("","hi")
    EndSelect
EndSelect
 
Until Quit = 1 
The "Undock to MDI" option doesn't work very well, because the mouse coordinates are wrong (after clicking in "Undock to MDI", drag the docked window to see what I mean).

Nice lib, BTW. Regards,
El_Choni
Post Reply