Gadget ›› SplitterGadget

プログラム言語 FreeBasic


SplitterGadget

構文

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


例 1

#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

結果


例 2

#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

結果


http://mneniya.ucoz.ru/

←リンク元に戻る Window9 トップに戻る FreeBASIC マニュアル トップに戻る
ロシア語オリジナル:https://users.freebasic-portal.de/freebasicru/window9lib/window9.html