message zwischen child'S
-
Hi, ich habe zwo childfenster, das eine bezeichne ich als hEdit und das andere als hOffset, bei dem CHILD hEdit sollen alle messanges per subclassing bearbeitet werden, bei hOffset währ das gleub ich nicht notwendig,..
mein problem ist das ich nun nicht weiß wie ich eine message vom hEdit zu hOffset senden kann,...beide haben die gleiche wind00fklasse, und bei CreateWind00fex kann ich nur den parent angeben, also kein zusätzlichen identifier, woraus folgt das ich das fenster selbst mit findwindow() nicht identifizieren kann, so das eine message aus der subclass von hEdit auch wieder an hEdit gesendet wird,..versteht ihr mein problem?
seid gegrüßt
-
CreateWindowEx () liefert die Fensterhandles, SendMessage () erledigt den Rest. Wozu FindWindow () ?
-
ja ich habe doch ne subclass von hEdit erzeugt, wie komme ich dann an das handle von hOffset ran??? gruß
-
ach hier mal der source,..
#define STRICT #include <windows.h> #include <windowsx.h> #include <stdio.h> #include <stdlib.h> static LONG_PTR PrevWndProcEdit; LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK WndConsole(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK EditWndProc (HWND , UINT , WPARAM , LPARAM ); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { HWND hWnd,hConsole; MSG msg; WNDCLASS wcmain; WNDCLASS wcconsole; const char szAppName[] = "Editcontrol Tutorial"; wcmain.style = CS_HREDRAW | CS_VREDRAW; wcmain.lpfnWndProc = WndProc; wcmain.cbClsExtra = 0; wcmain.cbWndExtra = 0; wcmain.hInstance = hInstance; wcmain.hIcon = LoadIcon(NULL, IDI_APPLICATION); wcmain.hCursor = LoadCursor(NULL, IDC_ARROW); wcmain.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); wcmain.lpszMenuName = NULL; wcmain.lpszClassName = szAppName; RegisterClass(&wcmain); hWnd = CreateWindow( szAppName, "Editcontrol Tutorial", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL ); ShowWindow(hWnd, iCmdShow); UpdateWindow(hWnd); const char szConsoleName[] = "Console"; wcconsole.style = CS_HREDRAW | CS_VREDRAW; wcconsole.lpfnWndProc = WndConsole; wcconsole.cbClsExtra = 0; wcconsole.cbWndExtra = 0; wcconsole.hInstance = hInstance; wcconsole.hIcon = LoadIcon(NULL, IDI_APPLICATION); wcconsole.hCursor = LoadCursor(NULL, IDC_ARROW); wcconsole.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); wcconsole.lpszMenuName = NULL; wcconsole.lpszClassName = szConsoleName; RegisterClass(&wcconsole); hConsole = CreateWindow( szConsoleName, szConsoleName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL ); ShowWindow(hConsole, iCmdShow); UpdateWindow(hConsole); while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_CREATE: { return 0; } case WM_SIZE: { return 0; } case WM_CLOSE: { SendMessage(FindWindow("Console","Console"),WM_CLOSE,(WPARAM)0,(LPARAM)0); DestroyWindow(hWnd); return 0; } case WM_DESTROY: { PostQuitMessage(0); return 0; } } return DefWindowProc(hWnd, message, wParam, lParam); } LRESULT CALLBACK WndConsole(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hEdit,hOffset; 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_CLIENTEDGE, "edit", buffer, // <- das ist der Inhalt der Editfelds WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 51, 0, 400, 400, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); hOffset = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", "", // <- das ist der Inhalt der Editfelds WS_CHILD | WS_VISIBLE |WS_DISABLED| ES_MULTILINE | ES_AUTOVSCROLL, 0, 0, 50, 400, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); PrevWndProcEdit = SetWindowLongPtr (hEdit, GWLP_WNDPROC, (LONG_PTR) EditWndProc); free(buffer); return 0; } case WM_SIZE: {MoveWindow(hEdit, 51, 0, 400,400, TRUE); UpdateWindow(hEdit); 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; } case WM_PAINT: { //SetBkColor((HDC)wParam,RGB(0,0,0)); // Texthintergrund auf transparent setzen //SetTextColor((HDC)wParam,RGB(255,255,255)); // Textfarbe auf Weiss setzen return 0;//(long)CreateSolidBrush(RGB(0,0,0)); } case WM_CTLCOLOREDIT: { SetBkColor((HDC)wParam,RGB(0,0,0)); // Texthintergrund auf transparent setzen SetTextColor((HDC)wParam,RGB(255,255,255)); // Textfarbe auf Weiss setzen return (long)CreateSolidBrush(RGB(0,0,0)); } case WM_CTLCOLORSTATIC: { SetBkColor((HDC)wParam,RGB(0,0,0)); // Texthintergrund auf transparent setzen SetTextColor((HDC)wParam,RGB(255,255,255)); // Textfarbe auf Weiss setzen return (long)CreateSolidBrush(RGB(0,0,0)); } } return DefWindowProc(hWnd, message, wParam, lParam); } LRESULT CALLBACK EditWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_VSCROLL: {SendMessage(GetWindow(hwnd,GW_HWNDNEXT),WM_VSCROLL break; } return CallWindowProc ((WNDPROC) PrevWndProcEdit, hwnd, message, wParam, lParam); }gruuß
-
Hi, das würde ich global deklarieren.
HWND hEdit, hOffset ;Dann kannst du einfach in deiner EditWndProc mit SendMessage(hOffset, message, wParam, lParam) eine Nachricht senden.
MfG WilMen
-
Diesen Post hat es nie gegeben.
-
Kannst du bitte mal den vorherigen Post lesen!? Da steht schon drin, dass er SendMessage() verwenden soll.

