|
JLI Spieleprogrammierung
|
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
|
Verfasst am: 31.10.2008, 20:57 Titel: Message ohne Messagebox |
|
|
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 |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 01.11.2008, 21:25 Titel: Re: Message ohne Messagebox |
|
|
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 |
|
|
Robin Junior JLI'ler
Alter: 30 Anmeldedatum: 29.10.2008 Beiträge: 73 Wohnort: Inneringen Medaillen: Keine
|
Verfasst am: 01.11.2008, 21:39 Titel: |
|
|
... 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 |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 01.11.2008, 22:00 Titel: |
|
|
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 |
|
|
Robin Junior JLI'ler
Alter: 30 Anmeldedatum: 29.10.2008 Beiträge: 73 Wohnort: Inneringen Medaillen: Keine
|
Verfasst am: 01.11.2008, 22:13 Titel: |
|
|
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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 02.11.2008, 09:58 Titel: |
|
|
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 |
|
|
Robin Junior JLI'ler
Alter: 30 Anmeldedatum: 29.10.2008 Beiträge: 73 Wohnort: Inneringen Medaillen: Keine
|
Verfasst am: 02.11.2008, 11:36 Titel: |
|
|
ok kannst du mir mal en beispiel geben wie des mit dem WM_PAINT geht... ich kapier des irgendwie net |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 02.11.2008, 12:57 Titel: |
|
|
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 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 |
|
|
Robin Junior JLI'ler
Alter: 30 Anmeldedatum: 29.10.2008 Beiträge: 73 Wohnort: Inneringen Medaillen: Keine
|
Verfasst am: 02.11.2008, 13:34 Titel: |
|
|
ok hab alles so gmacht wie geagt aber es immer noch nich. Es kommen noch fehler dass er des "hdc" nich findet.
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 |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 03.11.2008, 09:41 Titel: |
|
|
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.
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 |
|
|
Robin Junior JLI'ler
Alter: 30 Anmeldedatum: 29.10.2008 Beiträge: 73 Wohnort: Inneringen Medaillen: Keine
|
Verfasst am: 03.11.2008, 13:06 Titel: |
|
|
habs hinbekommen... |
|
Nach oben |
|
|
|
|
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
|