GTK

2014-03-12 4 views
0
에서 작업 한 후 창 새로 고침

GTK를 발견했습니다. 배수 문제가 있습니다 ... 여기에 그 중 하나가 있습니다.GTK

"데이터"구조와 메뉴 막대와 drawingArea가 포함 된 창을 가지고 있습니다. 영역에는 데이터에 설명 된 내용을 그리는 전용 "DrawRefresh_callback"드로잉 기능이 있습니다. 실제로

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

는, 그렇게함으로써, 나는 데이터 및 Draw_callback에서 DrawingArea 위젯에 액세스 할 수 있습니다 나는 DrawingArea을 만들 때 순간

, 나는 클릭 신호를 연결하여 그릴 수 있습니다.

메뉴를 사용할 때 Data.addLine이라는 Data를 수정하는 함수를 호출 할 수 있습니다.이 작업을 수행하기 위해 "activate"신호를 연결하면 Data에 대한 포인터가 나타납니다. (나는 그것을 할 수있는 좋은 방법이라고 확신하지 못한다.)

그런 다음 Data_addLine에서 DrawRefresh_callback을 호출하여 그리기 영역을 새로 고침하고 싶습니다. 그리고 나는 이것을 어떻게하는지 모른다 : Data_addLine에서 나는 많은 "gtk_widget_get_parent"를 사용하는 것을 제외하고는) drawingWidget에 접근 할 수 없다.

나는 완전히 ... 잃었어요 나는 심지어 내 문제를 설명하는 어려움이 ...이 충분히 분명하다 희망 ...

아마이 데이터 구조체와은 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); 
    ... 
} 
관련 문제