I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
Der er 2 grunde til dette, hvoraf den foerste har primaer vaegt.
1) Jeg skal have lavet min egen grafik for comboboxen... i baade comboboxen og i drop down list boxen. Det vil jeg formode er umuligt (laes meget besvaerligt), hvis jeg skal overskrive. Jeg troede ikke det var svaert at lave en selv, men det er det maaske...
2) Jeg har i nogle maaneder funderet over HVORDAN comboboxen er implementeret. Hvordan er det muligt at vise et vindue uden fokus, og lukke det idet der bliver trykket hvor som helst paa skaermen.
Jeg kunne ikke lige finde et eksempel. Jeg vil godt lave et, hvis du er interesseret.
Men hvis du arver fra ComboBox og sætter OwnerDraw = true, kan du selv tage dig af at lave den grafik, der skal til.
Ad 2), hvis du er nysgerrig efter hvordan den er implementeret, vil jeg anbefale dig at tage et kig på den i Lutz Roeder's Reflector. http://www.aisto.com/roeder/dotnet/
1) Comboboxen skal have en border der er 5 bred, og knappens look skal aendres.
2) Listboxen der fremkommer skal ogsaa have en border der er 5 bred.
Jeg har kigget lidt paa roeaders program og det virker som jeg kan finde ud af hvordan det er implementeret ved brug af det. Takker. Svar => point
Konklusion: Mange gange vil det vaere nemmere at lave en kontrol selv, istedet for at overskrive standard kontrollerne (isaer hvis man skal ned og rode ved messages).
Du kan oprette en normal textbox, og en knap til højre for den. På knappen kan du sætte et billede ind. Så har du din egen grafik på den. Din liste kan bare være listbox, hvis den ikke skal laves så meget om. Eller kan du lave din egen klasse og arve fra et eksisterende element.
Mht det med focus, kan du nemt køre en hide() på din liste, når der trykkes et sted. Når man så trykker på din custom knap, vises din liste.
Så skal du bare lave funktionaliteten med at markere det element i listen, som matcher det man skriver i tekstboksen. Til det er der en "FindString" metode på en listeBox.
int selected = listBox1.FindString(source); listBox1.SelectedIndex = selected;
Jeg er uenig med dig i at det er bedre at lave en kontrol selv; hvis du arver fra en af standardkontrollerne får du det meste af funktionaliteten foræret, og din nye kontrols look-and-feel er konsistent med standardkontrollerne.
Jeg har kigget lidt på dit problem, og er kommet frem til følgende: 1) ComboBox er implementeret med 2 child windows, Edit delen og drop-down delen 2) Tegning af ComboBox sker i DrawFlatCombo, som desværre er en privat metode, hvorfor vi ikke kan override den 3) Vi kan bruge Paint eventet til at tegne vores egen version af ComboBox'en 4) Jeg fandt dog, at Paint eventet på en ComboBox ikke bliver fyret af, dokumentationen siger også at den er til "internal use". Derfor er det nødvendigt at kigge på vinduets messages og selv få Paint eventet til at fyre rigtigt. 5) Du kan selv tegne de enkelte items, ved at sætte DrawMode til en af OwnerDraw varianterne.
/// <summary> /// Draw one item in the drop-down /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void ComboBoxEx_DrawItem(object sender, DrawItemEventArgs e) { Graphics g = e.Graphics; e.DrawBackground(); float w = 2;
if (e.State == DrawItemState.Selected) w += 3;
Pen p = new Pen(e.ForeColor,w); g.DrawRectangle(p, e.Bounds); PointF pos = new PointF(e.Bounds.X + w + 1, e.Bounds.Y + w); g.DrawString(Items[e.Index].ToString(), e.Font, new SolidBrush(e.ForeColor), pos);
}
/// <summary> /// Overrides WndProc to provide a functioning Paint event in ComboBox /// </summary> /// <param name="m"></param> protected override void WndProc(ref Message m) { base.WndProc(ref m); if (m.Msg == WM_PAINT) { // fake a Paint event using (Graphics g = this.CreateGraphics()) { PaintEventArgs pea = new PaintEventArgs(this.CreateGraphics(), this.ClientRectangle); OnPaint(pea); } } }
driss>> Det er rigtig meget der skal overskrives. Hvad med hvorhenne man trykker paa comboboxen (pga. tykkere border) etc. I sidste ende vil det vaere federe at skrive en selv, om ikke andet for ogsaa at laere hvordan det er implementeret.
Jeg har kigget lidt paa reflector. Det viser sig at System.Windows.Forms. kun er et layer oven paa combobox kontrollen. Saa jeg er faktisk tilbage til hvor jeg startet - nemlig hvordan er en combobox implementeret???????????????
Det er rigtigt, at stort set alle klasserne i System.Windows.Forms blot er (mere eller mindre avancerede) wrappers omkring de kontroller Win32 API stiller til rådighed. (F.eks. er ComboBox bygget op af 2 native window's som igen er en wrapper omkring et HWND).
Du kan ikke få lov at dykke dybere ned i hvordan det er implementeret - med mindre du overbeviser Microsoft om, at en Windows i open source er en god ting ;-)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.