質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
GTK+

GTK+とはGUIを作るために作られた、とても使いやすく機能に富んだツールキットです。クロスプラットフォームによる互換性と、使いやすいAPIを備えています。

Q&A

解決済

1回答

3382閲覧

[GTK+ 3] gdk_cairo_createが非推奨になったので違う関数に置き換えたい

Tlllune

総合スコア15

GTK+

GTK+とはGUIを作るために作られた、とても使いやすく機能に富んだツールキットです。クロスプラットフォームによる互換性と、使いやすいAPIを備えています。

0グッド

0クリップ

投稿2019/02/04 13:45

http://uchigo.main.jp/gtk3/index.html を参考にGTK+をさわってみようと思っているのですが、

cr=gdk_cairo_create(gtk_widget_get_window (widget));

を使おうとすると

tester.cpp: In function ‘gboolean cb_expose_event(GtkWidget*, cairo_t*, gpointer)’: tester.cpp:29:55: warning: ‘cairo_t* gdk_cairo_create(GdkWindow*)’ is deprecated: Use 'gdk_window_begin_draw_frame() and gdk_drawing_context_get_cairo_context()' instead [-Wdeprecated-declarations] cr=gdk_cairo_create(gtk_widget_get_window (widget)); ^ In file included from /usr/local/include/gtk-3.0/gdk/gdk.h:33:0, from /usr/local/include/gtk-3.0/gtk/gtk.h:30, from tester.cpp:4: /usr/local/include/gtk-3.0/gdk/gdkcairo.h:35:12: note: declared here cairo_t * gdk_cairo_create (GdkWindow *window); ^~~~~~~~~~~~~~~~

と警告が出てしまいます。
これは関数を使用しない代わりに現在推奨されているgdk_window_begin_draw_frame()を使えば治るというのですが、
その関数の使い方の詳細が分からず(公式リファレンス等いろいろほじくりましたがそれでも見つからない)困っています。

どのようにしてこの関数を置き換えれば良いのでしょうか?

こちらが現時点でのコード全文です

#include <gtk/gtk.h> #include <gdk/gdk.h> using namespace std; GtkWidget *window; static gboolean cb_expose_event(GtkWidget *widget, cairo_t *cr, gpointer data) { cr=gdk_cairo_create(gtk_widget_get_window (widget)); // ココ! cairo_set_source_rgb(cr, 1.0, 0.0, 0.0); cairo_rectangle(cr, 50.0, 50.0, 50.0, 50.0); cairo_stroke_preserve(cr); cairo_set_source_rgb(cr, 1.0, 0.8, 0.8); cairo_fill(cr); cairo_destroy(cr); return FALSE; } int main(int argc, char** argv) { gtk_init(&argc,&argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_widget_set_app_paintable(window, TRUE); gtk_widget_add_events (window, GDK_BUTTON_PRESS_MASK); gtk_widget_set_size_request(window, 300, 200); g_signal_connect(G_OBJECT(window), "draw", G_CALLBACK(cb_expose_event), NULL); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_widget_show(window); gtk_main(); return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

cpp

1//cr=gdk_cairo_create(gtk_widget_get_window (widget)); // ココ! 2... 3//cairo_destroy(cr); 4

単純に削除するだけでいいようです。cr自体は引数で渡ってきており、ここで作成する必要がないみたいです。

マニュアルページを見ると、gdk_window_begin_draw_frame()gdk_drawing_context_get_cairo_context()を代わりに使えと書かれていますが、実際にgdk_window_begin_draw_frame()を使ってみたところ、既に呼ばれてるので、先にgdk_window_end_draw_frame()しろと言われてしまいました。

よく見たらcrはコールバックの引数にあったので、試しにそのまま使ってみたところ、destroyも合わせて消すと正しく動作したということです。資料は漁ってみましたが、コレという記述はなかったですね。
create〜destroyまでの間に描画していたのが従来の方法で、これからはbegin〜endになるよ、というドキュメントはいくつか見つけましたが。。。

歯切れが悪くてすみません。

投稿2019/02/04 19:17

wwbQzhMkhhgEmhU

総合スコア343

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tlllune

2019/02/05 03:21

動きました。詳しいご回答ありがとうございました!BAにします
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問