2017-07-07 8 views
0

このメンバ関数のscroll_to(TextBuffer::iterator& iter, double within_margin = 0)パラメータwithin_marginについて私は不思議です。 APIには次のように書かれています。Gtkmm scroll_to()目的

この機能の有効画面は、マージン内のマージン分だけ縮小されています。画面サイズの[0.0,0.5]分数としてマージンwithin_margin
...
パラメータ

私はちょうどそれを取得しません。何時にこのパラメータが行動を変更するのですか? Gtkのすべての疎結合には同じ記述が含まれています。小さなアプリケーションを書いたので、渡された引数を自分でパラメータに変更することができます。

#include <gtkmm.h> 
#include <iostream> 
#include <string> 
using namespace std; 

Gtk::TextView* text_view; 
void on_add_button_clicked(); 
void on_scroll_button_clicked(); 

int main(int argc, char* argv[]) { 
    Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm.examples.base"); 
    Gtk::Window window; 
    Glib::RefPtr<Gdk::Monitor> primary_monitor = window.get_screen()->get_display()->get_primary_monitor(); 
    Gdk::Rectangle monitor_size; 
    primary_monitor->get_geometry(monitor_size); 
    // half-size of primary-monitor 
    int width = monitor_size.get_width()/2; 
    int height = monitor_size.get_height()/2; 

    window.set_default_size(width, height); 
    window.set_title(__FILE__); 

    Gtk::Grid grid; 
    grid.set_row_spacing(5); 
    grid.set_column_spacing(5); 

    Gtk::ScrolledWindow scroll_window; 
    text_view = new Gtk::TextView(); 
    text_view->set_editable(true); 
    scroll_window.add(*text_view); 
    scroll_window.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); 
    scroll_window.set_hexpand(true); 
    scroll_window.set_vexpand(true); 
    Glib::RefPtr<Gtk::TextBuffer> text_buffer = text_view->get_buffer(); 
    text_buffer->set_text("Hello!\n"); 
    text_view->set_buffer(text_buffer); 
    grid.attach(scroll_window, 0, 0, 2, 2); 


    Gtk::Button add_button("add text"); 
    add_button.signal_clicked().connect(sigc::ptr_fun(&on_add_button_clicked)); 
    grid.attach_next_to(add_button, scroll_window, Gtk::POS_BOTTOM, 1, 1); 

    Gtk::Button scroll_button("scroll to somewhere"); 
    scroll_button.signal_clicked().connect(sigc::ptr_fun(&on_scroll_button_clicked)); 
    grid.attach_next_to(scroll_button, add_button, Gtk::POS_RIGHT, 1, 1); 

    window.add(grid); 
    window.show_all(); 

    return app->run(window); 
} 


void on_add_button_clicked() { 
    Glib::RefPtr<Gtk::TextBuffer> text_buffer = text_view->get_buffer(); 
    for (int i = 0; i != 100; ++i) { 
     text_buffer->insert_at_cursor("foobar\n"); 
    } 
} 

void on_scroll_button_clicked() { 
    Glib::RefPtr<Gtk::TextBuffer> text_buffer = text_view->get_buffer(); 
    Gtk::TextBuffer::iterator it = text_buffer->end(); 
    text_view->scroll_to(it, 0.49); 
} 

g++ -o scroll scroll.cpp -Wall -pedantic-errors `pkg-config gtkmm-3.0 --cflags --libs`でコードをコンパイルできます。

は、 scroll_to()は、画面の任意の場所にターゲットを置いて自由である、あなたは

答えて

1

marginが0であればお願いします。たとえば、marginが0.45の場合、scroll_to()は、画面の中央10%にターゲットを置きます。できるだけの場合は、となります。

この例では表示されない理由は、エンドイテレータにスクロールしているためで、テキストの最後が画面の中央に表示されるようにビューをスクロールすることができないためです。 (一部のテキストビューには、これを可能にするためにテキストの後ろに余分なスペースが含まれています; Gtk::TextView

+0

私は遅刻して申し訳ありません。あなたが正しいです! – Peter