Editbox WinApi Frage
-
Schönen guten Abend
Ich habe folgende Frage. Ich versuche mich zur Zeit an WinApi
und versuche ein wenig auszuprobieren und alles zu lesen.
Habe in einem Tutorial in einem Main Window eine Editbox und möchte
gerne das diese Editbox nicht maximiert ist sonder nur einen
von mir definierten Bereich abdeckt. Welchen Parameter muss ich verändern,
damit das der Fall ist? Habe nun alle Funktionen in MSDN durchgelesen
und versuchsweise viele Parameter mal verändert mit anderen die in MSDN
aufgelistet versucht. Auch die Integer von x und y Koordinaten habe
ich verändert, aber es kommt nicht das gewünschte Ergebnis.Vielleicht kann mir ja einer helfen. Vielen Dank schon mal im Voraus.
Zu meinem Code:
#include <windows.h> #include <stdio.h> #include <stdlib.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[] = "Editcontrol Tutorial"; 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 = (HBRUSH)GetStockObject(LTGRAY_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = szAppName; RegisterClass(&wc); hWnd = CreateWindow( szAppName, "Editcontrol Tutorial", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 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 hEdit; switch(message) { case WM_CREATE: { FILE *fz; char *buffer = NULL; int iFileSize; fz = fopen("text.txt", "rb"); if(fz != NULL) { fseek(fz, 0, SEEK_END); iFileSize = ftell(fz); buffer = (char*)malloc(iFileSize); fseek(fz, 0, SEEK_SET); fread(buffer, 1, iFileSize, fz); fclose(fz); } hEdit = CreateWindowEx(WS_EX_DLGMODALFRAME, "edit", buffer, // <- das ist der Inhalt der Editfelds WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 150, 200, 150, 400, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); free(buffer); return 0; } case WM_SIZE: { MoveWindow(hEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE); return 0; } case WM_CLOSE: { FILE *fz; char *buffer = NULL; int iLength; iLength = GetWindowTextLength(hEdit); buffer = (char*)malloc(iLength); GetWindowText(hEdit, buffer, iLength+1); fz = fopen("text.txt", "wb"); fwrite(buffer, 1, iLength, fz); fclose(fz); free(buffer); DestroyWindow(hWnd); return 0; } case WM_DESTROY: { PostQuitMessage(0); return 0; } } return DefWindowProc(hWnd, message, wParam, lParam); }
-
beim Create gibst Du die ursprüngliche Größe und Position mit, in Deinem Beispiel:
150, 200, 150, 400,
Aber wenn Dein Hauptfenster eine WM_SIZE - Message bekommt, veränderst Du die Größe des Edit-Feldes via:
MoveWindow(hEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
auf die Maße des Hauptfensters.
-
Belli schrieb:
beim Create gibst Du die ursprüngliche Größe und Position mit, in Deinem Beispiel:
150, 200, 150, 400,
Aber wenn Dein Hauptfenster eine WM_SIZE - Message bekommt, veränderst Du die Größe des Edit-Feldes via:
MoveWindow(hEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
auf die Maße des Hauptfensters.
Vielen Dank Belli
Kannst du mir eventuell erklären was dieses LOW und Highword ist?https://msdn.microsoft.com/de-de/library/windows/desktop/ms632659(v=vs.85).aspx
Habe hier schon gelesen und auch die MoveWindow Function separat aber ich werde
daraus irgendwie nicht schlau.
Liebe Grüße
-
buu2188 schrieb:
Kannst du mir eventuell erklären was dieses LOW und Highword ist?
https://msdn.microsoft.com/de-de/library/windows/desktop/ms632659(v=vs.85).aspx
Habe hier schon gelesen und auch die MoveWindow Function separat aber ich werde
daraus irgendwie nicht schlau.
Liebe GrüßeLOWORD und HIWORD extrahieren aus dem 32-bit parameter die beiden 16-Bit-hälften. Mehr nicht.
-
mgaeckler schrieb:
buu2188 schrieb:
Kannst du mir eventuell erklären was dieses LOW und Highword ist?
https://msdn.microsoft.com/de-de/library/windows/desktop/ms632659(v=vs.85).aspx
Habe hier schon gelesen und auch die MoveWindow Function separat aber ich werde
daraus irgendwie nicht schlau.
Liebe GrüßeLOWORD und HIWORD extrahieren aus dem 32-bit parameter die beiden 16-Bit-hälften. Mehr nicht.
Danke mgaeckler
Und für was muss man diese Operation durchführen?
-
Dieser Thread wurde von Moderator/in Arcoth aus dem Forum C++ (alle ISO-Standards) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
buu2188 schrieb:
Und für was muss man diese Operation durchführen?
Na, um die beiden Hälften aus lParam zu extrahieren.
Aus der MSDN zu WM_SIZE:lParam
The low-order word of lParam specifies the new width of the client area.
The high-order word of lParam specifies the new height of the client area.
Es sind also zwei Informationen in lParam, und um die herauszufummeln, kann man die Makros HIWORD bzw. LOWORD benutzen.
-
Belli schrieb:
buu2188 schrieb:
Und für was muss man diese Operation durchführen?
Na, um die beiden Hälften aus lParam zu extrahieren.
Aus der MSDN zu WM_SIZE:lParam
The low-order word of lParam specifies the new width of the client area.
The high-order word of lParam specifies the new height of the client area.
Es sind also zwei Informationen in lParam, und um die herauszufummeln, kann man die Makros HIWORD bzw. LOWORD benutzen.
Aber für was brauche ich das? Habe im Tutorial nichts gefunden darüber.
Wenn man sich die MoveWindow Function mal anschaut erwartet er doch als
als übergebene Parameter 4 Integer. Wenn ich die ersten beiden für x und y = 0 lasse und die anderen beiden z.B 500 mache passiert das was ich wollte.
Aber was explizit das mit diesem HIWORD und LOWORD seinen soll, verstehe ich nicht.BOOL WINAPI MoveWindow( _In_ HWND hWnd, _In_ int X, _In_ int Y, _In_ int nWidth, _In_ int nHeight, _In_ BOOL bRepaint );
-
Auch diese Frage zeigt, daß du wohl mit der WinAPI überfordert bist (wie bei deiner Frage zum "Chat Programm programmieren").
buu2188 schrieb:
und möchte gerne das diese Editbox nicht maximiert ist sonder nur einen von mir definierten Bereich abdeckt
Wenn du die TextBox nicht verändern willst (bei der Größenänderung des Fensters), dann laß einfach den Aufruf von MoveWindow weg...
-
buu2188 schrieb:
Wenn man sich die MoveWindow Function mal anschaut erwartet er doch als
als übergebene Parameter 4 Integer. Wenn ich die ersten beiden für x und y = 0 lasse und die anderen beiden z.B 500 mache passiert das was ich wollte.Jo ... und warum machst Du das dann nicht?
So, wie Du das machst, mit HIWORD und LOWORD aus lParam, ist es halt dafür gedacht, die Größe an das Fenster, das die WM_SIZE - Message bekommt, anzupassen.
Denn genau diese Information steht in lParam, wie ich Dir weiter oben schon schrieb unter
Aus der MSDN zu WM_SIZE:
-
Ok hab's verstanden.
Vielen vielen Dank