-
WilMen schrieb:
Hi, das würde ich global deklarieren.
HWND hEdit, hOffset ;Dann kannst du einfach in deiner EditWndProc mit SendMessage(hOffset, message, wParam, lParam) eine Nachricht senden.
Immer diese globalen Variablen...
. Er kannt sich auch einfach (vorausgesetzt er vergibt noch ID's an seine Child's) via:GetDlgItem(GetParent(hWnd), ID)einen Handle auf das entsprechende Control holen
.
-
Hi,
wozu extra den Handle ermitteln, wenn man ihn einfach in einer globalen Variablen gespeichtert haben kann. Das ist doch sinnlose Vergäudung von Rechenleistung (Sicher, in diesem kleinen Programm und bei heutigen Computern nicht, aber wenn du so größere Programme schreibst, macht sich das bemerkbar). Ich glaube, dass du das nur geschrieben hast, um überhaupt was zu schreiben.
Man sollte auch in der heuteigen Zeit immer so effektiv, wie nur menschenmöglich, programmieren!MfG WilMen :xmas1:
-
WilMen schrieb:
Kannst du bitte mal den vorherigen Post lesen!? Da steht schon drin, dass er SendMessage() verwenden soll.

Ja *LOL* ich war ca. 3h von meinem PC weg und dann war hier noch das auf,und ich habe nicht nachgeschaut ob schon ein neuer Post da ist.
Hi,
wozu extra den Handle ermitteln, wenn man ihn einfach in einer globalen Variablen gespeichtert haben kann. Das ist doch sinnlose Vergäudung von Rechenleistung (Sicher, in diesem kleinen Programm und bei heutigen Computern nicht, aber wenn du so größere Programme schreibst, macht sich das bemerkbar). Ich glaube, dass du das nur geschrieben hast, um überhaupt was zu schreiben. Man sollte auch in der heuteigen Zeit immer so effektiv, wie nur menschenmöglich, programmieren!MfG WilMen
Der Meinung bin ich auch den Handle einfach zurückgeben lassen a la:
//Global: HWND hChild1; HWND hChild2; //Nach dem ersten CreateWindow hChild1 = CreateWindowW(/*Hier ein Childwindow erstellen*/); hChild2 = CreateWindowW(/*Hier ein zweites Childwindow erstellen*/); //SendMessage(hChild oder hChild2,usw.) //zB kann jetzt hChild1 ein WM_COMMAND an hChild2 senden und so wird ein Druck // einer anderen Taste simuliert.So können die beiden kommunizieren.
Besser wäre noch "PostMessage()".[offtopic]
Unterschied zwischen SendMessage und PostMessage:
Bei SendMessage wird die gesendete Nachricht sofort verarbeitet und bei PostMessage wird die Nachricht in die Warteschlange getan.
[/offtopic]Ich denke ihr wisst was ich meine

P.S.: So muss auch nicht aufwending ein Handle ermittelt werden.
-
WilMen schrieb:
wozu extra den Handle ermitteln, wenn man ihn einfach in einer globalen Variablen [...]
Das ist ja nicht der Punkt..., das ist der Punkt:
WilMen schrieb:
[...] aber wenn du so größere Programme schreibst, macht sich das bemerkbar
Wenn Du größere Programme schreibst, und ohne Ende globale Variablen verwendest, verstehst Du später Dein eigenes Programm nicht mehr, bzw. Dein Programm entwickelt ein gewisses Eigenleben.
Globale Variablen ist schlechtes Code-Design.C-Chris schrieb:
P.S.: So muss auch nicht aufwending ein Handle ermittelt werden.
Dito, siehe oben.
WilMen schrieb:
Ich glaube, dass du das nur geschrieben hast, um überhaupt was zu schreiben.

