JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=fb284a53e7aa366a7e41ab71b680673cMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Message ohne Messagebox

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Robin
Junior JLI'ler


Alter: 30
Anmeldedatum: 29.10.2008
Beiträge: 73
Wohnort: Inneringen
Medaillen: Keine

BeitragVerfasst am: 31.10.2008, 20:57    Titel: Message ohne Messagebox Antworten mit Zitat

Hallo,

hab mir neulich das buch vom Christian gekauft un so halt en bizzle C++ gelernt.

hab da mal ne kleine frage wie kann man ein Text oder eine Nachricht ausgeben ohne gleich ne neue Messagebox zu machen ?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 01.11.2008, 21:25    Titel: Re: Message ohne Messagebox Antworten mit Zitat

Robin hat Folgendes geschrieben:
Hallo,

hab mir neulich das buch vom Christian gekauft un so halt en bizzle C++ gelernt.

hab da mal ne kleine frage wie kann man ein Text oder eine Nachricht ausgeben ohne gleich ne neue Messagebox zu machen ?

Was für eine Nachricht meinst du denn? Es gibt verschiedene Möglichkeiten, die mir spontan einfallen:
  • std::cout (plattformunabhängig, in der Konsole)
  • OutputDebugString (runtime ausgabe im Output-Fenster
  • mit std::fstream in eine Datei
  • vordefinierte Streams wie std::cerr oder std::clog etc.
  • Assert (gibts vordefinierte Macros in plattformspezifischen Headern)
  • andere diverse Output* Funktionen (plattformspezifisch)
  • compilerspezifische Debug Möglichkeiten
  • Die Error-Macros von DirectX oder OpenGL
  • oder eben die MessageBox
Wenn du willst kann ich dir einige davon auch genauer erläutern. Gibt bestimmt auch noch ein paar andere Möglichkeiten.

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Robin
Junior JLI'ler


Alter: 30
Anmeldedatum: 29.10.2008
Beiträge: 73
Wohnort: Inneringen
Medaillen: Keine

BeitragVerfasst am: 01.11.2008, 21:39    Titel: Antworten mit Zitat

... kenn mich da net so aus...

so wie ich mal glaub kommt in das

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

}

das rein was im hauptfenster angezeigt werden soll...

und da will ich ne nachricht ausgeben ( etwa so )

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 01.11.2008, 22:00    Titel: Antworten mit Zitat

Du hast also schon ein Fenster erstellt und möchtest da einen Text reinschreiben? Dann benutz doch einfach TextOut (oder auch DrawText). Du hast bestimmt eine Window Callback? Da gibt es ein case Zweig der die Nachricht WM_PAINT behandelt, da bekommst du mit BeginPaint() einen HDC den übergibst du der Funktion, zusammen mit dem Text den du schreiben möchtest.

Gruß DXer

PS: Wenn du grad nur Bahnhof verstehst dann poste einfach mal deinen gesammten Quellcode dann mach ich dir ein Beispiel ;)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Robin
Junior JLI'ler


Alter: 30
Anmeldedatum: 29.10.2008
Beiträge: 73
Wohnort: Inneringen
Medaillen: Keine

BeitragVerfasst am: 01.11.2008, 22:13    Titel: Antworten mit Zitat

Ja en Windows Callbck hab ich aber wie ich des Mit WM_PAINT mach weiß i net ( ich komm nur so weit)

CPP:
case WM_PAINT:

BOOL Textausgabe(
HDC hdc,
LPCTSTR lpString
);

BeginPaint(hdc);

// und jetzt ... komm jetzt sowas wie
Textausgabe(hdc, text, "Mein Text");

EndPaint(hdc);

break;


...wenn ich des mach dann kommt
Fehler:

main.cpp(90) : error C2065: 'hdc' : undeclared identifier
main.cpp(93) : error C2065: 'text' : undeclared identifier
main.cpp(93) : error C3861: 'hdc': identifier not found, even with argument-dependent lookup
main.cpp(95) : error C3861: 'hdc': identifier not found, even with argument-dependent lookup


Ok des is mein Code:

CPP:
#include <windows.h>

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

char szClassName[ ] = "MyGame:WindowsApp";

