Programmieren in C-Fragen

      Programmieren in C-Fragen

      Hallo! :)
      Ich Programmiere Programme in C. Jetzt möchte ich ein Bild in eine Message-Box einfügen. Wie mache ich das, dass ich das Bild nach dem Compilieren noch sehe?
      Und kann man so ein Main-Menü in ein DOS-Programm einfügen? Ist es auch möglich, eine Hintergrund-Musik einzufügen, die auch jemand hören kann, der die Musik nicht auf dem PC hat?

      ...genaue Rechtschreibung und auf eine saubere äußere Form! :success:

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Knato ()

      Eine Messagebox mit einem Bild? Das wäre glaub ich gegen jede Designrichtlinie (außer es ist so ein Warnzeichen oder so), aber Messageboxen sind doch Messageboxen und keine Pictureboxen. Weitere Frage: Du hast ein DOS-Programm (ich nehme an, Du meinst Konsolenprogramm) und willst eine Messagebox ausgeben? Ich denke nicht, dass das ohne weiteres Möglich ist.

      Ein Hauptmenü kannst Du über eine Schleife einfügen. Du sorgst einfach immer dafür, dass ein Programmpunkt irgendwie in der Schleife ist

      Quellcode

      1. do
      2. {
      3. printf("[n] Menuepunkt n");
      4. //...
      5. scanf("%c", &choice);
      6. switch(choice)
      7. {
      8. case 'n': callfunction_n(123, 456);
      9. case '0': break;
      10. default: printf("Eingabe ungueltig");
      11. }
      12. }while(choice != '0');
      13. }
      Alles anzeigen

      So bricht Dein Programm nie aus.

      Musik gibt es in verschiedenen Formen. Ich denke, es ist möglich irgendwie 8 Bit Musik wiederzugeben oder zumindest den internen Lautsprecher anzusprechen, aber was nicht vorhanden ist, kann nicht ausgegeben werden. Wäre ja so, als wolltest Du ein Sandwich essen, obwohl Dir keiner eins gemacht hat.

      Für Musik müsstest Du aber sowieso einen Hintergrund-Thread laufen lassen und Threading würde ich am Anfang nicht empfehlen, da die Erzeugung und Kontrolle aufwändig ist und unter Umständen Zombieprozesse laufen lässt.
      NameWertWert
      ModellNintendo 3DS XL weißNintendo Switch Grau
      SystemmenüLuma3DS 11.8.0Kosmos 8.1.0
      Aktuelles SpielMeisterdetektiv Pikachu
      Monster Hunter Generations Ultimate
      Danke für die Infos. Ja, ok nicht Messagebox mit Bild sondern einfach dass ich ein Bild einfügen kann. Und ich habe in mein DOS-Programm eine Messagebox eingefügt. Und mit Bildern und Menü in einem DOS-Programm meine ich sowas wie im Anhang, das von Microsoft programmiert wurde. Da ist ein Hintergrundbild und oben so ein Menü wie bei den richtigen Windows-Programmen.
      Dateien
      • winhelp.zip

        (131,82 kB, 106 mal heruntergeladen, zuletzt: )

      ...genaue Rechtschreibung und auf eine saubere äußere Form! :success:

      Mmm Du solltest an den Begrifflichkeiten arbeiten.
      Du erstellst eine Konsolenanwendung. Konsolenanwendungen können nur in der Konsole laufen und haben dementsprechend nur die beschränkten Möglichkeiten. Grafisch ist da also nicht sonderlich viel zu sehen.

      Du willst aber raus aus der Konsole und ein Fenster haben. Dafür musst Du die Win32-API ansprechen. Diese erstellt Dir in weniger als 50 Zeilen ein einfaches Fenster.
      Da verlinke ich einfach mal auf Pronix. Damit habe ich auch meine C-Anfänge gemacht.
      pronix.de/pronix-1024.html

      Ich hoffe das Hilft ;) Ist nicht ganz einfach.
      NameWertWert
      ModellNintendo 3DS XL weißNintendo Switch Grau
      SystemmenüLuma3DS 11.8.0Kosmos 8.1.0
      Aktuelles SpielMeisterdetektiv Pikachu
      Monster Hunter Generations Ultimate

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Penman () aus folgendem Grund: Pronix Fenster sind C++

      Ok. Danke! Ich werd mich mal dranmachen. Nächste frage:
      Wie kann man einen Installer programmieren?

      ...genaue Rechtschreibung und auf eine saubere äußere Form! :success:

      Ruhig an^^
      Der Installer wird überbewertet und dient oftmals einfach nur zur Anleitung von typischen Usern.
      Im Grunde tut er ja nichts anderes als Verknüpfungen anlegen und Registry Einträge setzen und das muss man selbst entscheiden.

      An sich kannst Du aber Installer programmieren und nutzen, wie Du lustig bist. Ist bei Dir wahrscheinlich eh nur Dateien kopieren.
      Ich würds aber erst einmal weglassen und einfach die fertige exe verteilen.

      Mittels Visual Studio lassen sich Projekte mit Installern versehen, aber auch Windows (7) hat schon ein integriertes Tool, um MSI Dateien zu erstellen. Leider habe ich den Namen vergessen.

      Double_A, lass ihn doch erst einmal C lernen. Ich finde C ist für den Einstieg ganz gut, da wird man nicht gleich mit OOP erschlagen, sondern kann langsam seine Konsolenanwendungen zum Laufen bringen und ein Gefühl für Programmierlogik bekommen.
      NameWertWert
      ModellNintendo 3DS XL weißNintendo Switch Grau
      SystemmenüLuma3DS 11.8.0Kosmos 8.1.0
      Aktuelles SpielMeisterdetektiv Pikachu
      Monster Hunter Generations Ultimate

      Double_A schrieb:

      Hi,

      Also wenn du wirklich was lernen willst, was du später aus Produktiv anwenden möchtest, dann lerne am besten Visual C#.
      Da haste auch mit Visual Studio 2010 Express ne schöne Entwicklungsumgebung, und muss nicht mit grundlegenden Sachen herumkrampfen...

      microsoft.com/germany/express/products/windows.aspx


      Werd ich vielleicht mal irgendwann lernen.

      Penman schrieb:


      Ruhig an
      Der Installer wird überbewertet und dient oftmals einfach nur zur Anleitung von typischen Usern.
      Im Grunde tut er ja nichts anderes als Verknüpfungen anlegen und Registry Einträge setzen und das muss man selbst entscheiden.

      An sich kannst Du aber Installer programmieren und nutzen, wie Du lustig bist. Ist bei Dir wahrscheinlich eh nur Dateien kopieren.
      Ich würds aber erst einmal weglassen und einfach die fertige exe verteilen.

      Mittels Visual Studio lassen sich Projekte mit Installern versehen, aber auch Windows (7) hat schon ein integriertes Tool, um MSI Dateien zu erstellen. Leider habe ich den Namen vergessen.

      Double_A, lass ihn doch erst einmal C lernen. Ich finde C ist für den Einstieg ganz gut, da wird man nicht gleich mit OOP erschlagen, sondern kann langsam seine Konsolenanwendungen zum Laufen bringen und ein Gefühl für Programmierlogik bekommen.


      In der Anleitung steht, man soll diesen Code compilieren:

      Quellcode
      #include <windows.h>

      LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

      LPCSTR lpszAppName = _T("AppName");
      LPCSTR lpszTitle = _T("Meine erste Applikation");

      int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
      PSTR szCmdLine, int iCmdShow)
      {
      HWND hWnd;
      MSG msg;
      WNDCLASSEX wc;

      wc.cbSize = sizeof(WNDCLASSEX);
      wc.style = CS_HREDRAW | CS_VREDRAW;
      wc.lpfnWndProc = WndProc;
      wc.cbClsExtra = 0;
      wc.cbWndExtra = 0;
      wc.hInstance = hInstance;
      wc.hCursor = LoadCursor(NULL,IDC_ARROW);
      wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
      wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
      wc.lpszClassName = lpszAppName;
      wc.lpszMenuName = lpszAppName;
      wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

      if( RegisterClassEx(&wc) == 0)
      return 0;

      hWnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,
      lpszAppName,
      lpszTitle,
      WS_OVERLAPPEDWINDOW,
      0,
      0,
      CW_USEDEFAULT,
      CW_USEDEFAULT,
      NULL,
      NULL,
      hInstance,
      NULL);

      if( hWnd == NULL)
      return 0;

      ShowWindow(hWnd, iCmdShow);
      UpdateWindow(hWnd);

      while (GetMessage(&msg, NULL, 0, 0) > 0)
      {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
      }
      return msg.wParam;
      }

      LRESULT CALLBACK WndProc(HWND hWnd, UINT umsg, WPARAM wParam, LPARAM lParam)
      {
      switch (umsg)
      {
      case WM_DESTROY:
      {
      PostQuitMessage(0);
      return 0;
      }
      }
      return DefWindowProc(hWnd, umsg, wParam, lParam);
      }


      Wenn ich aber compiliere wird mir das angezeigt:

      Fehler beim Compilieren
      #include <windows.h>

      LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

      LPCSTR lpszAppName = _T("AppName");
      LPCSTR lpszTitle = _T("Meine erste Applikation");

      int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
      PSTR szCmdLine, int iCmdShow)
      {
      HWND hWnd;
      MSG msg;
      WNDCLASSEX wc;

      wc.cbSize = sizeof(WNDCLASSEX);
      wc.style = CS_HREDRAW | CS_VREDRAW;
      wc.lpfnWndProc = WndProc;
      wc.cbClsExtra = 0;
      wc.cbWndExtra = 0;
      wc.hInstance = hInstance;
      wc.hCursor = LoadCursor(NULL,IDC_ARROW);
      wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
      wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
      wc.lpszClassName = lpszAppName;
      wc.lpszMenuName = lpszAppName;
      wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

      if( RegisterClassEx(&wc) == 0)
      return 0;

      hWnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,
      lpszAppName,
      lpszTitle,
      WS_OVERLAPPEDWINDOW,
      0,
      0,
      CW_USEDEFAULT,
      CW_USEDEFAULT,
      NULL,
      NULL,
      hInstance,
      NULL);

      if( hWnd == NULL)
      return 0;

      ShowWindow(hWnd, iCmdShow);
      UpdateWindow(hWnd);

      while (GetMessage(&msg, NULL, 0, 0) > 0)
      {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
      }
      return msg.wParam;
      }

      LRESULT CALLBACK WndProc(HWND hWnd, UINT umsg, WPARAM wParam, LPARAM lParam)
      {
      switch (umsg)
      {
      case WM_DESTROY:
      {
      PostQuitMessage(0);
      return 0;
      }
      }
      return DefWindowProc(hWnd, umsg, wParam, lParam);
      }


      Das wird als Fehler angezeigt:

      `_T' was not declared in this scope

      Was soll ich jetzt tun?

      ...genaue Rechtschreibung und auf eine saubere äußere Form! :success:



      Was?
      Das ist schon C. Kann ich auch diesen Code verwenden:

      Spoiler anzeigen
      #include <windows.h>

      /* Declare Windows procedure */
      LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

      /* Make the class name into a global variable */
      char szClassName[ ] = "WindowsApp";

      int WINAPI WinMain (HINSTANCE hThisInstance,
      HINSTANCE hPrevInstance,
      LPSTR lpszArgument,
      int nFunsterStil)

      {
      HWND hwnd; /* This is the handle for our window */
      MSG messages; /* Here messages to the application are saved */
      WNDCLASSEX wincl; /* Data structure for the windowclass */

      /* The Window structure */
      wincl.hInstance = hThisInstance;
      wincl.lpszClassName = szClassName;
      wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */
      wincl.style = CS_DBLCLKS; /* Catch double-clicks */
      wincl.cbSize = sizeof (WNDCLASSEX);

      /* Use default icon and mouse-pointer */
      wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
      wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
      wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
      wincl.lpszMenuName = NULL; /* No menu */
      wincl.cbClsExtra = 0; /* No extra bytes after the window class */
      wincl.cbWndExtra = 0; /* structure or the window instance */
      /* Use Windows's default color as the background of the window */
      wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

      /* Register the window class, and if it fails quit the program */
      if (!RegisterClassEx (&wincl))
      return 0;

      /* The class is registered, let's create the program*/
      hwnd = CreateWindowEx (
      0, /* Extended possibilites for variation */
      szClassName, /* Classname */
      "Windows App", /* Title Text */
      WS_OVERLAPPEDWINDOW, /* default window */
      CW_USEDEFAULT, /* Windows decides the position */
      CW_USEDEFAULT, /* where the window ends up on the screen */
      544, /* The programs width */
      375, /* and height in pixels */
      HWND_DESKTOP, /* The window is a child-window to desktop */
      NULL, /* No menu */
      hThisInstance, /* Program Instance handler */
      NULL /* No Window Creation data */
      );

      /* Make the window visible on the screen */
      ShowWindow (hwnd, nFunsterStil);

      /* Run the message loop. It will run until GetMessage() returns 0 */
      while (GetMessage (&messages, NULL, 0, 0))
      {
      /* Translate virtual-key messages into character messages */
      TranslateMessage(&messages);
      /* Send message to WindowProcedure */
      DispatchMessage(&messages);
      }

      /* The program return-value is 0 - The value that PostQuitMessage() gave */
      return messages.wParam;
      }


      /* This function is called by the Windows function DispatchMessage() */

      LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
      {
      switch (message) /* handle the messages */
      {
      case WM_DESTROY:
      PostQuitMessage (0); /* send a WM_QUIT to the message queue */
      break;
      default: /* for messages that we don't deal with */
      return DefWindowProc (hwnd, message, wParam, lParam);
      }

      return 0;
      }


      Das ist der Code, den mir mein Compiler bei der Auswahl von Windows App ausgibt. Diesen kann ich auch compilieren.

      ...genaue Rechtschreibung und auf eine saubere äußere Form! :success:

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Knato ()

      Spoiler funktionieren nur, wenn im Spoiler-Titel keine Sonderzeichen stehen (maximal ein Komma ist m.W. erlaubt). Vielleicht ist auch einfach der Titel zu lang ^^

      Ganz unabhängig davon würde ich dir raten, dich bzgl. Programmierfragen in speziellen Communities umzuhören. Die handvoll User, die hier wirklich Ahnung von der Materie haben und obendrein so viel Zeit und Freundlichkeit, dir zu helfen... das ist nicht gerade vielversprechend, wenn du verstehst. Ich frage ja auch nicht in eine Analphabetenrunde, wie man "Desoxirybonucleinsäure" schreibt. ^^
      Was?Info
      ModellStandard (weiß, Release-Day)
      Zubehörinterne 500GB HDD, SDHC 32GB, LAN-Adapter, 128MB MemoryCard
      Wi-Fi SpieleWiimm's MKW Fun, Mario Kart Wii, Super Smash Bros. Brawl, ...

      Was?Info
      ModellPremium (schwarz, Release-Day)
      Zubehör500GB 2,5" HDD (schwarz), SDHC 32GB
      Wi-Fi SpieleMario Kart 8, Nintendo Land, Sonic Racing (S&ASRT), ...

      Was?Info
      Modell3DS XL (blau-schwarz)
      ZubehörSuperCard DSTwo, 4GB SDHC
      Wi-Fi SpieleMario Kart 7, ...

      Was?Code / ID
      Wiimm's MKW-Fun0904-9558-6482
      Nintendo Network IDEnting
      Nintendo 3DS5455-9634-9827


      Danke an feeder für meinen tollen Avatar!

      Knato schrieb:

      Das ist der Code, den mir mein Compiler bei der Auswahl von Windows App ausgibt. Diesen kann ich auch compilieren.


      Wenn Du diesen kompilieren kannst und er das gewünschte Ergebnis bringt, kannst Du ihn nutzen. Dann musst Du nur die API durchschauen und mal sehen, was Du so brauchst.
      msdn.microsoft.com/en-us/library/ff818516(v=vs.85).aspx könnte hilfreich sein.

      Aber den Facepalm verstehe ich gerade auch nicht. Ich hab noch einmal genauer gelesen und festgestellt, dass es sich doch um C bzw C++ kompatiblen Code handelt. Wo also liegt das Problem?
      NameWertWert
      ModellNintendo 3DS XL weißNintendo Switch Grau
      SystemmenüLuma3DS 11.8.0Kosmos 8.1.0
      Aktuelles SpielMeisterdetektiv Pikachu
      Monster Hunter Generations Ultimate
      Und wie mache ich jetzt das, dass ich ein Bild einfüge?

      ...genaue Rechtschreibung und auf eine saubere äußere Form! :success: