Button in CaptionBar



  • Ich versuche ein weiteres Icon in die CaptionBar einzubauen. Dafür frage ich verschiede Messages ab und ändere je nach Message das aussehen des BorderIcons (Win XP).
    Beispiel:

    void __fastcall TForm1::WMNCLButtonDown(TMessage &Msg)  
    {
      TForm::Dispatch(&Msg);
      if (Msg.WParam == HTCAPTION)
      {
      if(Msg.LParamLo>Form1->Left+120&&Msg.LParamLo<Form1->Left+141)
      {
      TCanvas * FCanvas = new TCanvas();
      if (FCanvas)
      {
      MyFormState=true;
      FCanvas->Handle = GetWindowDC(Handle); //Fensterhandle
      FCanvas->Draw(120,5,Image5->Picture->Graphic); //Bild für ein heruntergedrücktes BorderIcon
      delete FCanvas;
      }
      }
      }
    }
    

    Wenn ich nun aber auf das Icon drücke ändert sich bei einem minimierten Fenster das Icon nicht. Bei einem maximierten Fenster jedoch ändert es sich. Ich denke es liegt daran, dass das minimiertes Fenster denkt, ich will das Fenster verschieben. Wie kann ich das Problem lösen?



  • Seit wann haben minimierte Fenster eine CaptionBar, oder wären sonst irgendwie klickbar?
    Minimiert = kein Fenster = nix zum Anklicken

    Ansonsten: Die FAQ-Beiträge zum Zeichnen und Klicken auf der CaptionBar kennst du?



  • ahso: Ich meine mit minimierte Fenster, WindowState=wsNormal. Also nicht maximiert. Das Fenster nutzt nicht den vollen Bildschirm Platz aus.
    Ja die Faq Beiträge kenne ich. Ich glaub die hab ich mir an die 30 mal durchgelesen.



  • Das war offenbar noch nicht genug. 😉

    Die Koordinaten in Msg.LParamLo beziehen sich auf den Bildschirm, nicht auf die Form. Nicht ohne Grund hat Sunday in seinem FAQ-Beispiel eine extra Funktion, die "prüft, ob sich die maus im rechteck der URL befindet".



  • Obwohl das sehr logisch klingt, ist das offenbar nicht das Problem. Das Problem ist, dass das Programm auf ein 'SC_MOVE+HTCAPTION' wartet. Wenn ich alle WM_SYSCOMMANDs abfange:

    MESSAGE_HANDLER(WM_SYSCOMMAND, TMessage, WMSysCommmand)
    

    dann lässt sich der Button drücken. Wenn ich das allerdings mache, dann reagiert das Fenster gar nicht mehr auf irgende eine Nachricht auch wenn ich

    Result=true
    

    setze. Wie kann ich das beheben?



  • Ganz unlogisch ist, dass du dir offenbar nicht einfach mal die Werte von LParamLo zur Laufzeit angesehen hast. Sobald du die Koordinaten vom Screen auf die Form umrechnest wird anstandslos in deine Zeichen-Routine verzweigt.

    Der andere Fehler ist, dass du Dispatch gleich zu Beginn aufrufst, deshalb erfolgt die Auswertung der Message erst beim MouseUp. Beim URL-Klick aus der FAQ ist das weniger ein Problem, da man bei Links ja keine Reaktion während des Klickens erwarten, im Gegensatz zu (simulierten) Buttons.
    Also erst Auswerten und ggf. reagieren, dann Dispatch.



  • Danke Jansen!
    Hab alles geändert und jetzt klappt alles reibungslos


Anmelden zum Antworten