Beliebig viele Fenster organisieren
-
Mein Programm soll Notizen verwalten, sowas gibts zwar schon aber taugliche Programme nur als Shareware. Nun denn solls ne Freeware von sowas auch geben. Über ein Symbol in der Taskbar und dessen PopupMenu lässt sich eine neue Notiz erstellen.
a) Wie eine Notiz aussieht weiß ich, kann nun jedes Notizfenster die selbe Wnd-Klasse haben? Also reicht ein Aufruf von CreateWindowEx() oder muss ich die Klasse jedesmal neu registrieren mit RegisterClassEx()?
b) Ich zeichne mein Fenster selbst, es soll keine Titelleiste haben und keinen Rahmen, ich hab mir gedacht WM_NCPAINT abzufangen reicht, aber dann kann man meine Notiz nicht mehr verschieben, das sollte aber in irgendeiner Weise doch noch möglich sein. Gibst da ein CTRL, das das Verschieben des Fensters möglich macht wenn man mit der Maus draufklickt?
c) Nun hat aber da selbe Class jedes Notiz auch die selbe WndProc. Ist ja auch soweit kein Problem aber wie kann ich jedem HWND eine eindeutige ID zuweisen? Wenn das Programm beendet und somit meine Notiz-Fensterchen zerstört werden soll der Inhalt noch vorher abgespeichert werden, woher wissen die jetzt aber wie der Dateiname lauten soll (zwei Gleiche Notiztitel sind möglich). Was tun?
d) Die Notizen sollen natürlich Z-Order-mäßig im Hintergrund sein und zudem nicht in der Task-Leiste aufscheinen. Nun was tun? Wenn ich sie als WM_POPUP deklariere hab ich sie zwar aus der Taskleiste raus, aber einmal weggeklickt kommt das Fenster nie wieder. Kann man irgendwie das Fenster genau DESKTOP-Z-ORDER+0,5 platzieren wenn das erste nächste Fenster DESKTOP-Z-ORDER+1 hat?
Erstmal genug Fragen.
Gehe ich das Problem eventuell auch falsch an? Wie würdet ihr dieses "dynamische Fentererzeugen" realisieren?
MfG SideWinder
-
Bevor du anfängst: http://www.codeproject.com/wtl/stickynotes.asp
ansonsten:
1. einmal reicht es, wenn du versuchst die gleiche Fenterklasse ein zweites Mal zu registrieren, schlägt RegisterClass bzw. RegisterClassEx fehl.
2. WM_NCHITTEST abfangenUINT uHitTest = DefWindowProc(hWnd,uMsg,wParam,lParam); if (uHitTest == HTCLIENT) uHitTest = HTCAPTION; return uHitTest;3. du könntest für jedes Fenster eine struct definieren, die du dann jedem Fenster Handle zuweist (SetWindowLong - GWL_USERDATA oder SetProp). In C++ würde man eine Map nehmen oder alles in einer Klasse kapseln. Jede Instanz der Klasse stellt ein Fenster dar.
4. WS_EX_TOOLWINDOW und WS_EX_TOPMOST?
-
Hallo,
zu b:
mit folgendem Code kannst du das Fenster bewegen, indem du die linke Maustaste gedrückt hältst:
case WM_LBUTTONDOWN: ReleaseCapture(); SendMessage(hWnd, WM_SYSCOMMAND, SC_MOVE + 1, 0); return 0;Falls du das Fenster mit einem anderem Control bewegen willst, musst dieses Subclassen und WM_LBUTTONDOWN abfangen.
MfG
tuküe
-
Danke erstmal.
Ich werd mir mal den Source von Soruceforge ziehen und schauen wies die gemacht haben

Die haben meistens bessere Ideen und mehr Verstand
, ich muss dann nur noch an den richtigen Stellen const adden 
MfG SideWinder