Tab Control Buttons selber zeichnen...



  • Hallo!

    Ich würd gern ein Tab Control selber zeichnen, und zwar eigentlich nur als eine Zeile mit Buttons. Die reihen sich beim Tab Control so schön aneinander und man kann einfach welche hinzufügen, deshalb möchte ich das nicht alles selbst machen.

    Aber wenn ich auf WM_DRAWITEM reagiere und den Button selbst zeichnen will, haben die Buttons trotzdem so nen hässlichen 3D-Rahmen, obwohl ich den gesamten DC mit Rot übermale...
    Weiters möchte ich auch den Abstand zwischen den Buttons festlegen...

    case WM_DRAWITEM:
    
    ...
    
        case IDC_TAB2:
        {
    	    HBRUSH fillBrush = CreateSolidBrush(RGB(255, 0, 0));
    
    	    BeginPaint(drawItemData->hwndItem, 0);
    	    FillRect(drawItemData->hDC, &drawItemData->rcItem, fillBrush);
    	    EndPaint(drawItemData->hwndItem, 0);
    
    	    DeleteObject(fillBrush);
    
    	    return false;
        }
        break;
    

    Was muss ich tun?
    Danke!


  • Mod

    Und hier findest Du keine Anregungen?
    http://www.codeproject.com/KB/tabs/#Tab Controls - Owner Drawn
    Auch wenn es teilweise MFC Code ist, so müsste der Ownerdraw Teil sich doch rleative leicht extrahieren lassen.



  • Vielleicht bin ich zu dumm, jedenfalls hat mir das nicht geholfen, da ich mit raw winapi arbeite, da sieht das alles wieder ganz anders aus..


  • Mod

    Was sieht anders aus?
    Die MFC ist doch wirklich nur ein Wrapper... Die Kernfunktionen für das Ownerdraw müssten sich direkt übertragen lassen.



  • zB. CXCtrl::OnDrawItem()...
    Schön, dass die eine WM_DRAWITEM bekommen, mein subclassed control bekommt die nicht...

    Ich habe mich entschieden, alles zu subclassen, denn sonst kann ich zB. angeblich keinen hover Effekt für einen Button machen.

    Jetzt hänge ich:
    Können alle Controls per subclassing selbst gezeichnet werden? Oder muss sich grundsätzlich der Parent mit WM_DRAWITEM drum kümmern?

    Es geht mir darum, wenn ich zB. einen Button komplett selbst machen möchte:
    Zum selbst zeichnen reagiere ich auf WM_DRAWITEM im Parent, für einen Hovereffekt muss ich den Button aber subclassen.

    -> Somit möchte ich den Button gleich NUR subclassen und auch in seiner eigenen Prozedur zeichnen.

    Geht das? Mit WM_PAINT im ButtonProc hatte ich keinen Erfolg!



  • Ah ich denk ich hab es mit subclassing hinbekommen.
    Hmm, was mich noch sehr stört sind die Dialog Units.
    Kann man im VS Form Designer nicht auf Pixel umstellen?

    Wenn ich zB. einen eigenen Tab Control machen möchte (einfach eine Zeile mit Buttons), lege ich im CreateWindow() doch Pixelbreiten fest...

    Und ständig Umrechnen kanns doch nicht sein...


  • Mod

    Dir ist klar, dass DLUs nicht fest sind. Es gibt keinen festen Umrechnungsmassstab und dass macht die DLUs auch mächtig.

    Was für ein Problem hast Du mit dem umrechnen?
    Es gibt fertige Funktionen dafür wie MapDialogRect
    http://msdn.microsoft.com/en-us/library/ms645502(VS.85).aspx



  • Ich hab mich entschieden, den Form Designer nicht zu verwenden. Da ich alles selbst zeichnen will, bringt es wohl nur Frustration.
    Lieber baue ich mir einen Editor, mit dem ich Bereiche festlege in denen Controls liegen und speichere dann in eine Datei ab.
    Die nutzende Applikation liest die Daten und erstellt so die Controls selbst.
    Dabei werden auch verschiedene Stile gespeichert, zB. Button Stil 1 für das SysMenu rechts oben, Button Sil 2 für PushButtons usw...

    Aber worüber ich mir grade den Kopf zerbreche:
    Wie mache ich komplexere Controls selbst?

    zB:
    - Edit:
    Nicht OwnerDraw- fähig, und Static Control hat nicht genügend Notifications wie zB. focus...

    - ListBox:
    Wie würde ich da zB. die Scollbars zeichnen?

    Und was ist mit weiteren Controls, wie Slider Control, Spin Control... ?

    Eins steht fest, ich sollte für jeden Control eine Klasse erstellen, die das schön kapselt.

    Ich hab das Gefühl, das wird schön kompliziert... 😮


  • Mod

    Ich verstehe gerade nicht was Du vorhast? Muss ich das?

    BTW: Ein Static Control kann per Design niemals den Focus bekommen...

    Wenn Du alles selber zeichnen willst, dann solltest Du vielleicht dazu übergehen, überhaupt Deine eigenen Controls zu verwenden.

    Scrollbars werden IMHO im WM_NCPAINT gezeichnet. Du hättest also hier Deinen Ansatz...



  • Moment mal... "überhaupt Deine eigenen Controls zu verwenden".
    Was meinst du damit?

    Gerade dachte ich daran, ein User Interface mit dem GDI oder GDI+ zu erstellen, anstatt die Standard Controls zu verändern.

    Meinst du das damit?
    Ist das überhaupt ohne Weiteres möglich?
    Ich stelle mir das so vor:

    Für einen Button zB. zeichne ich einfach ein Rechteck und reagieren tue ich auf die Controls indem ich die Mausposition abfrage und schaue über welchem Control der Mauszeiger liegt...

    So in etwa? Würde mir schon mal besser gefallen als der Frust mit OwnerDraw...


  • Mod

    Natürlich ist das selber möglich solche Controls zu schreiben...
    Die Controls in Window sind doch auch nichts spezielles als nur eben Vorgaben.


Anmelden zum Antworten