Silent12
PC-Selbstbauer(in)
ChildWindows:schließt ParentWindow mit
Hallo...
Ich habe gerade ein ParentWindow mit 2 enthaltenen ChildWindows erstellt.
Nun habe ich 2 komische Probleme:
1. Wenn ich das eine ChildWindow über das andere bewege und dann das ChildWindow schließe dann schließt sich das ParentWindow mit, aber nur wenn ich es über das ander ChildWindow bewege, sonst nicht
2. Ich habe per WS_CLIPSIBLINGS festgelegt, dass immer das aktive ChildWindow im Fordergrund ist, aber das gleiche ChildWindow, das auch das ParentWindow ungewollt schließt lässt sich nicht von dem andern ChildWindow überdecken, sondern bleibt immer im Vordergrund.
Code:
Kann das daran liegen, dass ich nur in das eine ChildWindow einen Text eingefügt habe ?
Würde mich über Antworten sehr freuen
Gruß
silent12
Hallo...
Ich habe gerade ein ParentWindow mit 2 enthaltenen ChildWindows erstellt.
Nun habe ich 2 komische Probleme:
1. Wenn ich das eine ChildWindow über das andere bewege und dann das ChildWindow schließe dann schließt sich das ParentWindow mit, aber nur wenn ich es über das ander ChildWindow bewege, sonst nicht
2. Ich habe per WS_CLIPSIBLINGS festgelegt, dass immer das aktive ChildWindow im Fordergrund ist, aber das gleiche ChildWindow, das auch das ParentWindow ungewollt schließt lässt sich nicht von dem andern ChildWindow überdecken, sondern bleibt immer im Vordergrund.
Code:
Code:
// main_cpp //
#include <Windows.h>
#include <iostream>
int width = 640;
int height = 420;
LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
bool InitWndClassEx ( WNDCLASSEX *WndClassEx, HINSTANCE hInstance, const char szClassName[] = "Hallo");
const char szClassName[] = "Hallo";
char szTitle[] = "1.Programm Grafic3 Silent1297 2011 ©";
HWND hWndChild; //Handle to 1.ChildWindow
HWND hWndChild2; //Handle to 2. ChildWindow
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR szCmdLine, int iCmdShow)
{
WNDCLASSEX WndClassEx; // legt die Grundeigenschaften für das Fenster fest.
WNDCLASSEX WndClassExChild; //Grundeigenschaften für ChildWindow
WNDCLASSEX WndClassExChild2; //Grundeigenschaften für ChildWindow2
HWND hWnd; //legt die Eigenschaften des Fensters fest.
MSG msg; //darin werden die Daten gespeichert.
HINSTANCE hChildInst = NULL;
// Registrierung //
InitWndClassEx ( &WndClassEx, hInstance, szClassName);
InitWndClassEx ( &WndClassExChild, hInstance, "WndClassExChild");
InitWndClassEx ( &WndClassExChild2, hInstance, "WndClassExChild2");
// Fenster Erstellen //
hWnd = CreateWindowEx (NULL, // beeinhaltet die Folgenden Eigenschaften und die Eigenschaften aus WndClassEx
szClassName, //hierüber werden die Eigenschaften aus WndClassEx. eingebunden
szTitle,
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX, //Fenster (Minimierungsbutton.....
300, //Abstand-Oben
600, //Abstand-Links
width, // Breite
height, // Höhe
NULL,
NULL,
hInstance,
NULL);
if ( hWnd == NULL )
{MessageBox ( NULL, "Create Window failed", "Error", MB_OK);
return false;
}
{
int cx = GetSystemMetrics(SM_CXSCREEN); //cx = desktopbreite ermitteln
int cy = GetSystemMetrics(SM_CYSCREEN);//cx = desktophöhe ermitteln
int px = (cx - width) / 2; //AbstanddesFensters von links errechnen
int py = (cy - height) / 2; //AbstanddesFensters von oben errechnen
MoveWindow( hWnd, px, py, width, height, true);
}
ShowWindow( hWnd, iCmdShow);
hWndChild = CreateWindowEx (WS_EX_CLIENTEDGE, "WndClassExChild",
"Child Window silent1297", WS_SYSMENU| WS_CAPTION | WS_CHILD| WS_VISIBLE | WS_CLIPSIBLINGS, //WS_CLIPSIBLINGS damit Fenster beim Verziehen nicht "verwischt"
70, 30, 250, 300, // LinksAbstand, Obenabstand, Breite, Höhe
hWnd, NULL, hChildInst, NULL );
hWndChild2 = CreateWindowEx (WS_EX_CLIENTEDGE, "WndClassExChild2",
"Child Window - 2 silent1297",WS_SYSMENU | WS_CAPTION | WS_CHILD| WS_VISIBLE | WS_CLIPSIBLINGS, //WS_CLIPSIBLINGS damit Fenster beim Verziehen nicht "verwischt"
320, 30, 250, 300, // LinksAbstand, Obenabstand, Breite, Höhe
hWnd, NULL, hChildInst, NULL );
SetClassLong ( hWndChild2, GCL_HBRBACKGROUND, (LONG) GetStockObject (BLACK_BRUSH)); //ändert die Hintergrundfarbe des Fensters dessen HWND (Handle to Window) angegeben ist
while( GetMessage ( &msg, hWnd, NULL, NULL) > NULL) // -1 = Fehler | 0 // > 0
{
TranslateMessage( &msg ); // wird in Character-Message übersetzt
DispatchMessage ( &msg ); // wird verschickt an die Callback Funktion
};
// WINDOW-PROCEDUR(Einleitungsteil) -> WNDCLASSEX(Registrierung) -> HWND(Fenstereinstellungenfestlegen) -> MESSAGELOOP(Messages übersetzen und an die CALLBACK-Funktion weiterverschicken)
return 0;
}
//Variablen zur Textausgabe des ParentWindow
HDC hDCParent; // Handle to a Device Context für das ParentWindow
PAINTSTRUCT psParent; //Paintstruktur für das ParentWindow
char szTextParent[] = ("Hallo Welt"); // Text der ausgegeben werden soll für das ParentWindow
//Variablen zur Textausgabe des 1.ChildWindow
HDC hDCChild; // Handle to a Device Context für das ChildWindow
PAINTSTRUCT psChild; //Paintstruktur für das ChildWindow
char szTextChild[] = ("Hallo 1.ChildFenster"); // Text der ausgegeben werden soll für das ChildWindow
LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) //Gehirn des eigentlichen Windows, Verarbeitung von Messages...
{
//Jede Message hat 2 Informationen ( wParam und lParam)
switch (msg)
{
case WM_PAINT: //Text ausgeben
hDCParent = BeginPaint (hWnd,&psParent); //ParentWindow neu gestalten :D
hDCChild = BeginPaint (hWndChild,&psChild); //ChildWindow neu gestalten :D
//Settings 1.ChildWindow
SetBkMode (hDCChild, TRANSPARENT); //setzt die Hintergrundfarbe des Textes auf Transparent
SetBkColor( hDCChild, RGB(255, 0, 0) ); // funktioniert wenn die SetbkMode(hDC, TRANSPARENT); nich vorhanden ist, ändert Hintergrundfarbe des Textes 1. Wert rot-wert, 2. Wert grün-wert, 3.Wert blau-wert
SetTextColor (hDCChild, RGB(0, 0, 0) );//ändert Textfarbe des Textes 1. Wert rot-wert, 2. Wert grün-wert, 3.Wert blau-wert
TextOut ( hDCChild, 50, 100, szTextChild, strlen(szTextChild) ); //2Zahlen am Anfang sind Koordinaten wo Text anfangen soll, 3. Ziffer ist die Anzahl der Zeichen des c-stirngs
EndPaint ( hWndChild, &psChild); //beendet das neu gestalten des ChildWindows
//Settings Parent Window
SetBkMode (hDCParent, TRANSPARENT); //setzt die Hintergrundfarbe des Textes auf Transparent
SetBkColor( hDCParent, RGB(255, 0, 0) ); // funktioniert wenn die SetbkMode(hDC, TRANSPARENT); nich vorhanden ist, ändert Hintergrundfarbe des Textes 1. Wert rot-wert, 2. Wert grün-wert, 3.Wert blau-wert
SetTextColor (hDCParent, RGB(0, 0, 0) );//ändert Textfarbe des Textes 1. Wert rot-wert, 2. Wert grün-wert, 3.Wert blau-wert
TextOut ( hDCParent, 10, 10, szTextParent, strlen(szTextParent) ); //2Zahlen am Anfang sind Koordinaten wo Text anfangen soll, 3. Ziffer ist die Anzahl der Zeichen des c-stirngs
EndPaint ( hWnd, &psParent); //beendet das neu gestalten des ParentWindows
break;
case WM_DESTROY: //Fenster Ende (Wenn auf das X-geklickt wird
PostQuitMessage(0);
break;
default:
return DefWindowProc ( hWnd, msg, wParam, lParam);
}
}
bool InitWndClassEx ( WNDCLASSEX *WndClassEx , HINSTANCE hInstance, const char *szClassName) //Funktion mit Defaultwerten für zB ChildWindows
{
WndClassEx->cbSize = sizeof( *WndClassEx);
WndClassEx->style = NULL;
WndClassEx->lpfnWndProc = (WNDPROC)WndProc; // hWnd -> CreateWindow (szClassName ) -> WndClass.
WndClassEx->cbClsExtra = NULL;
WndClassEx->cbWndExtra = NULL;
WndClassEx->hInstance = hInstance;
WndClassEx->hIcon = LoadIcon( NULL, IDI_WARNING); //Icon
WndClassEx->hCursor = LoadCursor( NULL,IDC_ARROW); //Cursor
WndClassEx->hbrBackground = (HBRUSH) GetStockObject ( WHITE_BRUSH) ; //Fensterfarbe
WndClassEx->lpszMenuName = NULL;
WndClassEx->lpszClassName = szClassName; // C-String
WndClassEx->hIconSm = LoadIcon (NULL, IDI_APPLICATION);
if ( !RegisterClassEx ( WndClassEx ))
{MessageBox ( NULL, "Register Class failed", "Error", MB_OK);
return false;
}
}
Kann das daran liegen, dass ich nur in das eine ChildWindow einen Text eingefügt habe ?
Würde mich über Antworten sehr freuen
Gruß
silent12