Inhalt aus Editfenster mit SendMessage(..) per Button an Hauptfenster übergeben
-
**Hallo ich hab da ein Problem den Inhalt des Editfensters
an die Variable(Pointer) *pText in Zeile 64 zu übergeben.
Wenn ich den Button hButtonRead aus Zeile 145SendMessage(hEditH, WM_GETTEXT, 5, (LPARAM)pText);
klicke, soll der Inhalt vom Editfenster ausgelesen und als Text im Hauptfenster
ausgegeben werden siehe Zeile 86TextOut(hDC, 50,100, pText, sizeof(pText));
.
Wenn ich das Programm starte läuft noch alles, doch sobald ich den
Button drücke stürzt das Programm ab.**#include <windows.h> #include <stdio.h> #include <stdlib.h> //#include <string.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { HWND hWnd; MSG msg; WNDCLASS wc; const char szAppName[] = "PC Herunterfahren 1.0"; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = CreateSolidBrush(RGB(128, 184, 223)); //(HBRUSH)GetStockObject(LTGRAY_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = szAppName; RegisterClass(&wc); hWnd = CreateWindow( szAppName, szAppName, WS_OVERLAPPED | WS_SYSMENU, //WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, /* X-Position auf dem Monitor ,Zahl oder CW_USEDEFAULT*/ CW_USEDEFAULT, /* Y-Position auf dem Monitor */ 400, /* Fensterbreite */ 300, /* Fensterhoehe */ NULL, NULL, hInstance, NULL ); ShowWindow(hWnd, iCmdShow); UpdateWindow(hWnd); while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } //------------------------------------------------------------------------------------------------- LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hEditH; //Edithandle wird erstellt static HWND hButton; //Buttonhandle wird erstellt static HWND hButtonRead; char buffer[2]; const char *pConst = "leer"; char *pText = new char[]; pText = const_cast<char*>(pConst); switch(message) { case WM_PAINT: { PAINTSTRUCT ps; HDC hDC; const char szText[] = "Hallo, dies ist der Text."; //SYSTEMTIME tm; GetSystemTime(&tm); //long Zeit = (long) GetCurrentTime(); //GetSystemTime(), GetLocalTime() //GetTickCount(); //sprintf(buffer, "%d", 5); itoa(123456, buffer, 10); //itoa(Zahl, -> char[], Basis); hDC = BeginPaint(hWnd, &ps); { SetBkMode(hDC, TRANSPARENT); //setzt die Texthintergrundfarbe auf transparent TextOut(hDC, 50, 10, szText, sizeof(szText) - 1); TextOut(hDC, 50,100, pText, sizeof(pText)); TextOut(hDC, 50,150,"ABC ", 50); TextOut(hDC, 50,200,buffer, sizeof(buffer)+8 ); SetPixel(hDC, 2,2, BLACK_BRUSH); } EndPaint(hWnd, &ps); return 0; } case WM_CREATE: { hEditH = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", NULL, // <- das ist der Inhalt des Editfelds WS_CHILD | WS_VISIBLE, //| WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 0, 0, 0, 0, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); hButton = CreateWindow( "button", "Beenden", WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); hButtonRead = CreateWindow( "button", "read", WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); return 0; } case WM_SIZE: { MoveWindow(hEditH, 80, 50, 100, 20, TRUE); // MoveWindow(hEdit, 20, 50, LOWORD(lParam), HIWORD(lParam), TRUE); // static bool MoveWindow(IntPtr handle, int x, int y, int width, int height, bool redraw); MoveWindow(hButton, LOWORD(lParam) / 2 - 50, HIWORD(lParam) - 30, 100, 22, TRUE); MoveWindow(hButtonRead, 200, 50, 50, 22, TRUE); return 0; } case WM_COMMAND: { if (lParam == (LPARAM)hButton) { if (HIWORD(wParam) == BN_CLICKED) SendMessage(hWnd, WM_CLOSE, 0, 0); } if (lParam == (LPARAM)hButtonRead) { if (HIWORD(wParam) == BN_CLICKED) { SendMessage(hEditH, WM_GETTEXT, 5, (LPARAM)pText); /* //Textlänge ermitteln (die 1 für Terminierung) int le = SendMessage(hEditH,WM_GETTEXTLENGTH,0,0) + 1; //Entsprechend Speicher belegen char* buf = new char[le]; //Window - Text in Buffer kopieren SendMessage(hEditH,WM_GETTEXT,(WPARAM)le,(LPARAM)buf); text = buf; //SendMessage(hwndEdit2, WM_GETTEXT, msize(textstring), (long) textstring); //in ein Integer konvertieren //int myVal = atoi(buf); //Speicher freigeben; //delete [] buf; */ } } return 0; } case WM_CLOSE: { DestroyWindow(hWnd); return 0; } case WM_DESTROY: { PostQuitMessage(0); return 0; } } return DefWindowProc(hWnd, message, wParam, lParam); } /* char *buffer = NULL; int iLength; iLength = GetWindowTextLength(hEdit); buffer = (char*) malloc(iLength); GetWindowText(hEdit, buffer, iLength+1); SENDMESSAGE() Eine sehr breit einsetzbare Funktion ist SendMessage(...). Die allgemeine Syntax ist: LRESULT SendMessage ( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam ); Der erste Parameter legt das Fenster fest, an das die Nachricht gesendet werden soll. Dann folgt die Nachricht und ihre beiden Parameter. Wir senden also die Nachricht EM_SETREADONLY mit den Parametern wParam = TRUE und lParam = 0. In MSDN finden Sie die betreffenden Informationen: */
**Wer kann mir helfen das Programm zum laufen zubringen?
Ich habe leider keine Erfahrung damit, war schon schwer genug das Programm so hinzubekommen wie es jetzt ist, und hab schon nach Lösungen in anderen vergleichbaren Threads gesucht doch nichts passendes gefunden.Vielen Dank im Voraus für Hilfe.**
Grüsse rom4o
-
if (lParam == (LPARAM)hButtonRead) { if (HIWORD(wParam) == BN_CLICKED) { SendMessage(hEditH, WM_GETTEXT, 5, (LPARAM)pText); /* //Textlänge ermitteln (die 1 für Terminierung) int le = SendMessage(hEditH,WM_GETTEXTLENGTH,0,0) + 1; //Entsprechend Speicher belegen char* buf = new char[le]; //Window - Text in Buffer kopieren SendMessage(hEditH,WM_GETTEXT,(WPARAM)le,(LPARAM)buf); text = buf; //SendMessage(hwndEdit2, WM_GETTEXT, msize(textstring), (long) textstring); //in ein Integer konvertieren //int myVal = atoi(buf); //Speicher freigeben; //delete [] buf; */ } }
an dieser stelle ist pText nich groß genug allokiert...
-
1. Lerne C++, der folgene Code ist absoluter Unsinn:
char *pText = new char[]; pText = const_cast<char*>(pConst); Und das auch noch mit jeder Nachricht.
2. Du kannst doch nicht erwarten in einen konstanten Speicher Daten einzulesen!
3. Warum machst Du es nicht so, wie es da in dem auskommentierten Textsteht?
-
Hallo, erst mal danke für die Antworten bisher.
@BorisDieKlinge
ich verstehe nicht wie du das meinstpText nich groß genug allokiert
Was soll ich denn ändern dass es funktioniert?
Ich habe folgendes probiert Zeile 64 stattchar *pText = new char[];
habe ich einen größeren Zeichenbereich reserviert
char *pText = new char[50];
hat aber nix gebracht.
@Martin Richter
*pText ist doch garnicht konstant, der Pointer zeigt ja nur auf eine Konstante
weil ich zu begin den String leer ausgeben möchte, sobald der Button gedrückt wird
soll der Pointer *pText auf den Inhalt des Editfensters zeigen.
Und das was da grau auskommentiert ist hat nicht funktioniert, irgendwas ist immer noch absolut falsch.Also brauche eindeutig weitere Hilfe
Viele Grüsse
-
// Zeile 62 char buffer[2]; // Zeile 80 itoa(123456, buffer, 10);
"buffer" ist zu klein für das was itoa() machen soll.
-
Stimmt ist eigentlich zu klein, aber wenn du das Programm mal ausführst siehst du,
dass trotzdem über Zeile 88TextOut(hDC, 50,200,buffer, sizeof(buffer)+8 );
der richtige Inhalt 123456 im Fenster ausgegeben wird.
Das ist auch so eine Sache die ich überhaupt nicht verstehe.Aber die Sache hier mit buffer hat aber eigentlich garnichts mit meinem eigentlichen Problem den Inhalt des Editfensters auszulesen und darzustellen.
-
rom4o schrieb:
*pText ist doch garnicht konstant, der Pointer zeigt ja nur auf eine Konstante
weil ich zu begin den String leer ausgeben möchte, sobald der Button gedrückt wird
soll der Pointer *pText auf den Inhalt des Editfensters zeigen.
Und das was da grau auskommentiert ist hat nicht funktioniert, irgendwas ist immer noch absolut falsch.1. Der Zeiger zeigt eben auf einen Konstanten Speicher, übel genug, dass Du const weggecastet hast.
2. Wenn Du WM_GETTEXT ausführst wird hier kein Zeiger getauscht, sondern der Datenbereich benutzt auf den pText zeigt und der ist eben Konstant!
3. pText wird durch WM_GETEXT mit einer Kopie gefüllt. Er kann nach Drücken des Zeigers auf nichts Anderes zeigen.
4. Dir ist noch nicht klar, was die Lebenszeit von Variablen angeht. pText wird jedesmal neu initialisiert, bei jeder Nachricht. Ist Dir klar was das bedeutet?rom4o schrieb:
Also brauche eindeutig weitere Hilfe
Du brauchst einen Grundkurs bzgl. C/C++
-
@ Martin Richter
Hallo nun ja du magst recht haben, und meine Kenntnisse sind wirklich nicht besonders gut, fange auch gerade erst an mit c++, alles ganz anders als in java.
Aber nun ja wie kann ich denn nun dieses Problem lösen.
Vielleicht kannst du mir ja bei der Lösung helfen, es muss doch theoretisch nicht viel am Code geändert werden.Du brauchst einen Grundkurs bzgl. C/C++
Ich hab schon sehr viel im Web gesucht habe keinen Kurs gefunden der mir bei der Lösung des Problems hilft, desshalb bin ich ja hier in diesem Forum gelandet.
Viele Grüsse, und danke für weitere Ratschläge
-
Hat denn keiner einen Tip wie ich das Problem lösen kann???
-
rom4o schrieb:
Du brauchst einen Grundkurs bzgl. C/C++
Ich hab schon sehr viel im Web gesucht habe keinen Kurs gefunden der mir bei der Lösung des Problems hilft, desshalb bin ich ja hier in diesem Forum gelandet.
http://wwws.htwk-leipzig.de/~sschwarz/volkart/html/inhalt.html
Fange vorne an und arbeite Dich bis hinten durch. Dein "Problem" ist, dass Du sämliche C++-Schlüsselwörter falsch verwendest (siehe Martin's Hinweis). So ein "Problem" wird selbstverständlich nicht explizit in einem Tutorial angesprochen. Lerne einfach, wie man diese verwendet.int iLen = static_cast<int>(SendMessage(hEdit, WM_GETTEXTLENGTH, 0, 0)); if(!iLen) ... TCHAR* pszBuf = new TCHAR[++iLen]; SendMessage(hEdit, WM_GETTEXT, iLen, reinterpret_cast<LPARAM>(pszBuf)); // Irgendwas mit 'pszBuf' machen... delete [] pszBuf;