0

4 つのラベルを含むアプリケーションを作成しました。2 つのラベル (「wynik」と「wynik1」) の値を変更したい。キーボードの左キーを押すと「wynik」ラベルの値が増加し、キーを押すと減少します。キーを右に押すと「wynik1」ラベルの値が増加し、キーを上に押すと減少します。私のコード:

    #include <gtk/gtk.h>
    #include <gdk/gdkkeysyms.h>

    gint count = 0;
    char buf[0];
    char buf1[0];


    gboolean
    on_key_press (GtkWidget *widget, GdkEventKey *event, gpointer wynik);
    gboolean
    on_key_press1 (GtkWidget *widget, GdkEventKey *event, gpointer wynik);

    int main( int argc, char * argv[] ) {
        GtkWidget * okno;
        GtkWidget * kontener;
        GtkWidget * etykieta;
        GtkWidget * etykieta1;
        GtkWidget * wynik;
        GtkWidget * wynik1;

        gtk_init( & argc, & argv );

        okno = gtk_window_new( GTK_WINDOW_TOPLEVEL );
        gtk_window_set_keep_above(GTK_WINDOW(okno), TRUE);
        gtk_window_set_default_size( GTK_WINDOW( okno ), 300, 200 );
        gtk_window_set_position( GTK_WINDOW( okno ), GTK_WIN_POS_CENTER );

        kontener = gtk_fixed_new();
        gtk_container_add( GTK_CONTAINER( okno ), kontener );

        char * str = " <span fgcolor='#007560'><span font='20'><b>PIA</b></span></span>";
        etykieta = gtk_label_new( NULL );
        gtk_label_set_markup( GTK_LABEL( etykieta ), str );
        gtk_fixed_put( GTK_FIXED( kontener ), etykieta, 0, 0 );

        char * str1 = " <span fgcolor='#9a1262'><span font='20'><b>PER</b></span></span>";
        etykieta1 = gtk_label_new( NULL );
        gtk_label_set_markup( GTK_LABEL( etykieta1 ), str1 );
        gtk_fixed_put( GTK_FIXED( kontener ), etykieta1, 65, 0 );

        char * wyn = " <span fgcolor='#007560'><span font='26'><b>0</b></span></span>";
        wynik = gtk_label_new( NULL );
        gtk_label_set_markup( GTK_LABEL( wynik ), wyn );
        gtk_fixed_put( GTK_FIXED( kontener ), wynik, 3, 30 );

        char * wyn1 = " <span fgcolor='#9a1262'><span font='26'><b>0</b></span></span>";
        wynik1 = gtk_label_new( NULL );
        gtk_label_set_markup( GTK_LABEL( wynik1 ), wyn1 );
        gtk_fixed_put( GTK_FIXED( kontener ), wynik1, 68, 30 );

        g_signal_connect( G_OBJECT( okno ), "destroy", G_CALLBACK( gtk_main_quit ), NULL );
        g_signal_connect (G_OBJECT (okno), "key_press_event", G_CALLBACK (on_key_press), wynik);
        g_signal_connect (G_OBJECT (okno), "key_press_event", G_CALLBACK (on_key_press1), wynik1);
        gtk_widget_show_all( okno );
        gtk_main();

        return 0;
    }

    gboolean
    on_key_press (GtkWidget *widget, GdkEventKey *event, gpointer wynik)
    {
    switch (event->keyval)
      {case GDK_S:
        case GDK_Left:
            count++;
            std::ostringstream os;
            os << "<span font='26'><b>" << count << "</b></span>";
            gtk_label_set_markup( GTK_LABEL( wynik ), os.str().c_str() );
          break;
        case GDK_Down:
            count--;
            std::ostringstream os;
            os << "<span font='26'><b>" << count << "</b></span>";
            gtk_label_set_markup( GTK_LABEL( wynik ), os.str().c_str() );
          break;

        default:
          return FALSE;
      }    
      return FALSE;
    }

 gboolean
    on_key_press1 (GtkWidget *widget, GdkEventKey *event, gpointer wynik1)
    {
    switch (event->keyval)
      {case GDK_S:  // add this line
        case GDK_Right:
            count++;
            std::ostringstream os1;
            os1 << "<span font='26'><b>" << count << "</b></span>";
            gtk_label_set_markup( GTK_LABEL( wynik1 ), os1.str().c_str() );
          break;
        case GDK_Up:
            count--;
            std::ostringstream os1;
            os1 << "<span font='26'><b>" << count << "</b></span>";
            gtk_label_set_markup( GTK_LABEL( wynik1 ), os1.str().c_str() );
          break;

        default:
          return FALSE;
      }    
      return FALSE;
    }

残念ながら、エラーが発生します:

> ||=== nowygt3, Debug ===| F:\c++\nowygt3\main.c||In function
> 'on_key_press':| F:\c++\nowygt3\main.c|67|error: expected expression
> before ':' token| F:\c++\nowygt3\main.c|68|error: 'os' undeclared
> (first use in this function)| F:\c++\nowygt3\main.c|68|note: each
> undeclared identifier is reported only once for each function it
> appears in| F:\c++\nowygt3\main.c|73|error: duplicate label 'std'|
> F:\c++\nowygt3\main.c|67|note: previous definition of 'std' was here|
> F:\c++\nowygt3\main.c|73|error: expected expression before ':' token|
> F:\c++\nowygt3\main.c|67|warning: label 'std' defined but not used
> [-Wunused-label]| F:\c++\nowygt3\main.c||In function 'on_key_press1':|
> F:\c++\nowygt3\main.c|91|error: expected expression before ':' token|
> F:\c++\nowygt3\main.c|92|error: 'os1' undeclared (first use in this
> function)| F:\c++\nowygt3\main.c|97|error: duplicate label 'std'|
> F:\c++\nowygt3\main.c|91|note: previous definition of 'std' was here|
> F:\c++\nowygt3\main.c|97|error: expected expression before ':' token|
> F:\c++\nowygt3\main.c|91|warning: label 'std' defined but not used
> [-Wunused-label]|

私を助けてください。私は本当に初心者ですが、自分ですべてをやろうとしていますが、今はアイデアがありません。

4

2 に答える 2

0

case特定の ofswitchステートメント内で自動保存期間を持つオブジェクトを作成するには、次のようにします。

case GDK_S:
case GDK_Left:
    std::ostringstream os;
    ...
    break;

osの有効期間が関連付けられるスコープを定義する必要があります。

case GDK_S:
case GDK_Left:
{
    std::ostringstream os;
    ...
    break;
}

それとは別に、 も#include <sstream>使用できるはずstd::ostringstreamです。

于 2013-03-29T20:09:01.183 に答える
0

文句を言ってるように見える std::ostringstream os1;

あなたは#include <iostream>

于 2013-03-29T20:06:52.173 に答える