プログラム言語 FreeBasic |
Function SplitterGadget(iGadget As Long , iX As Long , iY As Long , iWidth As Long , iHeight As Long, iPos As Long , iStyle As Long = 0) As HWND
ガジェット(Splitter)のセパレータを作成します。
SplitterGadget の子ガジェットの作成順序は、階層に応じて尊重する必要があります。
SplitterGadgetは、2つの子ガジェットのサイズだけを監視します。
つまり、SplitterGadget に、ガジェットを入れ子にしたコンテナ(ContainerGadget)を設置した場合、そのサイズを手動で監視する必要があります。
Linux の GTK3 サブシステムでは、Splitter は GTK2 と同様には動作せず、特に入れ子になった Splitter ガジェットではうまく動作しません。
GTK3 では問題が発生しているようです...。
Windows と linux+GTK2 では、子ガジェットのサイズは自動的に調整されます。
残念ながら、GTK3ではいくつかのことを手動で行う必要があります。
GTK3では、私がすべての例で行ったように、支えを使わないと、いくつかのスライダが動作しなくなります。
GTK3では、入れ子になった Splitter の自動化を実現することができませんでした。
このヘルプにあるすべての例は GTK3 を意識して作ったものなので、いくつかの問題をどのように解決したかを見ていただけると思います。
以下に2つの例を示しますので、よく検討してみてください。
Windowsでは、メインウィンドウのスタイルに WS_CLIPCHILDREN を使うると、ちらつきが少なくなります(すべての例がこのスタイルで作成されています)。
一部のプロパティ (HANDLEPAN , POSITIONPAN , STYLEPAN , SPLITTERMOVE , GADGET1 , GADGET2 , gad1 , gad2 , ngad1 , ngad2 , ORI , position_prev_V , position_prev_H) は Splitter 実装で予約されているので、 Splitter 画面で これらを SetWindowProperty 関数に使うことは出来ません。
SplitterGadget を削除する場合は、子ガジェットを削除してから行ってください。
iGadget - ガジェットID
iX , iY , iWidth , iHeght - 場所と寸法
iPos - スライダーの初期位置
iStyle - 0 - 垂直スプリッター、 1 - 水平スプリッター
Windows , Linux
#include "window9.bi"
Enum
E_SPLITTER_GOR = 1
E_EDIT1
E_EDIT2
End Enum
dim as Long iOpenWindowStyle
Dim As Hwnd hwnd
Dim As Integer Event , iPos = 290
#ifdef __FB_WIN32__
' To reduce the flickering of gadgets on Windows you need a style of WS_CLIPCHILDREN!
iOpenWindowStyle = WS_OVERLAPPEDWINDOW Or WS_VISIBLE Or WS_TABSTOPENABLE Or WS_CLIPCHILDREN
Function windowproc(hwnd As HWND,msg As UINT,wParam As WPARAM,lParam As LPARAM) As Integer
If msg= WM_SIZE Then
Resizegadget(E_SPLITTER_GOR , , , Windowclientwidth(hwnd) - 20, Windowclientheight(hwnd) - 50)
Endif
Return 0
End Function
#else
iOpenWindowStyle = WS_OVERLAPPEDWINDOW Or WS_VISIBLE Or WS_TABSTOPENABLE
Sub resizeWindowSub2 Cdecl(Gwindow As GtkWidget Ptr, allocation As GdkRectangle Ptr, user_data As gpointer)
Dim As Long iW = allocation->Width-20 , iH = allocation->Height-50
If iW < 0 Orelse iH < 0 Then Exit Sub
Resizegadget(E_SPLITTER_GOR , , , iW , iH)
End Sub
#EndIf
hwnd = Openwindow("1" , 300 , 10 , 655 , 630 , iOpenWindowStyle )
SplitterGadget(E_SPLITTER_GOR , 10 , 10 , 635 , 580 , iPos , 1)
Editorgadget(E_EDIT1 , 0 , 0 , 0 , 0 , "editor1")
Editorgadget(E_EDIT2 , 0 , 0 , 0 , 0 , "editor2")
SplitterGadgetAddGadget(E_SPLITTER_GOR , E_EDIT1 , E_EDIT2)
#ifdef __FB_WIN32__
Setwindowcallback(Cint(@windowproc()),0)
#else
'for resize
g_signal_connect(G_OBJECT(hwnd), "size-allocate", G_CALLBACK (@resizeWindowSub2), 0)
' crutch for GTK3
Updateinfoxserver()
Resizewindow(hwnd , , , 655 , 630)
#EndIf
Do
Event=Waitevent()
Select Case Event
Case Eventclose
Exit Do
End Select
Loop
#include "window9.bi"
Enum
E_SPLITTER_GOR = 1
E_SPLITTER_VERT
E_EDIT1
E_EDIT2
E_LIST
End Enum
Dim As Hwnd hwnd
Dim As Integer Event , iPos = 290
dim as Long iOpenWindowStyle , iExStyleListBox
#ifdef __FB_WIN32__
' To reduce the flickering of gadgets on Windows you need a style of WS_CLIPCHILDREN!
iOpenWindowStyle = WS_OVERLAPPEDWINDOW Or WS_VISIBLE Or WS_TABSTOPENABLE Or WS_CLIPCHILDREN
iExStyleListBox = WS_EX_CLIENTEDGE
Function windowproc(hwnd As HWND,msg As UINT,wParam As WPARAM,lParam As LPARAM) As Integer
If msg= WM_SIZE Then
Resizegadget(E_SPLITTER_GOR , , , Windowclientwidth(hwnd) - 20, Windowclientheight(hwnd) - 50)
Endif
Return 0
End Function
#else
iOpenWindowStyle = WS_OVERLAPPEDWINDOW Or WS_VISIBLE Or WS_TABSTOPENABLE
Sub resizeWindowSub2 Cdecl(Gwindow As GtkWidget Ptr, allocation As GdkRectangle Ptr, user_data As gpointer)
Dim As Long iW = allocation->Width-20 , iH = allocation->Height-50
If iW < 0 Orelse iH < 0 Then Exit Sub
Resizegadget(E_SPLITTER_GOR , , , iW , iH)
#ifdef __USE_GTK3__ ' crutch for GTK3
Resizegadget(E_SPLITTER_VERT , , , , iH)
Resizegadget(E_LIST , , , , iH)
#endif
End Sub
#EndIf
hwnd = Openwindow("1" , 300 , 10 , 455 , 630 , iOpenWindowStyle)
SplitterGadget(E_SPLITTER_GOR , 10 , 10 , 435 , 580 , iPos , 1)
SplitterGadget(E_SPLITTER_VERT , 0 , 0 , 200 , 580 , iPos)
Editorgadget(E_EDIT1 , 0 , 0 , 0 , 0 , "editor1")
Editorgadget(E_EDIT2 , 0 , 0 , 0 , 0 , "editor2")
Usegadgetlist(Gadgetid(E_SPLITTER_GOR))
Listboxgadget(E_LIST , 0 , 0 , 0 , 0 , , iExStyleListBox)
Addlistboxitem(E_LIST,"1 String")
Addlistboxitem(E_LIST,"2 String")
SplitterGadgetAddGadget(E_SPLITTER_VERT , E_EDIT1 , E_EDIT2)
SplitterGadgetAddGadget(E_SPLITTER_GOR , E_SPLITTER_VERT,E_LIST)
#ifdef __FB_WIN32__
Setwindowcallback(Cint(@windowproc()),0)
#else
g_signal_connect(G_OBJECT(hwnd), "size-allocate", G_CALLBACK (@resizeWindowSub2), 0)
' crutch for GTK3
Updateinfoxserver()
Resizewindow(hwnd , , , 455 , 630)
#endif
Do
Event=Waitevent()
Select Case Event
Case Eventclose
Exit Do
Case Eventsize
#ifdef __USE_GTK3__ ' crutch for GTK3
Static As Long iWOld , ihOld
Dim As Long iW = Windowclientwidth(hwnd) - 20, iH = Windowclientheight(hwnd) - 50
If iWOld <> iW Orelse iHOld <> iH Then
iWOld = iW
ihOld = iH
If Gadgetid(E_SPLITTER_GOR) Then
Resizegadget(E_SPLITTER_GOR , 10 , 10 , , )
Endif
Endif
#endif
End Select
Loop