int WINAPI WinMain (HINSTANCE hThisInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpszArgument,
                     int nFunsterStil)
{
    HWND hwnd;           
    MSG messages;     

    WNDCLASSEX wincl;

    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;   

    wincl.style = CS_DBLCLKS;
    wincl.cbSize = sizeof (WNDCLASSEX);

   
    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;                     
    wincl.cbWndExtra = 0;                     
   
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND/*GetStockObject(WHITE_BRUSH)*/;

    if (!RegisterClassEx (&wincl))
        return 0;


    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           "Test Game",    /* Title Text */
           WS_OVERLAPPEDWINDOW |
           WS_VISIBLE,          /* 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 */
           );

    ShowWindow (hwnd, nFunsterStil);

    while (GetMessage (&messages, NULL, 0, 0))
    {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }

    return messages.wParam;
}

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{

    switch (message)
    {
        case WM_DESTROY:
            PostQuitMessage (0);
            break;

        case WM_KEYDOWN:

           switch(wParam)
           {

             case VK_ESCAPE:

            HMENU Menu = CreateMenu();
            HMENU prog = CreateMenu();

            AppendMenu(prog, 0, 1, TEXT("Beenden"));

            AppendMenu(Menu, MF_POPUP, reinterpret_cast<UINT_PTR>(prog), TEXT("Programm"));

            SetMenu(hwnd, Menu);

                  break;

           }
         break;

        case WM_COMMAND:
            switch(wParam)
            {
                case 1:
                DestroyWindow(hwnd);
                    break;

            }

        default:
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}


Thx for Help
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 02.11.2008, 09:58    Titel: Antworten mit Zitat

1. Wieso steht bei WM Paint ein Funktionsprototyp drin?
2. Die Fehler sagen dir eigentlich was Sache ist. Wenn dein Compiler Text nicht kennt, kann er nix ausgeben.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Robin
Junior JLI'ler


Alter: 30
Anmeldedatum: 29.10.2008
Beiträge: 73
Wohnort: Inneringen
Medaillen: Keine

BeitragVerfasst am: 02.11.2008, 11:36    Titel: Antworten mit Zitat

ok kannst du mir mal en beispiel geben wie des mit dem WM_PAINT geht... ich kapier des irgendwie net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 02.11.2008, 12:57    Titel: Antworten mit Zitat

Du musst, wie Jona schon sagte, erstmal den Funktionsprototyp aus der WM_PAINT nehmen. Ich denke der ist dir da versehentlich durch Copy&Paste reingerutsch Razz Dann musst du, wie du richtig erkannt hast, zwischen BeginPaint und EndPaint die Funktion TextOut von der Windows API aufrufen, dann sollte das funktionieren:
CPP:
case WM_PAINT:

// raus damit ;P
//BOOL Textausgabe(
//HDC hdc,
//LPCTSTR lpString
//);

BeginPaint(hdc);

// hier kommt die Textausgabe, die Funktion TextOut ist in WIndows schon
// definiert du musst sie nur aufrufen (wie auch BeginPaint, CreateWindow
// und so weiter:
TextOut( hdc, 400, 300, TEXT("Dies ist ein Text"), 18 );

EndPaint(hdc);

break;


Bei TextOut musst du nur mit den Parametern aufpassen:
Der 2. ist die x-Koordinate und der 3. die y-Koordinate,
der 4. ist der Text und der 5. ist die Länge des Textes + 1; "Dies ist ein Text" hat 17 Zeichen, plus das Nullzeichen das man immer draufrechnen muss. Du kannst auch das WinAPI Macro ARRAYSIZE nehmen:
CPP:
TCHAR text[ ] = "Dies ist ein Text";
TextOut( hdc, 400, 300, text, ARRAYSIZE(text) );


btw: Wenn du es ganz korrekt in C++ machen wolltest (wofür ich meistens plädiere, aber das hier ist WinAPI da ist C ok) könntest du entweder std::string / std::wstring nehmen (was aber bei konstanten Strings Verschwendung wäre) oder ein Array und die Länge über char_traits::length() bestimmen.

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Robin
Junior JLI'ler


Alter: 30
Anmeldedatum: 29.10.2008
Beiträge: 73
Wohnort: Inneringen
Medaillen: Keine

BeitragVerfasst am: 02.11.2008, 13:34    Titel: Antworten mit Zitat

ok hab alles so gmacht wie geagt aber es immer noch nich. Es kommen noch fehler dass er des "hdc" nich findet. Sad
Kannst du viellt. mein ganzen code ( den ich auch gepostet hab ) aktualisiern also des WM_Paint und so einfügen und dann mir posten ?

Gruß Robin
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 03.11.2008, 09:41    Titel: Antworten mit Zitat

Robin hat Folgendes geschrieben:
ok hab alles so gmacht wie geagt aber es immer noch nich. Es kommen noch fehler dass er des "hdc" nich findet. Sad
Kannst du viellt. mein ganzen code ( den ich auch gepostet hab ) aktualisiern also des WM_Paint und so einfügen und dann mir posten ?

Gruß Robin


Hast du schonmal überlegt wieso er den "hdc" nicht finden kann? Evtl solltest du das versuchen um den Fehler selbst zu finden. Zumindest ich kenne die Lösung aber diese hier einfach so zu zeigen... wäre langweilig.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Robin
Junior JLI'ler


Alter: 30
Anmeldedatum: 29.10.2008
Beiträge: 73
Wohnort: Inneringen
Medaillen: Keine

BeitragVerfasst am: 03.11.2008, 13:06    Titel: Antworten mit Zitat

Very Happy habs hinbekommen...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum