TEdit mit neuem Layout



  • Hallo

    ich möchte eine neue TEdit-Komponente programmieren, die ein etwas anderen Rahmen besitzt. Hat jemand eine Ahnung, wie ich da vorgehen könnte ?

    Wenn ich von TEdit oder TCustomEdit ableite und mir eine neue Canvas mache, wird trotzdem immer der alte Rahmen gezeichnent ?!?!? bzw. es gibt ne Fehlermeldung.

    Kennt jemand solch eine Komponente (möglichst in C) um mal zu sehen wie man so etwas realisieren kann ?

    Pronto

    PS. Auch eine TComboBox mit neuen Layout will ich noch machen, auch dazu bräuchte ich etwas Hilfe bei der Realisierung .... DANKE



  • Ich habe mal eine neue TEdit programmiert, gucke das, wenn ich zu hause bin, mal an und sende dann.



  • Hallo Xqgene

    währe echt prima !!! Meine E-Mail Adresse ist: ChL@wtal.de

    Danke



  • ich wäre daran auch sehr interessiert! 😋
    wäre evtl. nicht schlecht wenn du den code hier posten könntest, ansonsten melde dich einfach nochmal.

    ciao, cypoc



  • Hier ist grob beschrieben, wie ich das gemacht habe.

    Das ist ein Abschnit aus meinem Code.
    das ganze wird über winapi gemacht. wenn die komp neu gezeichnet werden soll, schickt windows eine botschaft WM_PAINT an die komp. diese nachricht wird empfangen BEGIN__MESSAGE_MAP... und verarbeitet WMNCPaint

    class PACKAGE TGEdit : public TCustomMaskEdit
    {
    private:
    ...
    protected:
      HIDESBASE MESSAGE void _fastcall WMNCPaint (Messages::TMessage &Message);
      HIDESBASE MESSAGE void _fastcall RedrawBorder (const  HRGN Clip);
    
    public:
     __fastcall TGEdit(TComponent* Owner);
    
    BEGIN_MESSAGE_MAP
        VCL_MESSAGE_HANDLER(WM_PAINT, TMessage, WMNCPaint);
    END_MESSAGE_MAP(TCustomMaskEdit)
    };
    //---------------------------------------------------------------------------
    
    //---------------------------------------------------------------------------
    void _fastcall TGEdit::WMNCPaint (Messages::TMessage &Message) {
      TCustomMaskEdit::Dispatch((void*)&Message);
      RedrawBorder(HRGN(Message.WParam));
    }
    //---------------------------------------------------------------------------
    void _fastcall TGEdit::RedrawBorder (const  HRGN Clip)
    {
     HDC DC;
     TRect R;
     HBRUSH BorderBrush, ColorBrush, HoverBrush;
    
     DC = GetWindowDC(Handle);
     try
     {
      GetWindowRect(Handle, &R);
      OffsetRect(&R, -R.Left, -R.Top);
      BorderBrush = CreateSolidBrush(ColorToRGB(FColorBorder));
      ColorBrush = CreateSolidBrush(ColorToRGB(Color));
    
      if (!ComponentState.Contains(csDesigning) &&
         (Focused() || (FMouseInControl)))// &&
         //(dynamic_cast <TGEdit*> (Screen->ActiveControl)==NULL))))
      {  // Focus
    
       HoverBrush  = CreateSolidBrush(ColorToRGB(FColorHover));
       if (Flat)
       {
        FrameRect(DC, &R, HoverBrush);
        InflateRect(&R, -1, -1);
       }
       FrameRect(DC, &R, ColorBrush);
       DeleteObject(HoverBrush);
      }
      else
      { // no Focus
       FrameRect(DC, &R, BorderBrush);
       InflateRect(&R, -1, -1);
       FrameRect(DC, &R, ColorBrush);
      }
    
      if (!Flat && (Focused() || FMouseInControl))
      {
       TColor clColor = Color;//Color;
       double h, s, l;
       RGBtoHSLRange(clColor,h,s,l);
    
       if (l>15) l -= 15;
       else l = 0;
       clColor = HSLRangetoRGB(h, s, l);
    
       HPEN highPen = CreatePen(PS_SOLID, 1, ColorToRGB(clColor));
       HPEN backPen = CreatePen(PS_SOLID, 1, ColorToRGB(clBlack/*Color*/));
    
       clColor = ((TForm*)Parent)->Color;
       RGBtoHSLRange(clColor,h,s,l);
       if (l>70) l -= 70;
       else l = 0;
       clColor = HSLRangetoRGB(h, s, l);
    
       HPEN shadPen = CreatePen(PS_SOLID, 1, ColorToRGB(clColor));
       TPoint lpPoint;
    
       SelectObject(DC, highPen);
       MoveToEx(DC, 0, Height-1, &lpPoint);
       LineTo(DC, Width-1, Height-1);
       LineTo(DC, Width-1, 0);
    /**/
       // Paint edit (HighLight)
       SelectObject(DC, shadPen);
       MoveToEx(DC, Width-2, 0, &lpPoint);
       LineTo(DC, 0, 0);
       LineTo(DC, 0, Height-1);
    
       SelectObject(DC, backPen);
       MoveToEx(DC, 1, Height-2, &lpPoint);
       LineTo(DC, 1, 1);
       LineTo(DC, Width-2, 1);
    
       DeleteObject(highPen);
       DeleteObject(shadPen);
      }
     }__finally {ReleaseDC(Handle, DC);}
    
     DeleteObject(ColorBrush);
     DeleteObject(BorderBrush);
    }
    

    Wenn du noch Fragen hast, melde dich einfach bei mir.

    Ich hoffe, ich konnte dir helfen.

    cu

    Xqgene



  • im code sind ein paar unbekannte variablen und funktionen. ich habe die komponente zwar zum laufen gebracht, doch ich weiß nicht so recht, was die verschiedenen "color-variablen" bedeuten. die sache mit "Flat" und "FMouseInControl" verstehe ich auch nicht ganz.

    aber auf jeden fall erst mal dankeschön! 🙂

    ciao, cypoc


Anmelden zum Antworten