Rahmen um ein Fenster legen



  • Ok also es geht um ein Pokerprogramm. Dort kann man viele Tische aufhaben und ich möchte, dass mein Programm um einen dieser Tische (welcher das ist kann ich schon bestimmen) einen farbigen Rahmen zieht, der am besten noch blinkt, damit man an der fülle der Tische eben direkt sieht, an welchem man dran ist...

    meine überlegung war, ein layered windows zu erstellen, das ich genau über das betreffende Fenster lege. Natürlich müssen alle Mausklicks usw durchgehen, der User soll ja nix davon merken, dass ich noch ein Fenster draufgelegt habe...

    Und in dem Layered Windows zeichne ich dann irgendwie ein Rectangle... und das blinken realisiere ich dann mit SetVisible true / false ? Müsste doch gehen..

    Es reicht im Grunde, wenn ich ein Fenster erstelle, und mit dem dann immer arbeite. Also größe verändere, position usw wie ich es brauche. Schließen muss ich es dann, wenn mein Hauptprogramm geschlossen wird.



  • Zeichne den Rahmen halt (dünn?) in das Tisch-Fenster. Da brauchst du nur das Fensterhandle und paar GDI calls. Oder würden dich die drei Pixel stören?
    Blinken einfach mit einem Timer, sei es SetTimer(), GetTickCount() oder timeGetTime().

    MfG



  • ja das habe ich mir auch überlegt, aber ich dachte man kann nur in die client area reinzeichnen. Was ich brauche ist aber wirklich ganz außen und über die Title Bar...


  • Mod

    Wenn Du Dir den global DC holst kannst Du überall hinzeichnen. Nur wird es eben als Schmiererei weil Artifakte bleiben.
    Lege doch ein Fenster über das andere Fenster wie ich es gesagt habe.
    Das Blinken kannst Du locker mit einem Timer in dem Fenster realisieren.



  • Das drüberlegen war ja auch meine Idee. Das versuche ich grade zu machen. Hab bis jetzt folgendes:

    HWND windowHandle = CreateWindowEx(WS_EX_LAYERED | WS_EX_TRANSPARENT, "#32770", "Fenster", WS_POPUP | WS_VISIBLE, 100, 100, 500, 500, 0, 0, 0, 0);
    
        SetLayeredWindowAttributes(windowHandle, 0, 0, LWA_ALPHA);
    
        PAINTSTRUCT ps;
        HDC hdc = GetDC(windowHandle);
        HPEN greenPen=CreatePen(PS_SOLID, 5, RGB(0,255,0));
        hdc=BeginPaint(windowHandle, &ps);
        SelectObject(hdc,greenPen);
        MoveToEx(hdc,0,0, NULL);
         Rectangle(hdc,0,0,100,100);
         EndPaint(windowHandle, &ps);
    
         ReleaseDC(windowHandle, hdc);
        DeleteObject(greenPen);
    

    Leider seh ich kein Fenster. Wenn ich bei SetLayeredAttr. den 3. Parameter hochsetzem seh ich mein Fenster unddas grüne Rechteck. Aber ich will eigentlich NUr mein grünes Rechteck sehen, der rest transparent... wie mach ich das?



  • keiner eine Idee? Würde das mit Regions klappen ?


  • Mod

    Steht dieser Code so hintereinander.
    Wenn das so ist kann das doch nicht gehen...
    Wo ist der WM_PAINT Handler. Wie sieht Dein WM_ERASEBKGND Handler aus?



  • sowas hab ich noch nicht, der Code steht in einer DLL...

    ich hatte schonmal mit GDI etwas auf ein anderes Fenster gemalt (mit TextOut), da ging es so.



  • Habe jetzt folgendes geändert:

    SetLayeredWindowAttributes(windowHandle, RGB(240,240,240), 255, LWA_COLORKEY)
    

    nun sehe ich mein grünes Rechteck, alles drumherum ist transparent, jedoch die Region IM Rechteck, ist weiterhin Sichtbar...

    jemand eine Idee, wie ich diese Region auch durchsichtig bekomme?
    Und vielleicht noch einen Tip, wie ich es verhindere, dass das neue Fenster einen Eintrag in der Taskbar bekommt? Der User soll von dem Fenster garnix mitbekommen ...


  • Mod

    Du hast uns immer noch nicht geasgt wie Dein WM_ERASEBKGND Handler aussieht und Dein WM_PAINT Handler.


Anmelden zum Antworten