Blog Home  Home RSS 2.0 Atom 1.0 CDF  
.NET (Compact) Framework - GUI
Haggy's technischer BLog
 
 Sunday, September 30, 2007

Mit dem ToolboxBitmap Attribut kann man  für eigene Controls Icons festlegen, die dann später in der Visual Studio ToolBox angezeigt werden. Das sieht ungefähr so aus:

[ToolboxBitmap(typeof(TextBox))]

Dies hätte zur Folge dass für das Control in dem dieses Attribut so definiert wird, das Icon  einer TextBox immer angezeigt wird. Man kann z.bsp. auch alternativden Pfad zu einen Image angeben (s. dazu die MSDN Doku: http://msdn.microsoft.com/library/deu/default.asp?url=/library/deu/vbcon/html/vbtskProvidingToolboxBitmapForYourControl.asp)

 

Nun brauche ich aber in einem TreeViewin einer Anwendung den umgekehrten Weg. Das bedeutet ich möchte eine Methode implementieren, welche mir ein Image zurückliefert, welches in der ToolBox angezeigt werden würde.

Ein Ansatz wäre die CustomAttributes nach ToolBoxBitmap zu durchsuchen. Allerdings werden dann bei .NET BaseClasses nicht das Attribut ToolBoxBitmap zurückgeliefert, sondern nur die nachfolgenden Attribute:

 

System.Runtime.InteropServices.ClassInterfaceAttribute

System.Runtime.InteropServices.ComVisibleAttribute

System.ComponentModel.DesignerAttribute

System.Windows.Forms.SRDescriptionAttribute

System.ComponentModel.DefaultEventAttribute

System.ComponentModel.DesignerAttribute

System.ComponentModel.DefaultBindingPropertyAttribute

System.ComponentModel.DesignerAttribute

System.Windows.Forms,Allow

System.ComponentModel.Design.Serialization.DesignerSerializerAttribute

System.ComponentModel.DefaultPropertyAttribute

System.ComponentModel.DesignerCategoryAttribute

 

Glücklicherweise gibt es aber einen einfachen Weg an das Image, das für die ToolBox vorbestimmt ist ranzubekommen. Der Weg führt über den Reflector. Dort Habe ich mir die Konstruktoren der ToolBoxBitmapAttribute Klasse mal angesehen

public ToolboxBitmapAttribute(Type t) : this(GetImageFromResource(t, null, false), GetImageFromResource(t, null, true))

{

}

 

Dort sieht man dass GetImageFromResource aufgerufen wird. Die definition davon sieht so aus:

 

public static Image GetImageFromResource(Type t, string imageName, bool large)

{

    Image image = null;

    try

    {

        string fullName = imageName;

        string bitmapname = null;

        string str3 = null;

        string str4 = null;

        if (fullName == null)

        {

            fullName = t.FullName;

            int num = fullName.LastIndexOf('.');

            if (num != -1)

            {

                fullName = fullName.Substring(num + 1);

            }

            bitmapname = fullName + ".ico";

            str3 = fullName + ".bmp";

        }

        else if (string.Compare(Path.GetExtension(imageName), ".ico", true, CultureInfo.CurrentCulture) == 0)

        {

            bitmapname = fullName;

        }

        else if (string.Compare(Path.GetExtension(imageName), ".bmp", true, CultureInfo.CurrentCulture) == 0)

        {

            str3 = fullName;

        }

        else

        {

            str4 = fullName;

            str3 = fullName + ".bmp";

            bitmapname = fullName + ".ico";

        }

        image = GetBitmapFromResource(t, str4, large);

        if (image == null)

        {

            image = GetBitmapFromResource(t, str3, large);

        }

        if (image == null)

        {

            image = GetIconFromResource(t, bitmapname, large);

        }

    }

    catch (Exception)

    {

    }

    return image;

}

 


Mit diesem Wissen ist es nun einfach, dass passende image abzurufen.

 

Die CodeZeile um an ein ToolBox Image eines Controls (z.bsp. das der Textbox) ranzukommen sieht also so aus:

Kleines Image:

    Image curIMG = ToolboxBitmapAttribute.GetImageFromResource(typeof(TextBox),null,false )

 

Großes Image

    Image curIMG = ToolboxBitmapAttribute.GetImageFromResource(typeof(TextBox),null,true )

 


 

 Eine Anmerkung noch. Da das ganze über den Type einer TextBox läuft, ist diese Methode in schleifen (Z.bsp. für das dynamische Abarbeiten von Controls) nicht sehr schnell, deswegen würde es sich anbieten die Images zu den Types zu Cachen, damit man schnell  auf den Type und die dazugehörigen Images kommen kann.

Bitte um Feedback ! 

9/30/2007 7:29:09 AM (W. Europe Standard Time, UTC+01:00)  #    Comments [0]    | .NET Allgemein | C# | Controls | GUI | Tutorials  | 
 Monday, August 06, 2007
Es hat sich wieder einiges am Gantt Control getan.

Der Schwerpunkt der Entwicklung lag auf dem Zugänglichen machen interner Events. So kann man z.bsp. Eingreifen wenn eine Bar oder ein Item für das Zeichnen vorgeladen werden oder man kann reagieren wenn sich der sichtbare Bereich des Gantts ändert.

 So ist es möglich Daten on Demand nachzuladen.

Der andere Schwerpunkt lag im Verbessern der Useability, so kann man nun auch bei einzelnen Zeilen Hintergrundfarbe etc. bestimmen.

Hier mal ein Screenshot mit Farbigen Hintergrund Zeile



Weitehrin gibt es inzwischen auch definierbare Tooltips je bar.

Ein nettes kleines Feature, dass man im mom leider nicht auf dem Screenshot sieht sind kleine hilfslinien die in der Zeitleiste angezeigt werden sobald man eine Bar via Mouse & Drag verschiebt oder Sized ,so dass man immer sieht wie weit die Bar ausgedeht ist.

Ansonsten habe ich noch 2 Controls in das GanttChart unten reingepackt, die es ermöglcihen auf der Zeitachse zu zoomen. Sprich den Abstand zwischen den Stunden  btw. Tage einzustellen.

In meinem nächsten Posting folgen dann Beispielcodes wie das Gantt Control mit Daten beladen wird.
8/6/2007 4:55:52 PM (W. Europe Standard Time, UTC+01:00)  #    Comments [0]    | .NET Allgemein | BE Gantt | C# | Controls | GUI | Releases | System.Drawing | Thir Party Tools | Updates & SP | WinForm  | 
 Monday, July 30, 2007
Momentan forciere ich etwas das Gantt Projekt, deswegen bin heute mal wieder einen ganzen Schritt vorwärts gekommen.

Es gibt nun auf der linken Seite des Controls eine Ansicht die der Identifizierung einer Zeile dient (s. Screenshot).
Auch können Bars nun via intuitivem Drag & Drop verschoben werden. Als nächstes Folgt noch das sizen und neu anlegen via Drag & Drop.

Auch habe ich weitere Optimierungen in das Ganttchart eingebaut, welche die Performance noch weiter verbessern konnte.

Als nächste Punkte habe ich mir auch noch das einstellen der Datumsanzeige stehen. Momentan wird immer das ShortDate passend zur aktuellen Culture verwendet, hier wird der User demnächst abweichende Masken definieren können.

Auch werde ich nach aussen weitere einfache Möglichkeiten geben, das Design beeinflussen zu können.

Hier nun der Screenshot

7/30/2007 9:53:07 PM (W. Europe Standard Time, UTC+01:00)  #    Comments [0]    | .NET Allgemein | BE Components | BE Gantt | Controls | GUI | Releases | System.Drawing | Thir Party Tools | Updates & SP | WinForm  | 
 Sunday, July 29, 2007
Im moment entwickle ich an einer eigenen GanttCharting Componente.

Hierfür suche ich noch BetaTester.
Die Komponente ist in 100%  managed .NET 2.0 C# Code geschrieben.

Hier mal ein kleiner Screenshot:




Der Schwerpunkt der Komponente liegt in der anpassbarkeit. So kann mal das Erscheinungsbild praktisch jedes UI Elementes über Properties einstellen.

So kann man z.bps. den Bars einen Farbverlauf geben, Pre , Post und Inner images definieren.
Das Control läuft auch noch mit einigen hunder / tausend bars sehr performant


Wichtig wären mir Bugreports sowie hinweise auf Useability schwächen.
7/29/2007 5:49:57 PM (W. Europe Standard Time, UTC+01:00)  #    Comments [0]    | .NET Allgemein | BE Components | BE Gantt | C# | GUI | Releases | Thir Party Tools | Updates & SP | WinForm  | 
 Thursday, June 21, 2007
n letzter Zeit beschäftige ich mich damit, Desginunterstützung für Contorls zu erstellen.
Hierbei gibts z.bsp. die neuen smartTags
s.



Um diese soll es mit aber zunächst mal gar nicht direkt gehen.
Sondern viel mehr um ein Problem dass mich schon immer begleitete aber nun bei den smartTags an Bedeutung gewann.
Fehler im Designer!

Was tun wenn Fehler im Designer auftreten ? Man ist ja in keiner Runtime Umgebung und kann somit ja keine Brakepointssetzen ! oder doch ?

Die Lösung ist einfacher als erwartet. Dazu habe ich über eine NewsGroup einen sehr interessanten Link von Frank Dzaebel bekommen s. u.
Die Lösung um im Designer Debuggen zu können ist folgende:
Man setzt in den Projekteigenschaften des ControlLibrary Projektes unter Debuggen ein extres programm zum Debuggen und zwar Visualstudio selbst.


Der rest ist einfach ,man setzt nun das ControlLibrary Projekt als Startprojekt. Zur Controle damit man nachher sieht dass der Debugger etwas tut setzen wir uns in einen eigenen Designer einen Breakpoint.

Führt man nun das Projekt auf öffnet isch eine neue VisualStudio instanz. Diese hat noch kein Projekt geöffnet und tut nichts. Davon sollte man sich einfach nicht irritieren lassen und einfach das ContorlLibrary Projekt in dieser Instanz wieder öffnen. Wenn man sich nun den Designer für das Control anzeigen lässt springt der Debugger an!



Hier der Link zur Microsoft seite mit der Aneitung zum Debuggen im Designer http://msdn2.microsoft.com/de-de/library/5ytx0z24(VS.80).aspx
6/21/2007 7:56:56 AM (W. Europe Standard Time, UTC+01:00)  #    Comments [1]    | .NET Allgemein | BLogs | Bugs | C# | Controls | GUI | System.Drawing  | 
 Monday, May 07, 2007
Notgedrungen muss ich mich immer Wieder mit dem berechnen der Kalenderwochen bei diversen Controls auseinander setzen.
Z.bsp. habe ich schon controls gesehen die es schaffen auf eine 55. KW zu kommen. Ganz zu schweigen dass das Berechnen der Kalenderweochen nach deutschen System und der DIN 1355 selten konsequent umgesetzt ist.

Einen einstieg zu Kalenderwochen im Allgemeinen findet man bei Wikipedia s. http://de.wikipedia.org/wiki/Kalenderwoche#Kalenderwoche

Das deutsche Kalender System definiert sich dadurch dass der erste Tag der Woche der Montag ist und die erste KW mit der Woche beginnt, bei der denen mindestens VierTage im neuen Jahr liegen.


Im .NET Framework wird dies durch :

CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek = DayOfWeek.Monday;
CultureInfo.CurrentCulture.DateTimeFormat.CalendarWeekRule = CalendarWeekRule.FirstFourDayWeek;

definiert. Man sollte erwarten dass wenn man nun GetWeekOfYear(...) aufruft dass die errechneten Kalenderwochen immmer passen. Leider ist das nicht der Fall denn der 29. Dezember 2003 wäre nach der Norm in der 1.KW 2004 und nicht in der 53.KW 2003. Leider ist der Rückgabewert der Funktion 53.....

Dieses Verhalten ist nicht unbedingtein Bug aber auch nicht direkt zu erwarten s. hierzu: http://www.mycsharp.de/wbb2/thread.php?postid=196701#post196701
Abbhilfe schafft hier ein .NET Snippet s. http://dotnet-snippets.de/dns/kalenderwoche-berechnen-SID260.aspx

Ich werde die Tage ein Control Online stellen, welches dann wahlweise mit der .NET Methode oder aber diesen schnippet arbeitet.


5/7/2007 6:55:55 AM (W. Europe Standard Time, UTC+01:00)  #    Comments [1]    | .NET Allgemein | BLogs | C# | Controls | GUI | Thir Party Tools | Tutorials | WinForm | CultureInfo / Globalization  | 
 Tuesday, March 20, 2007
Soeben habe ich ein kleines Control etwickelt, welches Textausgaben auf einem Control (Z.bsp. dem Hauptfenster) ermöglicht ohne dabei auf eine Interaktion des User zu warten.
Es blendet sich wahlweise nach einer gewissen Zeit und / oder durch eine Mousebewegung wieder aus.

Die FoxPro Programmierer kennen das als eigentlich systemeigenes Tool "WaitWndow". Man kann es gut für kurze / einfache Statusmessages an den User verwenden.

Natürlich habe ich es mir nicht nehmen lassen und habe das ganze auch etwas erweitert. So kann man dem Control einen Farbverlauf geben , also auch dem Text ein Icon vorran stellen.

Natürlich sind die Farben ,Farbverlauf,Schriftarten,  etc,... frei einstellbar :)
Werde es dann morgen hier noch zum Kostenlosen Download stellen.

Würde mich über Feedback freuen!

Hier mal ein Screenshot:



Hier im Vergleich das "alte" VFP Wait Window

Hier der Downloadlink
3/20/2007 11:21:03 AM (W. Europe Standard Time, UTC+01:00)  #    Comments [1]    | .NET Allgemein | Controls | GUI | Releases | Tutorials  | 
 Wednesday, January 24, 2007
In einer Anwendung zeige ich Dateinamen in einem Grid an. Nun würde ich gerne je nach dem um welchen Dateityp (Fileextension) es sich handelt, das in Windows dazu hinterlegt icon anzeigen.

Das besondere Problem : Die Datei ist nicht physikalisch vorhanden.

Die Lösung sieht wie folgt aus:

        /// <summary>
        /// List der bereits gelesenen icons
        /// </summary>
       static  Dictionary<string, Icon> iconList = new Dictionary<string, Icon>();

         /// <summary>
        /// Liefert ein icon zurück das dem bild entspricht, dass windows einer DAtei zuordnen würde
        /// </summary>
        /// <param name="extension">Dateiendung</param>
        /// <returns>Icon</returns>
        public static Icon GetIconFromExtension(string extension)
        {

            Icon fileIcon = null;

            if (!string.IsNullOrEmpty(extension) && extension.Trim() != "")
            {

                //Prüfen ob wir schonmal das icon ermittelt hatten

                if (iconList.ContainsKey(extension.Trim().ToUpper()))
               
{

                    fileIcon = iconList[extension.Trim().ToUpper()];
                }
               
else            
              
{

                    //Wir erzeugen uns eine temporäre Datei um darüber das Icon ermitteln zu können,
                    //da Icon.ExtractAssociatedIcon() einen Pfad zu einer existierenden Datei benötigt
                    string tempfile = Path.Combine(Path.GetTempPath(), "_temp" + Guid.NewGuid().ToString() + extension.Trim());

                    File.WriteAllText(tempfile, "dummy");

 

                    //Icon ermitteln und dnach die tempdatei löschen
                    fileIcon = System.Drawing.Icon.ExtractAssociatedIcon(tempfile);
                    System.IO.File.Delete(tempfile);

                     //Das Icon "merken" wir uns damit der aufwand zum ermitteln der icons klein bleibt
                    iconList.Add(extension.Trim().ToUpper(), fileIcon);
               }
            }

            //Rückgabe des ermittelten icons
            return fileIcon;
        }



