2014-03-12 67 views
0

中執行操作後刷新窗口我正在發現GTK,並且遇到了倍數問題...以下是其中一個問題。在GTK +

我有一個「數據」結構,其中包含一個菜單欄和一個繪圖區的窗口。 該區域有一個繪圖功能「DrawRefresh_callback」專用於繪製數據中描述的內容。

g_signal_connect(G_OBJECT(DrawingArea), "button-press-event", G_CALLBACK(Draw_callback), pData); 

事實上,通過這樣做,我有機會獲得的數據和Draw_callback的繪圖區構件:

此刻,我可以通過連接點擊訊號,當我創建的繪圖區繪製。

當我使用的菜單,我可以打電話給一個叫Data_addLine功能修改Data.I給了一個數據指針,當我連接,爲了做到這一點,「激活」信號。 (我甚至不確定這是做這件事的好方法)。

g_signal_connect(G_OBJECT(pMenuItem), "activate", G_CALLBACK(Data_addLine), pData); 

但是,然後,我想通過從Data_addLine調用DrawRefresh_callback來刷新繪圖區域。我不知道該怎麼做:在Data_addLine中,我無法訪問drawingWidget(除了使用大量的「gtk_widget_get_parent」...)。

完全迷路了......我甚至遇到困難解釋我的問題... 希望這是很清楚......

也許這是不使用GTK與數據結構的方式。 ..

在此先感謝。

回答

0

如果我有你的權利,你改變針對某些事件的「模式」(=你的數據結構),並希望繪圖區域得到相應的更新。

我建議不從(從處理菜單激活信號處理程序即),但排隊重繪操作,而不是另一事件處理程序中調用繪製例程。對此使用gtk_widget_queue_draw(Draw);

然後,在事件處理程序中,您需要兩個引用。一個用於數據結構,另一個用於繪圖區域的小部件。您可以爲此使用全局變量,或者使用一個包含所有必要變量(下面的示例中爲appdata)的結構,然後您可以方便地將它們傳遞給事件處理程序。

typedef struct { 
    GtkWidget *DrawingArea; 
    sometype_t *Data; 
    ... 
} appdata_t; 

static gboolean on_menuitem_activate(GtkMenuItem *menuitem, appdata_t *appdata) 
{ 
    do_some_work(appdata->Data); 
    gtk_widget_queue_draw(appdata->DrawingArea); 
    return FALSE; 
} 

... 

int main(...) 
{ 
    appdata_t appdata; 

    appdata.DrawingArea = gtk_drawing_area_new(); 
    appdata.Data = some_initialization_function(); 

    ... 
    g_signal_connect(pMenuItem, "activate", on_menuitem_activate, &appdata); 
    ... 
}