5

GtkDrawingAreaデータを視覚化するために使用される があります。データベースとユーザー入力によっては、図面が非常に大きくなる可能性があります (最大許容GtkDrawingAreaサイズよりも大きくなります)。したがって、現在のウィンドウと同じ大きさの描画領域を使用し、スクロール時に手動で更新したいと考えています。

ScrolledWindow + Viewport メソッドを使用してスクロールバーを描画領域に追加すると、描画領域がスクロールバーを必要とするほど大きくないため、明らかに機能しません。

ビューポートをだまして、下にあるウィジェットが実際よりも大きいと思わせる方法はありますか? そうでない場合、この問題を解決する最善の方法は何ですか?

注: 私は Gtk2 を使用しており、Gtk3 に切り替えることはできません。

4

2 に答える 2

2

GtkDrawingAreaシグナルをサブクラス化してオーバーライドする必要がありますset_scroll_adjustmentsGtkWidget ドキュメント

このシグナルでは、スクロールされたウィンドウの調整を取得します。数年前にコードを書いたので、それを見て実装方法を確認してください。

MarlinSampleView コード

このコードは、実際にはウィンドウよりも大きくないにもかかわらず、ウィジェットの幅が数百万ピクセルであるかのように装うことができました。

于 2013-03-17T01:15:54.097 に答える
0

それは非常に単純であることが判明しました:

には、スクロールされたウィンドウが使用する必要があるGtkScrolledWindowを設定するために使用できる別のコンストラクタがあります。GtkAdjustments

//These adjustments will be attached to the scrollbars.
prvt->hAdjustment = GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 0, 0, 0, 0));
prvt->vAdjustment = GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 0, 0, 0, 0));

GtkWidget* scrolledTree = gtk_scrolled_window_new(prvt->hAdjustment, prvt->vAdjustment);
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolledTree), drawing_area);

GTKAdjustmentsこれで、図面のサイズが変更されるたびに、変更をシミュレートするために を変更するだけで済みます。実際に描画領域のサイズを変更する必要はありません。

gtk_adjustment_set_lower(prvt->hAdjustment, 0);
gtk_adjustment_set_step_increment(prvt->hAdjustment, 1);
gtk_adjustment_set_page_increment(prvt->hAdjustment, 10);
gtk_adjustment_set_upper(prvt->hAdjustment, picture_width);
gtk_adjustment_set_page_size(prvt->hAdjustment, scrollArea_width);
gtk_adjustment_changed(prvt->hAdjustment);

最後に電話gtk_adjustment_changedすることに注意してください。これは重要です。そうしScrolledWindowないと、スクロールバーが更新されません。

最後に、 のvalue_changedコールバックをGtkAdjustmens使用して、スクロール イベントをキャッチし、描画を調整できます。

GtkScrolledWindow編集:スクロールイベントも受け取り、画像を移動するため、これは正しく機能しません:(

于 2013-03-15T08:34:14.873 に答える