Wie gebe ich in WINAPI eine einfache Variable aus?
-
#include <windows.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); //Deklaration der Windows-Nachrichten-Prozedur int WINAPI WinMain (HINSTANCE hI, HINSTANCE hPrI, PSTR szCmdLine, int iCmdShow) { char szName[] = "Fensterklasse"; WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW; // CS = "class style" wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hI; wc.hIcon = LoadIcon (NULL, IDI_WINLOGO); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = szName; RegisterClass (&wc); HWND hwnd = CreateWindow (szName, "", WS_SYSMENU | WS_THICKFRAME, 0, 0, 200, 100, NULL, NULL, hI, NULL); ShowWindow (hwnd, iCmdShow); UpdateWindow (hwnd); // Nachrichten-Schleife MSG msg; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam; } // Windows-Nachrichten-Prozedur LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; switch (message) { case WM_PAINT: hdc = BeginPaint (hwnd, &ps); TextOut (hdc, 20, 20, "Ich bin ein Fenster.", 20); EndPaint (hwnd, &ps); return 0; case WM_DESTROY: PostQuitMessage (0); return 0; } return DefWindowProc (hwnd, message, wParam, lParam); }Hier wird nur "Ich bin ein Fenster ausgegeben. Wie kann ich Variablen ausgeben?
-
Ich gehe mal davon aus, Du meinst "Zahlen"-Variablen wie Integer usw.?
Dann ersetze in Deinem Code einfach den starren Text "Ich bin ein Fenster." durch eine Stringvariable.
Ich hoffe, Du weißt wie man Variablen deklariert?
Vor der Ausgabe mit TextOut: Wandel den Inhalt einer Integer-Variable z.B. per sprintf() in einen String um und gebe den Inhalt des Strings aus.
HTH,
Martin
-
TCHAR szText[20]; UINT nTest = 10; StringCchPrintf(szText, 20, _T("Ich bin eine UINT-Variable mit dem Wert %ld."), nTest); TextOut (hdc, 20, 20, szText, lstrlen(szText));
-
sri schrieb:
TCHAR szText[20]; UINT nTest = 10; StringCchPrintf(szText, 20, _T("Ich bin eine UINT-Variable mit dem Wert %ld."), nTest); TextOut (hdc, 20, 20, szText, lstrlen(szText));Compiler meckert:
error C3861: "StringCchPrintf": Bezeichner wurde nicht gefunden. error C3861: "_T": Bezeichner wurde nicht gefunden.
-
strsafe.h für StringCchPrintf und TCHAR.h für _T includieren
-
#include <windows.h> #include <TCHAR.h> #include <strsafe.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain (HINSTANCE hI, HINSTANCE hPrI, PSTR szCmdLine, int iCmdShow) { TCHAR szText[20]; UINT nTest = 10; StringCchPrintf(szText, 20, _T("Ich bin eine UINT-Variable mit dem Wert %ld."), nTest); char szName[] = "Fensterklasse"; WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hI; wc.hIcon = LoadIcon (NULL, IDI_WINLOGO); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) GetStockObject (LTGRAY_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = szName; RegisterClass (&wc); HWND hwnd = CreateWindow // Fenster 1 ( szName, "Dies ist unser erstes kleines Fenster", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, // Handle des Elternfensters nicht vorhanden NULL, hI, NULL ); ShowWindow (hwnd, iCmdShow); UpdateWindow (hwnd); HWND hwnd2 = CreateWindow // Fenster 2 ( szName, "Dies ist unser zweites kleines Fenster", WS_CHILD | WS_THICKFRAME, 200, 200, 200, 50, hwnd, // Handle des Elternfensters NULL, NULL, NULL ); ShowWindow (hwnd2, SW_SHOWNORMAL); UpdateWindow (hwnd2); //----------------------------------------------------------------------------------- MSG msg; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam; } //----------------------------------------------------------------------------------- LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; switch (message) { case WM_PAINT: hdc = BeginPaint (hwnd, &ps); TextOut (hdc, 20, 20, szText, lstrlen(szText)); EndPaint (hwnd, &ps); return 0; case WM_DESTROY: PostQuitMessage (0); return 0; } return DefWindowProc (hwnd, message, wParam, lParam); }Fehler:
error C2065: 'szText': nichtdeklarierter Bezeichner error C2065: 'szText': nichtdeklarierter Bezeichner
-
Es gibt halt kein szText in WndProc (Stichwort Gültigkeit von Variablen)...
-
_matze schrieb:
Es gibt halt kein szText in WndProc (Stichwort Gültigkeit von Variablen)...
Aha, ok. Und wie löse ich mein Problem? Variable ausgeben.

