ERLEDIGT
NEIN
NEIN
ANTWORTEN
2
2
ZUGRIFFE
240
240
EMPFEHLEN
-
Hallo zusammen,
ich habe ein Problem bei der Erstellung einer W32-Anwendung.
Ziel ist es, das jedes Fenster die Anzahl der Mousemoves zählt und ausgibt. Ich zähle mit hilfe der Nachricht WM_MOUSEMOVE und nutze den cbWndExtra-Speicher zum speichern des Wertes.
Aber wenn ich den Wert ausgebe kommt es anscheinend zu einem Speicherüberlauf. Er schreibt die 1 ordnungsgemäß, bei den folgenden kommen sinnlose Zeichen hinten dran bis dann schlussendlich eine Exception kommt.
Weis leider nicht woran das liegt
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215
// Aufgabe_1.cpp : Definiert den Einstiegspunkt für die Anwendung. // #include "stdafx.h" #include "Aufgabe_1.h" #include "stdio.h" #include "atlconv.h" #define MAX_LOADSTRING 100 // Globale Variablen: HINSTANCE hInst; // Aktuelle Instanz TCHAR szTitle[MAX_LOADSTRING]; // Titelleistentext TCHAR szWindowClass[MAX_LOADSTRING]; // Klassenname des Hauptfensters // Vorwärtsdeklarationen der in diesem Codemodul enthaltenen Funktionen: ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: Hier Code einfügen. MSG msg; HACCEL hAccelTable; // Globale Zeichenfolgen initialisieren LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_AUFGABE_1, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); // Anwendungsinitialisierung ausführen: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_AUFGABE_1)); // Hauptnachrichtenschleife: while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int) msg.wParam; } // // FUNKTION: MyRegisterClass() // // ZWECK: Registriert die Fensterklasse. // // KOMMENTARE: // // Sie müssen die Funktion verwenden, wenn Sie möchten, dass der Code // mit Win32-Systemen kompatibel ist, bevor die RegisterClassEx-Funktion // zu Windows 95 hinzugefügt wurde. Der Aufruf der Funktion ist wichtig, // damit die kleinen Symbole, die mit der Anwendung verknüpft sind, // richtig formatiert werden. // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = sizeof(LONG); // Extraspeicher pro Fenster holen wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_AUFGABE_1)); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = MAKEINTRESOURCE(IDC_AUFGABE_1); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassEx(&wcex); } // // FUNKTION: InitInstance(HINSTANCE, int) // // ZWECK: Speichert das Instanzenhandle und erstellt das Hauptfenster. // // KOMMENTARE: // // In dieser Funktion wird das Instanzenhandle in einer globalen Variablen gespeichert, und das // Hauptprogrammfenster wird erstellt und angezeigt. // BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; hInst = hInstance; // Instanzenhandle in der globalen Variablen speichern hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); SetWindowLong(hWnd,0,0); if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } // // FUNKTION: WndProc(HWND, UINT, WPARAM, LPARAM) // // ZWECK: Verarbeitet Meldungen vom Hauptfenster. // // WM_COMMAND - Verarbeiten des Anwendungsmenüs // WM_PAINT - Zeichnen des Hauptfensters // WM_DESTROY - Beenden-Meldung anzeigen und zurückgeben // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; HWND neuesFenster; LPCWSTR lpcwstr_string = L""; char s[20] = ""; long a = GetWindowLong(hWnd,0); switch (message) { case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Menüauswahl bearbeiten: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); _snprintf_s(s, _countof(s), "%d", a); lpcwstr_string = A2BSTR(s); TextOut( hdc, 10, 10, lpcwstr_string, a ); EndPaint(hWnd, &ps); break; case WM_DESTROY: // Wenn es kein Elternfenster gibt, dann Prozess killen if (!GetParent(hWnd)) { PostQuitMessage(0); // Prozess killen } break; case WM_RBUTTONDOWN: neuesFenster = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW | WS_CHILD | WS_CLIPSIBLINGS,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, hWnd, NULL, hInst, NULL); SetWindowLong(neuesFenster,0,0); ShowWindow(neuesFenster, SW_SHOW); UpdateWindow(neuesFenster); // sntprintf() für Ausgabe break; case WM_MOUSEMOVE: a = a+1; SetWindowLong(hWnd,0,a); InvalidateRect(hWnd, NULL, true); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // Meldungshandler für Infofeld. INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE; }
Wäre für jede Hilfe dankbar.
-
Schau mal hier nach, wofür der letzte Parameter von TextOut steht:
MSDN: TextOut
-
15.10.10 08:33 #3
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Außerdem mußt du in jeder Funktion in der du die ATL Konvertierungsmakros verwendest am Anfang der Funktion USES_CONVERSION; spezifieren.
Und warum wandelst du in einen BSTR um? (und nicht einfach in einen Wide-Character-String?) Mal abgesehen davon, dass A2BSTR veraltet ist.
Warum wandelst du überhaupt um - nimm doch einfach überall statt char TCHAR und benutze die generischen Textfunktionen aus tchar.h (statt _snprintf_s einfach _sntprintf_s etc.).
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
Ähnliche Themen
-
short, long, int variablen zerlegen
Von user1234user im Forum C/C++Antworten: 9Letzter Beitrag: 26.05.10, 14:35 -
Bean-Variablen als Parameter einer Methode einer anderen Bean
Von mcdroemmel im Forum Enterprise Java (JEE, J2EE, Spring & Co.)Antworten: 0Letzter Beitrag: 25.06.09, 17:53 -
Datentyp einer Scrollbar von Integer auf Long
Von MatMagic im Forum Visual Basic 6.0Antworten: 0Letzter Beitrag: 22.04.09, 23:00 -
Sortieren einer long-int Zahl
Von Dorschty im Forum C/C++Antworten: 2Letzter Beitrag: 23.05.07, 08:49 -
Von einer Funktion aus auf Variablen einer anderen Funktion zugreifen?
Von JPakusch im Forum C/C++Antworten: 1Letzter Beitrag: 25.06.05, 10:40





Zitieren
Login