Der Aufruf um z.Bsp. das Image in einer Picturebox anzuzeigen sieht dann so aus:

myPictureBox.Image = GetIconFromExtension(".gif").ToBitmap();


1/24/2007 11:57:01 AM (W. Europe Standard Time, UTC+01:00)  #    Comments [2]    | .NET Allgemein | Controls | GUI | Tutorials  | 
 Wednesday, January 03, 2007
In meinen Anwendungen nutzt ich häufig third Party Control wie Controls von Infragistics, usw...
Die Third Party Controls Subclasse ich eigentlcih immer, um möglichst viel einfluss auf deren Verhalten nehmen zu können. Weiterhin liegen auf meinen Forms praktisch nur Container (User Defined Controls).

Nun ,insbeonsdere wenn Toolstrips in Spiel kommen, passiert es , dass Forms sich nur noch dadurch aktivieren lassen, indem man auf Ihre Titelleiste clickt. Einen Click sonst wo auf die Form gibt der Form keinen Focus.

Witziger weise funktioniere naber die Controls. Also ich kann z.bsp. TreeNodes expanden, Buttons clicken usw....  Aber die Form bekommt nicht den Focus und sie kommt nicht nach vorne.

Eine schnelle idee war einfach der Form zu sagen -> Wenn Click dann komm nach vorne.
Funktioniert ja aber nicht weil ich nicht weiß ob und wenn ja welche controls auf der Form liegen. Diesesn Code in sämtliche controls zu hängen ist meinem Empfinden nach mehr als grausam, also suchte ich nach einem passenden event / Methode und bin dabei auf die virtuelle WndProc Methode gestoßen .