-
Wie wärs für den Anfang, wenn du die Variable da deklarierst, wo du sie auch benutzen willst?
-
_matze schrieb:
Wie wärs für den Anfang, wenn du die Variable da deklarierst, wo du sie auch benutzen willst?
case WM_PAINT: TCHAR szText[20]; UINT nTest = 10; StringCchPrintf(szText, 20, _T("Ich bin eine UINT-Variable mit dem Wert %ld."), nTest); hdc = BeginPaint (hwnd, &ps); TextOut (hdc, 20, 20, szText, lstrlen(szText)); EndPaint (hwnd, &ps); return 0;Meinst Du so? Ich check' das irgendwie nicht...
-
ja so sollte es klappen. Was ist da so schwer? Lokale Variablen haben nur einen Gültigkeitsbereich bis zum Ende der Funktion, darum kannst du auch nicht von deinem Callback auf WinMain Variablen zugreifen.
-
skullyan schrieb:
_matze schrieb:
Wie wärs für den Anfang, wenn du die Variable da deklarierst, wo du sie auch benutzen willst?
case WM_PAINT: TCHAR szText[20]; UINT nTest = 10; StringCchPrintf(szText, 20, _T("Ich bin eine UINT-Variable mit dem Wert %ld."), nTest); hdc = BeginPaint (hwnd, &ps); TextOut (hdc, 20, 20, szText, lstrlen(szText)); EndPaint (hwnd, &ps); return 0;Meinst Du so? Ich check' das irgendwie nicht...
Ja, im Grunde schon. Aber hast du es ausprobiert? Du wirst doch sicher einen Compiler-Fehler bekommen haben, oder (Fehler am besten immer direkt mitposten)? Mit Variablendeklarationen in case-Zweigen ist das nämlich so eine Sache. Schließt du hingegen alles einfach in einen eigenen Block ein (geschweifte Klammern), geht es. Also in etwa so:
case WM_PAINT: { TCHAR szText[20]; UINT nTest = 10; StringCchPrintf(szText, 20, _T("Ich bin eine UINT-Variable mit dem Wert %ld."), nTest); hdc = BeginPaint (hwnd, &ps); TextOut (hdc, 20, 20, szText, lstrlen(szText)); EndPaint (hwnd, &ps); return 0; }
-
_matze schrieb:
skullyan schrieb:
_matze schrieb:
Wie wärs für den Anfang, wenn du die Variable da deklarierst, wo du sie auch benutzen willst?
case WM_PAINT: TCHAR szText[20]; UINT nTest = 10; StringCchPrintf(szText, 20, _T("Ich bin eine UINT-Variable mit dem Wert %ld."), nTest); hdc = BeginPaint (hwnd, &ps); TextOut (hdc, 20, 20, szText, lstrlen(szText)); EndPaint (hwnd, &ps); return 0;Meinst Du so? Ich check' das irgendwie nicht...
Ja, im Grunde schon. Aber hast du es ausprobiert? Du wirst doch sicher einen Compiler-Fehler bekommen haben, oder (Fehler am besten immer direkt mitposten)? Mit Variablendeklarationen in case-Zweigen ist das nämlich so eine Sache. Schließt du hingegen alles einfach in einen eigenen Block ein (geschweifte Klammern), geht es. Also in etwa so:
case WM_PAINT: { TCHAR szText[20]; UINT nTest = 10; StringCchPrintf(szText, 20, _T("Ich bin eine UINT-Variable mit dem Wert %ld."), nTest); hdc = BeginPaint (hwnd, &ps); TextOut (hdc, 20, 20, szText, lstrlen(szText)); EndPaint (hwnd, &ps); return 0; }Ja, die Klammern waren die Lösung. Danke nochmals...

Wenn ich jetzt aber kompiliere, wird nur "Ich bin eine UINT-V" ausgegeben. Wenn ich den Parameter vor dem String "Ich bin eine UINT-Variable mit dem Wert %ld." erhöhe, sagt er, dass ein Problem mit dem "Stack" vorliegt.
Run-Time Check Failure #2 - Stack around the variable 'szText' was corrupted.
-
Warum lernst Du nicht zuerst mal C? Das ist schwierig genug, mit der WinAPI kannst Du Dich dann immer noch beschäftigen.
Zu Deinem Problem:
Überleg doch mal, wieviel Zeichen der Text ca. haben wird, den Du ausgeben willst, und wieviel Platz Du zur Verfügung stellst ...
-
Belli schrieb:
Warum lernst Du nicht zuerst mal C? Das ist schwierig genug, mit der WinAPI kannst Du Dich dann immer noch beschäftigen.
Zu Deinem Problem:
Überleg doch mal, wieviel Zeichen der Text ca. haben wird, den Du ausgeben willst, und wieviel Platz Du zur Verfügung stellst ...Stimmt, ich idiot... ^^
-
mach doch so, ist viel einfacher:
void print_intvar (int x) { char buff[32]; sprintf (buff, "%d", x); MessageBoxA (0, buff, "Meine Variable ist:", MB_OK); }