Klar, wie immer ...
WilMen schrieb:
Man sollte auch in der heuteigen Zeit immer so effektiv, wie nur menschenmöglich, programmieren!
Deswegen wurden ja auch Sprachen wie Java erfunden :p .
C-Chris schrieb:
[offtopic]
Unterschied zwischen SendMessage und PostMessage:
Bei SendMessage wird die gesendete Nachricht sofort verarbeitet und bei PostMessage wird die Nachricht in die Warteschlange getan.
[/offtopic]Es geht vielmehr darum, dass bei Multithreaded-Applikationen beim Aufruf von SendMessage ein Context-Switching (also ein Wechsel in den Thread, in dem die WndProc des Fensters läuft) erfolgt, bei PostMessage hingegen nicht. Daher kehrt SendMessage erst zurück, wenn die Nachricht bearbeitet wurde.
-
Es geht vielmehr darum, dass bei Multithreaded-Applikationen beim Aufruf von SendMessage ein Context-Switching (also ein Wechsel in den Thread, in dem die WndProc des Fensters läuft) erfolgt, bei PostMessage hingegen nicht. Daher kehrt SendMessage erst zurück, wenn die Nachricht bearbeitet wurde.
Deswegen ja [offtopic]. Das war nur eine Exkursion ich wollte eben mein beschränktes Wissen mit anderen Teilen. Ich weis das ich nicht perfekt bin und manachmal auch falsche Informationen dabei sind aber ich kann hier doch den Unterschied erklären wenn wir schon bei dem Thema sind.
-
Hui, ich bin erstaunt über die diskussionsvielfalt,..
wie vergebe ich ID's an die child's?gruß
-
zeusosc schrieb:
Hui, ich bin erstaunt über die diskussionsvielfalt,..
wie vergebe ich ID's an die child's?gruß
Was sind ID´s ?
-
CodeFinder schrieb:
WilMen schrieb:
[...] aber wenn du so größere Programme schreibst, macht sich das bemerkbar
Wenn Du größere Programme schreibst, und ohne Ende globale Variablen verwendest, verstehst Du später Dein eigenes Programm nicht mehr, bzw. Dein Programm entwickelt ein gewisses Eigenleben.
Globale Variablen ist schlechtes Code-Design.Funktionen aufzurufen die Werte ermitteln, die man schon längst hat auch!
Außerdem: Sagte ich, dass das immer zutrifft? In diesem konkreten Fall ist es Schwachsinn den Handle nochmal zu ermitteln.CodeFinder schrieb:
WilMen schrieb:
Ich glaube, dass du das nur geschrieben hast, um überhaupt was zu schreiben.

Klar, wie immer ...
Sowieso...
CodeFinder schrieb:
WilMen schrieb:
Man sollte auch in der heuteigen Zeit immer so effektiv, wie nur menschenmöglich, programmieren!
Deswegen wurden ja auch Sprachen wie Java erfunden :p .
WinAPI-Forum!? Meinst du etwa man kann mit Java effektiver programmieren als mit C++?
MfG WilMen :xmas1:
-
Ja ist ja schön gut,es würde mich trotzdem mehr interessieren was ein ID ist. CodeFinder WilMen einer von euch beiden wird das wohl wissen. Streitet euch darum.

-
Hi,
lies dir mal die Beschreibung zum 9. Parameter (hMenu) von CreateWindow durch.
http://msdn2.microsoft.com/en-us/library/ms632679.aspx
MfG WilMen :xmas1:
-
ok,. danke jungs,..

-
WilMen schrieb:
Funktionen aufzurufen die Werte ermitteln, die man schon längst hat auch!
Da hast Du Recht, aber dem ist hier ja nicht so
.WilMen schrieb:
WinAPI-Forum!? Meinst du etwa man kann mit Java effektiver programmieren als mit C++?
, dann hast Du anscheinend nicht verstanden, was ich meine. Natürlich kann man mit C++ *viel* effektiver Programmieren (als mit Java), und mit C noch effektiver. ABER 'heutzutage' legt man nicht mehr zwangsläuftig Wert auf Geschwindigkeit, sondern auf Stabilität/Sicherheit. Das merkt man schon an der Entwicklung:
C -> C++ -> Java (Ich weiß, Java aus C++ zu 'folgern' ist etwas plump, aber mir gehts auch nur um die Schwerpunkte, die die jeweilige Sprache setzt.)Und natürlich: Warum programmiert man C/C++ und WinAPI? Weil man schnelle Programme schreiben will und teilweise an Funktionalitäten kommen will, die in höheren Sprachen/Frameworks nicht zur Verfügung stehen
. (Meine Aussage war also ironisch gemeint
.)
-
jung jungs jungs,.. wirkliche geschwindigkeit erreicht man wenn man asm optimal einsetzt,...
