2017-07-07 39 views
0

我在想这个成员函数的scroll_to(TextBuffer::iterator& iter, double within_margin = 0)参数within_margin。该API说:Gtkmm scroll_to()用途

此功能的目的有效屏幕减少了尺寸范围内的边距within_margin。
...
参数
within_margin margin作为屏幕尺寸的[0.0,0.5]分数。

我只是不明白这一点。什么时候该参数修改行为? 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`编译代码。

谢谢

回答

1

如果margin为0,则scroll_to()是免费把目标锁定在屏幕的任意位置。如果margin为0.45,例如,然后scroll_to()将把目标在屏幕的中间10%,如果可能

你在你的例子中没有看到这个的原因是因为你正在滚动到结束迭代器,并且不可能滚动视图以便文本的末尾显示在屏幕中间。 (某些文本视图包括为了使这成为可能的文本之后额外的空间; Gtk::TextView没有。)

+0

我迟到响应遗憾。你是对的! – Peter