Dort kommen nachrichten des Betriebssystems an die form an. Nun habe ich diese Methode überschrieben und festgestellt dass immer wenn ein Form aktiviert werden sollte immer die gleichen Messages feuern.

Nun prüfe ich einfach die eingehende Message und wenn es sich um eine Aktivierung handelt hole ich die Form manuell nach vorne (Source Code s. weiter unten)

Interessant ist auch, dass scih andere dinge ebenfalls damit realisieren lassen. Z.bsp. aktionen wenn man über die Titelleiste der Form fährt etc...

Hier ein Beispielhafter (noch unausgearbetiet Source Code der Forms nach vorne holt)
Insbesondere bei der Message muss ich nochmal schauen, dass ich die wirklcih passende message (glaueb 33 passt nicht 100%) abfrage


protected override void WndProc(ref Message m)

{

    //Erstmal das Standardverhalten ausführen lassen

    base.WndProc(ref m);

    //Eingehende Message Prüfen

    switch (m.Msg)

   {

          //Form soll nach vorne geholt werden

   case 33:

          // Focus setzen und sicherheitshalebr vorholen

           this.Focus();

           this.BringToFront();

           break;

    default:

           //Sonstige Messages

           break;

 

    }

}



Würde mich sehr freuen wenn ihr mir Feedback gibt ob ihr auch solche Probleme kennt und wie eure Lösungen waren.
1/3/2007 8:12:45 PM (W. Europe Standard Time, UTC+01:00)  #    Comments [2]    | .NET Allgemein | Controls | GUI | Thir Party Tools  | 
 Monday, August 21, 2006

