1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Relativ simpel, steh aber auf dem Schlauch

Dieses Thema im Forum "C/C++" wurde erstellt von CypherXG, 6. August 2017.

  1. CypherXG

    CypherXG Grünschnabel

    Hallo
    Ich steh gerade aufm Schlauch.
    Die Lösung ist bestimmt ganz simpel.
    Es geht um eine Abfrage wenn ein Button gedrückt wird.
    In diesem Falle der Quit Button bei mir.
    Dann soll ein Fenster aufgehen mit der unten stehenden Sicherheitsfrage.
    Als Möglichkeit soll dann "Ja" oder "Nein" zur Auswahl stehen.
    Soweit geht ja alles, jedoch das Ja und nein geht nicht.
    Bei nein soll alles abgebrochen werden und bei Ja sollen die beiden Befehle (uae_quit und gui_running" ausgeführt werden.
    Wie muss ich das anordnen damit die Abfrage funktioniert?
    Wäre dankbar wenn jemand das lösen würde für mich.

    Gruß Markus

    Code (C++):
    1. namespace widgets
    2. {
    3.     class MainButtonActionListener : public gcn::ActionListener
    4.     {
    5.     public:
    6.         void action(const gcn::ActionEvent& actionEvent)
    7.         {
    8.             if (actionEvent.getSource() == cmdQuit)
    9.                 {
    10.                 //-------------------------------------------------
    11.                 // Quit entire program via click on Quit-button
    12.                 //-------------------------------------------------
    13.                 ShowMessage("AmiPi Information !!", "Wollen Sie wirklich den Emulator beenden?", "", "Ja", "Nein");
    14.                 return false;
    15.                 {uae_quit();
    16.                 gui_running = false;
    17.                 }}
    18. }
    19. }
    20.  
     
  2. sheel

    sheel I love Asm Administrator

    Hi

    da sind einige Sachen drin, die nicht zu C++ selber gehören, zB. ShowMessage. Also entweder selbst irgendwo programmiert, in dem Fall müssten wir den Code sehen um helfen zu können; oder es ist Teil einer Library, welche?
     
  3. CypherXG

    CypherXG Grünschnabel

    Das ganze rennt auf einem Raspberry Pi und die Showmessage.cpp sieht so aus:
    Code (C++):
    1. #include <algorithm>
    2. #include <guichan.hpp>
    3. #include <iostream>
    4. #include <sstream>
    5. #include <SDL/SDL_ttf.h>
    6. #include <guichan/sdl.hpp>
    7. #include "sdltruetypefont.hpp"
    8. #include "SelectorEntry.hpp"
    9.  
    10. #include "sysconfig.h"
    11. #include "sysdeps.h"
    12. #include "config.h"
    13. #include "gui.h"
    14. #include "gui_handling.h"
    15.  
    16.  
    17. #define DIALOG_WIDTH 600
    18. #define DIALOG_HEIGHT 160
    19.  
    20. static bool dialogResult = false;
    21. static bool dialogFinished = false;
    22.  
    23. static gcn::Window *wndShowMessage;
    24. static gcn::Button* cmdOK;
    25. static gcn::Button* cmdCancel;
    26. static gcn::Label* lblText1;
    27. static gcn::Label* lblText2;
    28.  
    29.  
    30. class ShowMessageActionListener : public gcn::ActionListener
    31. {
    32. public:
    33.     void action(const gcn::ActionEvent& actionEvent)
    34.     {
    35.         if (actionEvent.getSource() == cmdOK)
    36.             dialogResult = true;
    37.         dialogFinished = true;
    38.     }
    39. };
    40. static ShowMessageActionListener* showMessageActionListener;
    41.  
    42.  
    43. static void InitShowMessage(void)
    44. {
    45.     wndShowMessage = new gcn::Window("Information:");
    46.     wndShowMessage->setSize(DIALOG_WIDTH, DIALOG_HEIGHT);
    47.     wndShowMessage->setPosition((GUI_WIDTH - DIALOG_WIDTH) / 2, (GUI_HEIGHT - DIALOG_HEIGHT) / 2);
    48.     wndShowMessage->setBaseColor(gui_baseCol + 0x202020);
    49.     wndShowMessage->setTitleBarHeight(TITLEBAR_HEIGHT);
    50.  
    51.     showMessageActionListener = new ShowMessageActionListener();
    52.  
    53.     lblText1 = new gcn::Label("");
    54.     lblText1->setSize(DIALOG_WIDTH - 2 * DISTANCE_BORDER, LABEL_HEIGHT);
    55.     lblText2 = new gcn::Label("");
    56.     lblText2->setSize(DIALOG_WIDTH - 2 * DISTANCE_BORDER, LABEL_HEIGHT);
    57.  
    58.     cmdOK = new gcn::Button("Ok");
    59.     cmdOK->setSize(BUTTON_WIDTH, BUTTON_HEIGHT);
    60.     cmdOK->setPosition(DIALOG_WIDTH - DISTANCE_BORDER - 2 * BUTTON_WIDTH - DISTANCE_NEXT_X, DIALOG_HEIGHT - 2 * DISTANCE_BORDER - BUTTON_HEIGHT - 10);
    61.     cmdOK->setBaseColor(gui_baseCol + 0x202020);
    62.     cmdOK->addActionListener(showMessageActionListener);
    63.  
    64.     cmdCancel = new gcn::Button("Abbruch");
    65.     cmdCancel->setSize(BUTTON_WIDTH, BUTTON_HEIGHT);
    66.     cmdCancel->setPosition(DIALOG_WIDTH - DISTANCE_BORDER - BUTTON_WIDTH, DIALOG_HEIGHT - 2 * DISTANCE_BORDER - BUTTON_HEIGHT - 10);
    67.     cmdCancel->setBaseColor(gui_baseCol + 0x202020);
    68.     cmdCancel->addActionListener(showMessageActionListener);
    69.  
    70.     wndShowMessage->add(lblText1, DISTANCE_BORDER, DISTANCE_BORDER);
    71.     wndShowMessage->add(lblText2, DISTANCE_BORDER, DISTANCE_BORDER + lblText1->getHeight() + 4);
    72.     wndShowMessage->add(cmdOK);
    73.     wndShowMessage->add(cmdCancel);
    74.  
    75.     gui_top->add(wndShowMessage);
    76.  
    77.     cmdOK->requestFocus();
    78.     wndShowMessage->requestModalFocus();
    79. }
    80.  
    81.  
    82. static void ExitShowMessage(void)
    83. {
    84.     wndShowMessage->releaseModalFocus();
    85.     gui_top->remove(wndShowMessage);
    86.  
    87.     delete lblText1;
    88.     delete lblText2;
    89.     delete cmdOK;
    90.     delete cmdCancel;
    91.  
    92.     delete showMessageActionListener;
    93.  
    94.     delete wndShowMessage;
    95. }
    96.  
    97.  
    98. static void ShowMessageLoop(void)
    99. {
    100.     while(!dialogFinished)
    101.     {
    102.         SDL_Event event;
    103.         while(SDL_PollEvent(&event))
    104.         {
    105.             if (event.type == SDL_KEYDOWN)
    106.             {
    107.                 switch(event.key.keysym.sym)
    108.                 {
    109.                 case VK_ESCAPE:
    110.                     dialogFinished = true;
    111.                     break;
    112.  
    113.                 case VK_LEFT:
    114.                 case VK_RIGHT:
    115.                 {
    116.                     gcn::FocusHandler* focusHdl = gui_top->_getFocusHandler();
    117.                     gcn::Widget* activeWidget = focusHdl->getFocused();
    118.                     if(activeWidget == cmdCancel)
    119.                         cmdOK->requestFocus();
    120.                     else if(activeWidget == cmdOK)
    121.                         cmdCancel->requestFocus();
    122.                     continue;
    123.                 }
    124.                 break;
    125.  
    126.                 case VK_X:
    127.                 case VK_A:
    128.                     event.key.keysym.sym = SDLK_RETURN;
    129.                     gui_input->pushInput(event); // Fire key down
    130.                     event.type = SDL_KEYUP;  // and the key up
    131.                     break;
    132.                 }
    133.             }
    134.  
    135.             //-------------------------------------------------
    136.             // Send event to guichan-controls
    137.             //-------------------------------------------------
    138.             gui_input->pushInput(event);
    139.         }
    140.  
    141.         // Now we let the Gui object perform its logic.
    142.         uae_gui->logic();
    143.         // Now we let the Gui object draw itself.
    144.         uae_gui->draw();
    145.         // Finally we update the screen.
    146.         wait_for_vsync();
    147.         SDL_Flip(gui_screen);
    148.     }
    149. }
    150.  
    151.  
    152. bool ShowMessage(const char *title, const char *line1, const char *line2, const char *button1, const char *button2)
    153. {
    154.     dialogResult = false;
    155.     dialogFinished = false;
    156.  
    157.     InitShowMessage();
    158.  
    159.     wndShowMessage->setCaption(title);
    160.     lblText1->setCaption(line1);
    161.     lblText2->setCaption(line2);
    162.     cmdOK->setCaption(button1);
    163.     cmdCancel->setCaption(button2);
    164.     if(strlen(button2) == 0)
    165.     {
    166.         cmdCancel->setVisible(false);
    167.         cmdOK->setPosition(cmdCancel->getX(), cmdCancel->getY());
    168.     }
    169.     ShowMessageLoop();
    170.     ExitShowMessage();
    171.  
    172.     return dialogResult;
    173. }
     
  4. sheel

    sheel I love Asm Administrator

    Hm. Bei dieser Funktion gibt es (von der aufrufenden Stelle aus) keine Möglichkeit abzufragen, welcher der zwei Buttons gedrückt wurde.

    Vielleicht war es keine so tolle Idee, eine sehr unfertige Lib zu verwenden, bei der sich seit 10 Jahren auch nichts mehr getan hat, und nicht mal die Webseite mehr richtig funktioniert...
     
    Zuletzt bearbeitet: 6. August 2017
  5. CypherXG

    CypherXG Grünschnabel

    ok thx....dann muss ne andere Lösung her.... :D
     
Die Seite wird geladen...
Ähnliche Themen - Relativ simpel steh
  1. hansiH
    Antworten:
    5
    Aufrufe:
    540