Wie gebe ich in WINAPI eine einfache Variable aus?
-
#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); }