Da immer wieder die Frage aufkommt ob man .NET Komponenten in eine Anwendung bekommt, welche in einer "nicht-.NET fähigen" Sprache geschrieben wurde.

Gibt es hier ein Tutorial, wie man ein .NET Control als OCX hinbekomment und man es somit in jeder Sprache verwenden kann die ActiveX fähig ist.

Hier der Link: http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,3dd24f92-a52c-4bb0-8121-c2e6e2cc4f93.aspx
8/21/2006 8:03:32 AM (W. Europe Standard Time, UTC+01:00)  #    Comments [0]    | .NET Allgemein | Controls | GUI  | 
 Wednesday, June 07, 2006
Hi
Von OpenNETCF gibts eine neue kommerzielle Bibliothek, welche Kalenderansichten auf dem PocketPC im Outlook style ermöglicht.

Hier ein Bild:


Weitere Infos unter:

http://www.opennetcf.com/controls/calendar


6/7/2006 11:59:41 AM (W. Europe Standard Time, UTC+01:00)  #    Comments [0]    | .NET Allgemein | Compact Framework | Controls | GUI | OpenNETCF | Updates & SP  | 
 Wednesday, April 12, 2006

In einem .NET Objekt bin ich über ein Control gestolpert, von dem ich glaube, dass es viele schon gebraucht haben.
Das Tolle daran ist, dass es das control unter: http://www.codeproject.com/cs/miscctrl/XPTaskBar.asp kostenlos gibt.
Wer es mit .NET Framework 2 einsetzen möchte sollte sich das unter den Kommentare angegebene Update installieren, da in der Ursprungsversion zum einem ein Point (int) falsch definiert war und zum anderen eine performance optimierung integriert wurde.



4/12/2006 2:28:13 PM (W. Europe Standard Time, UTC+01:00)  #    Comments [0]    | .NET Allgemein | Controls | GUI  | 
Copyright © 2010 Haggy. All rights reserved.
DasBlog 'Portal' theme by Johnny Hughes.
Pick a theme: