[VB.NET] Combobox met kleuren (zoals color in fontdialog)

Pagina: 1
Acties:
  • 230 views sinds 30-01-2008
  • Reageer

  • The__Virus
  • Registratie: Januari 2005
  • Laatst online: 10:25
Ik wil graag een combobox maken, precies zoals de combobox voor de kleur in een fontdialog.
Afbeeldingslocatie: http://www.abisource.com/mailinglists/abiword-dev/01/June/att-0426/01-fontdialog.png
Dus exact hetzelfde als de Color combobox als in dit plaatje. Bij dropdown krijg je dus een beperkt lijstje met simpele kleurnamen met daarbij een klein vakje met de betreffende kleur. Is hier een eenvoudige oplossing voor of zal ik een 'userdrawn' combobox moeten maken? Kon iig geen makkelijke oplossing vinden. Een lijst van kleuren lukt zelfs al niet, want dan krijg je ál de kleuren uit vb.net (dus aqua, transparant etc. i.p.v. alleen red, blue, navy, green, black etc.) en niet degene die alleen voorkomen in een fontdialog.
Ik hoop dat hier een makkelijke oplossing voor is, BVD :).

  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

dit komt al een beetje in de buurt maar ik denk dat je voor een component als in jouw voorbeeld toch echt zelf aan het klussen moet gaan.

Update:
Deze schijnt het te kunnen. Code is te downloaden

[ Voor 24% gewijzigd door MTWZZ op 28-02-2007 19:22 ]

Nu met Land Rover Series 3 en Defender 90


  • The__Virus
  • Registratie: Januari 2005
  • Laatst online: 10:25
Helaas is dat C#, waar ik weinig verstand van heb. Simpele dingen kan ik nog wel 'vertalen' maar deze dingen zijn net iets te ingewikkeld.
Ik heb op dit moment dit als code:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        Dim kleuren As ArrayList = New ArrayList
        kleuren.Insert(0, System.Drawing.Color.Black.ToString)
        kleuren.Insert(1, System.Drawing.Color.Maroon.ToString)
        kleuren.Insert(2, System.Drawing.Color.Green.ToString)
        kleuren.Insert(3, System.Drawing.Color.Olive.ToString)
        kleuren.Insert(4, System.Drawing.Color.Navy.ToString)
        kleuren.Insert(5, System.Drawing.Color.Purple.ToString)
        kleuren.Insert(6, System.Drawing.Color.Teal.ToString)
        kleuren.Insert(7, System.Drawing.Color.Gray.ToString)
        kleuren.Insert(8, System.Drawing.Color.Silver.ToString)
        kleuren.Insert(9, System.Drawing.Color.Red.ToString)
        kleuren.Insert(10, System.Drawing.Color.Lime.ToString)
        kleuren.Insert(11, System.Drawing.Color.Yellow.ToString)
        kleuren.Insert(12, System.Drawing.Color.Blue.ToString)
        kleuren.Insert(13, System.Drawing.Color.Fuchsia.ToString)
        kleuren.Insert(14, System.Drawing.Color.Aqua.ToString)
        kleuren.Insert(15, System.Drawing.Color.White.ToString)

Zo krijg je dus de kleuren in elk geval in de juiste taal. Want mijn OS is engels, maar dat zal niet bij iedereen zo zijn. Nu moet ik hier nog de kleur voor krijgen in een rechthoek, alleen hoe krijg ik dat in VB.NET (;)) voor elkaar? Zal sowieso nog verder zoeken maar hoop dat jullie me een zetje in de goede richting kunnen geven :).

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
C# moet makkelijk te vertalen zijn naar VB.NET. Enkel een syntax-kwestie....

Trouwens, een eenvoudige google-search leverde dit op

[ Voor 29% gewijzigd door whoami op 28-02-2007 20:43 ]

https://fgheysels.github.io/


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je zult de OnDrawItem methode van ComboBox moeten overriden en dan zelf tekenen. Dat is de juiste oplossing.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • The__Virus
  • Registratie: Januari 2005
  • Laatst online: 10:25
Ik heb m.b.v. een tutorial het voor elkaar gekregen in de lijst de kleuren in een rechthoek te zetten met daarachter de naam. Alleen in het textvak van de combobox (dus het item dat je ziet als ie dicht is geklapt) komt geen kleur te staan. Hoe krijg ik dat dan voor elkaar?
De code voor de kleur in de itemslist:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Protected Sub cmbtitelkleur_drawitem(blablabla)
        If e.Index < 0 Then
            e.DrawBackground()
            e.DrawFocusRectangle()
            Exit Sub
        End If
        ' Get the Color object from the Items list
        Dim aColor As Color = Color.FromName(kleuren.Item(e.Index))

        ' get a square using the bounds height
        Dim rect As Rectangle = New Rectangle(2, e.Bounds.Top + 2, e.Bounds.Height, e.Bounds.Height - 6)

        Dim br As Brush

        ' call these methods first
        e.DrawBackground()
        e.DrawFocusRectangle()

        ' change brush color if item is selected
        If e.State = Windows.Forms.DrawItemState.Selected Then
            br = Brushes.White
        Else
            br = Brushes.Black
        End If

        ' draw a rectangle and fill it
        e.Graphics.DrawRectangle(New Pen(aColor), rect)
        e.Graphics.FillRectangle(New SolidBrush(aColor), rect)

        ' draw a border
        rect.Inflate(1, 1)
        e.Graphics.DrawRectangle(Pens.Black, rect)

        ' draw the Color name
        e.Graphics.DrawString(aColor.Name, cmbtitelkleur.Font, br, e.Bounds.Height + 5, ((e.Bounds.Height - cmbtitelkleur.Font.Height) \ 2) + e.Bounds.Top)
end sub

Ik heb eenzelfde soort combobox, alleen dan voor de fonts. Ook daar is het weer zo dat de items in de lijst allemaal de fontnaam in het lettertype van het betreffende font zijn, maar het eerste item dus weer niet.
Ik heb gekeken of ik bij cmbtitelkleur_SelectedIndexChanged of TextChanged een e.graphics aan kon roepen (die dus het betreffende item tekent), maar dat kan helaas niet :(

  • The__Virus
  • Registratie: Januari 2005
  • Laatst online: 10:25
Niemand?

edit:
OK heb het probleem opgelost oplossing volgt nog ;). Ben namelijk nog even bezig iets te veranderen want het werkt half zoals ik het wil.

[ Voor 88% gewijzigd door The__Virus op 02-03-2007 20:09 ]


  • The__Virus
  • Registratie: Januari 2005
  • Laatst online: 10:25
OK hierbij de oplossing:
Ik heb de comboboxstyle op dropdownlist gezet. Hierdoor krijg je dus wél de plaatjes te zien uit de lijst.
Het nadeel is dat je dan de text in de combobox niet kunt editten, maar alleen iets kunt kiezen uit de lijst. Aangezien ik een colordialog erbij had, omdat er maar een beperkt aantal kleuren in stonden, moest ik die custom colors dus toevoegen aan de array waaruit de combobox zijn items laad en de combobox opnieuw laten tekenen.
Ik laat dus het tekenen van de string afhangen of het een bekende kleur is of dat het een HTML kleurcode is. De juiste kleur wordt keurig in het rechthoekje getekend en er komt óf de naam (die bekend is in HTML, dat zijn de namen die je ziet in mijn 2e post) óf de HTML kleurcode.

[ Voor 18% gewijzigd door The__Virus op 03-03-2007 15:59 ]

Pagina: 1