Laden...

Forenbeiträge von handycommander Ingesamt 415 Beiträge

02.12.2011 - 19:33 Uhr

Hallo,

ah ich verstehe. 😃
Das Histogramm wäre auch noch ne super Idee, gefällt mir gut!

Der Hinweis mit dem Crop-Faktor, wäre auch zu überlegen. Dazu muss ich mir mal gedanken machen, wie ich das am Besten einbinden könnte!

Danke !!

Gruß,
Tobi

02.12.2011 - 19:15 Uhr

Hallo,

danke für den Hinweis!
Das war eine super Idee, welche ich sofort umgesetzt habe. Man sieht nun, mit welchen 3 Brennweiten am meisten gearbeitet wurde.
Eigentlich sollte es genau dafür gedacht sein. Man soll sehen, mit welcher Brennweite durchschnittlich und am meisten Fotografiert wurde.

Viel Spaß beim weiteren Testen!

Gruß,
Tobi

02.12.2011 - 11:35 Uhr

Hallo,

ich würd euch gern mal mein kleines Werk präsentieren...
Es handelt sich um ein Photoanalyse Tool, welches *.JPG und *.JPEG analysiert und somit die durchschnittliche genutzte Brennweite berechnet.
Ebenfalls wird angezeigt, welche 3 Brennweiten am häufigsten genutzt wurden.
Dabei kann unterschieden werden, ob dies über mehrere Kameramodelle oder über jedes Modell einzeln berechnet werden soll.

Ist vielleicht für die Fotografen unter euch interessant 😉
Geplant ist noch, dass auch die RAW-Files der verschiedenen Kameras analysiert werden können.

Würde mich über Meinungen / Kritik sehr freuen!

Die Software läuft ab Windows XP, mit .NET Framework 2.0.
Download

Viel Spaß und Grüße,
Tobi

11.11.2010 - 07:28 Uhr

Hallo,

ich bin zurzeit am Programmieren eines Outlook 2002 Addins.
Hierbei soll in den Termin-Dialog (zur Erfassung oder Änderung eines Termins, NICHT die Übersicht mit dem Kalender) ein Button in die Toolbar.
Leider weiß ich nicht, wie ich den Button hier reinbekomme...
(auf der Standard-Toolbar von Outlook funktioniert es bereits!)

In einem Outlook 2010 Addin konnte ich da einfach über den Inspector und dem CurrentItem prüfen, was zurzeit angezeigt wird und dann darauf reagieren.
Kann mir evtl. jemand nen Tipp geben, wie ich das auch bei Outlook 2002 hinbekomme?

Vielen Dank!

Gruß,
Tobias

22.09.2010 - 19:12 Uhr

Hi,

gibts hier im Forum Leute, die sich bei der Sharepoint-Konfiguration auskennen?
Es handelt sich um einen Sharepoint-Server 2007.
Ich hätte hierzu eine Frage:

Wir nutzen seit kurzem Sharepoint Server in unserem Unternehmen.
Dabei möchten wir auch das Sharepoint Blog-Modul nutzen.
Jetzt ist es so, dass es an und für sich läuft, jedoch kann links aus der Gruppe "Kategorie" nicht die Beiträge des Blogs der jeweiligen Kategorie angezeigt werden.
Hat jemand ne Idee, wie man sowas hinkriegen kann?

Ich hab auch bereits im Internet gesucht, und bin dabei auf eine Internetseite gestoßen, die zeigt, wie man nen Query Filter einbaut. Dies wollte ich ebenfalls probieren, doch ich kann zwischen dem Filter und dem Webpart für die Beiträge keine "Verbindung" herstellen, das das Kontextmenü bei mir nicht erscheint.

Ich hoffe, mir kann jemand weiterhelfen 😃

Gruß

26.08.2010 - 21:39 Uhr

Hmm, leider nichts in den Referenzen vorhanden...
Es ist so, dass bei Windows Windows.WindowsDeviceManager aufgerufen wird, und bei Unix HalClient.HalDeviceManager.
Ist ist wohl auch so, dass der Quellcode ursprünglich mit Mono entwickelt wurde...

Gibt es irgendwo das "Gegenstück" zu dem HalDeviceManager für Windows?

Danke!

Gruß,
Tobi

26.08.2010 - 12:01 Uhr

Hallo,

ich habe im Internet ein Stückchen Quellcode gefunden, in dem "Windows.WindowsDeviceManager" aufgerufen wird.

Jedoch werden hierbei nur folgende Verweise genutzt:

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Windows;

Woher kann das "Windows.WindowsDeviceManager" kommen? Hat dies von euch schonmal jemand gesehen?

Danke!

Gruß,
Tobi

24.08.2010 - 21:27 Uhr

Auf Manzana bin ich heute auch gestoßen und gleich getestet 😉
Ja, es funktioniert mit der neueren iTunes Version nicht mehr (nur mit iTunes 7)
Jedoch konnte man die Manzana lib soweit umschreiben 😉

Manzana ist jetzt für mich wohl die bessere Alternative...

24.08.2010 - 11:10 Uhr

Ja gut, CopyTrans ist schon eine gute Alternative, das kenn ich auch bereits.
Jedoch möchte ich gerne sowas gerne mal selbst programieren...

Ich möchte später, z.B. Musiktitel als Liste vom iPhone/iPod abrufen sowie auch Musik auf den iPod vom PC aus überspielen.

Die Bibliothek von SharePod ist schon ziemlich gut, jedoch möchte ich nicht für 300 Euro den Quellcode kaufen...

Wenn noch jemand Tips hat, immer raus damit 😃
Danke!

Gruß,
Tobi

24.08.2010 - 00:40 Uhr

Hi,

ich möchte gern in meiner C# Anwendung mein iPhone/iPod verbinden und die Musik-Titel abrufen.
Gibt es irgendwo Beispiel-Quellcode, wie ich sowas machen kann?
Dabei möchte ich nicht auf vorhandene libs zugreifen (ausser, sie sind frei verfügbar).
SharePodLib kenne ich bereits, jedoch hab ich hierbei keinerlei Einsicht in den Quelltext 😦

Danke!

Gruß,
Tobi

28.04.2010 - 12:05 Uhr

Hi,

ich versuche Outlook zu starten und direkt in den Kalender zu springen. Dies klappt auch bereits wunderbar. Jedoch möchte ich, dass wenn bereits Outlook geöffnet ist, diese Instanz sich öffnet und nicht jedes mal eine Neue gestartet wird.

Wie kann ich das am Besten lösen?

Bis jetzt habe ich folgenden Code:

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Runtime.InteropServices;

using Outlook = Microsoft.Office.Interop.Outlook;

namespace OutlookOpen
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Outlook.Application oApp = new Outlook.Application();
                Outlook.NameSpace oNS = oApp.GetNamespace("mapi");

                oNS.Logon(oNS.CurrentProfileName, null, false, false);
                
                Outlook.MAPIFolder oCalendar = oNS.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar);

                oCalendar.Display();
            }
            catch (Exception ex)
            {

            }
        }
    }
}

Vielen Dank!

Gruß,
Tobi

26.03.2010 - 18:26 Uhr

Könntest du auch etwas Quellcode zeigen? 😉

24.11.2009 - 17:36 Uhr

Hmm... kann es sein, dass es an dem Aufruf von initializeMonitor() liegt?
Da dies vor dem definieren der jeweiligen PictureBox passiert...
Setz doch mal das initializeMonitor() nach den beiden addCtrl()...

Gruß,
Tobi

20.11.2009 - 17:45 Uhr

Hmm...
wenn jemand Daten haben will, dann bekommt er diese auch...
Aber wenn man die Möglichkeiten hat, die Anzahl der Möglichkeiten des Datenklaus so weit wie möglich zu unterbinden, was spricht dagegen??
Jeder "normale" PC-Anwender schafft es mir Sicherheit nicht, über diese paar Fallen hinwegzukommen... alle anderen werden dafür auch einige Zeit brauchen...

Klar kann man mit nem Fotohandy auch Daten klauen... aber das ist dann nicht mehr Sache der Software, sondern eine Sache des Konzerns, dies in der Produktion zu verbieten.

just my 2 cents... =)

Gruß,
Tobi

20.11.2009 - 17:39 Uhr

Theoretisch könntest du auch noch als PK das aktuelle Datum als Zeitstemple hinzunehmen 😉
Zeitstempel sind als PK eigentlich nie geeignet 😉

In dem Fall aber durchaus denkbar 😉
Da eine PN ja auch immer ein Sendedatum hat 😉

Gruß,
Tobi

19.11.2009 - 18:39 Uhr

Theoretisch könntest du auch noch als PK das aktuelle Datum als Zeitstemple hinzunehmen 😉

Gruß,
Tobi

19.11.2009 - 18:36 Uhr

Ah, war meine Vermutung doch richtig 😃

Gruß,
Tobi

19.11.2009 - 18:33 Uhr

Hmm... vll mit einem zweiten, kleinen Programm im Hintergrund die Windows Messages für die Printtaste etc. abfangen und unterbinden?
Was passiert, wenn die Windows Zwischenablage deaktiviert ist? Kann man dann immer noch Screenshots machen?? 🤔

Gruß,
Tobi

19.11.2009 - 18:30 Uhr

Warum nutzt du nicht einfach GoogleMaps? Da hast du auch die Möglichkeit, dir auf Kartenausschnitte Overlays zu legen...

Gruß,
Tobi

19.11.2009 - 10:32 Uhr

Vielleicht sind diese ja keine "normalen" Events. Kommen diese nicht speziell vom Tastatur-Treiber? 🤔

Gruß,
Tobi

27.08.2009 - 10:37 Uhr

@herbivore:

Vielen Dank schomal für die Antwort!
D.h. also, dass ich im Endeffekt eine AGB habe, die ich z.B. auf meiner Homepage zugänglich mache aber ebenfalls über einen Drittanbieter, über den ich die Software anbiete ebenfalls zur verfügung stelle, richtig?

Ausserdem kann ich dann die selbe AGB anstelle der EULA in die Installation einbringen, oder?

Gruß,
Tobi

26.08.2009 - 18:55 Uhr

Hi,

da ich demnächst für meine Software (die ich verkaufen möchte) ein Setup-File erzeugen möchte, möchte ich darin auch eine EULA bzw. Lizenzvereinbarung einbinden. Jedoch weiß ich nicht so recht, was darin alles enthalten sein muss...

Gibt es vll irgendwo im Netz eine Vorlage, an der ich mich origientieren kann, oder kennt sich vll jemand von euch da besser damit aus?

Gruß,
Tobi

07.08.2009 - 17:00 Uhr

Warum schreibst du es nicht so?

Lizenzierung l = new Lizenzierung();
DialogResult dialogResult = l.ShowDialog()

if (dialogResult == DialogResult.OK)
{
     this.Close();
}

Damit wird von deinem Parentform das Form "Lizenzierung" aufgerufen und wenn in dem Form "Lizenzierung" ein Button auf "DialogResult.OK" reagiert, schließt sich Lizenzierung und dein Parentform...

Gruß,
Tobi

28.07.2009 - 18:49 Uhr

gefällt mir gut!
Ließt bei mir auch die Anzeige wunderbar aus 😉
Nur eines solltest du vll noch ändern 😉
Bei den Benutzern die Node "Plicht Passwort" -> "Pflicht Passwort" 😉

Gruß,
Tobi

27.07.2009 - 19:36 Uhr

sonst keiner ne Idee? 😦

Es hat den Anschein, als würde das erneute befüllen der ListView, an der letzten Markierung weitermachen ohne wieder an die obereste erste Stelle zu springen...
Und da die Scrollbar auch weg ist, komm ich nur wieder an die Items ran, wenn ich nach dem Löschen die Pfeil-Taste nach unten drücke... dann erscheinen diese wieder, werden allerdings dann nach der reihe alle erst gezeichnet...

Gruß,
Tobi

26.07.2009 - 14:47 Uhr

Nunja, am Laden der Items liegts nicht, da die einwandfrei geladen werden (hab mir die Anzal der geladenen Items ausgeben lassen)
Sonst würde er auch nicht die Items anzeigen, wenn ich von unten nach oben die Items markiere und dann lösche...

Gruß,
Tobi

26.07.2009 - 14:34 Uhr

Hi,

ich versuch mal mein Problem zu beschreiben:
Ich habe eine ListView, im VirtualMode = true. In der ListView kann ich derzeit ca. 20 Einträge sichtbar darstellen, für weitere muss man scrollen.
Desweiteren habe ich einen Filter, mit dem ich die verschiedenen Einträge in der ListView anzeigen lassen kann oder nicht.
D.h. es könnten ca. 100 Items existieren, wovon ich dann nur etwa 50 (durch auswahl des Filters) in der ListView anzeigen lasse.
Wenn ich jetzt nun die etwa 50 einträge in der ListView markiere und lösche, werden diese auch gelöscht - was auch soweit passt!
Wenn ich nun meinen Filter ändere, so das z.B. weitere 10 Items in der Listview erscheinen sollen, erscheinen diese aber nicht.

Dies passiert aber NUR, wenn ich in der ListView den ersten Eintrag ganz oben markiere und dann zum letzten runterscrolle um den letzen zu markieren.
Mache ich es umgekehrt, den letzten zuerst markeiren und dann nach oben scrollen um den ersten zu markieren, lösche dann und setze den Filter, werden die neuen Items in der ListView angezeigt.

Meine Vermutung ist nun, dass beim erneuten Laden der Items nach dem Löschvorgang nicht mehr an die erste Position des ListViews gesprugnen wird, sondern bleibt unten beim letzen markierten stehen...

Wie kann ich denn das umgehen, so dass meine Items wieder normal angezeigt werden?
Wie kann ich denn immer zum ersten Item springen?

Gruß,
Tobi

12.07.2009 - 22:26 Uhr

Hattest du nicht die "TypedTableBase" von der Umstellung auf .NET 2.0 rausgeschmissen? Deswegen kann er die auch nicht mehr finden!

Gruß,
Tobi

08.07.2009 - 18:30 Uhr

soweit komme ich leider nicht...
Die Anwendung beendet sich mit der Fehlermeldung - egal ob ich sie selber auswerfen lasse oder nicht...

Gruß,
Tobi

07.07.2009 - 22:15 Uhr

Hi,

ich steh grad vor nem kleinen Problem...
Ich habe mit Visual Studio 2008 eine Anwendung mit dem .NET Framework 2.0 entwickelt...
Auf den Rechnern, bei denen Visual Studio installiert ist, funktioniert die Software ohne Probleme...
Auf anderen, bei denen kein Visual Studio, jedoch das .NET Framework 2.0 installiert ist, nicht...
Es stürz bei irgendeinem Vorgang ab... es kommt auch eine Fehlermeldung, jedoch verschwindet die sofort mit dem Programm gleich wieder, so dass ich nicht mal lesen kann, um was es sich überhaupt handelt... nicht mal einen Screenshot kann ich davon machen.

Ich denke einfach, dass noch irgendwelche Systemdateien fehlen.
Wie kann ich jetzt rausfinden, welche Dateien mein Programm benötigt?

//Edit:
Hab grad rausgefunden, dass es anscheinend irgendwas auch mit Threading zu tun hat... wie kann das sein, dass es dann funktioniert, sobald ich auf dem selben Rechner Visual Studio 2008 installiere? xD

//Edit2:
Ich hab noch was rausgefunden...
Es liegt nun demnach an folgender Funktion:


private void SetPropertyThreadSafe<ControlType, PropertyType>(ControlType control, string propertyName, PropertyType value) where ControlType : Control
        {
            MessageBox.Show("test");
            if (control.InvokeRequired)
            {
                SetPropertyValueCallback<ControlType, PropertyType> cb = new SetPropertyValueCallback<ControlType, PropertyType>(SetPropertyThreadSafe);
                control.Invoke(cb, new object[] { control, propertyName, value });
            }
            else
            {
                System.Reflection.PropertyInfo property = control.GetType().GetProperty(propertyName);
                property.SetValue(control, value, null);
            }
        }

private delegate void SetPropertyValueCallback<ControlType, PropertyType>(ControlType control, string propertyName, PropertyType value) where ControlType : Control;

So wird die Funktion aufgerufen:


SetPropertyThreadSafe<meinPanelControl, bool>(myPanel, "Visible", true);

Wenn nun meine Anwendung aufgerufen und die SetPropertyThreadSafe ausführen lasse in einem Thread, wird die MessageBox mit der Nachricht "test" nicht ausgegeben...

//Edit 3:
Ok, es liegt eindeutig an der Funktion... wenn ich es wie folgt löse, funktioniert es xD


InvokeIfRequired(myPanel, (MethodInvoker)delegate()
{ myPanel.Visible = true });


private void InvokeIfRequired(Control target, Delegate methodToInvoke)
        {
            if (target.InvokeRequired)
            {
                target.Invoke(methodToInvoke);
            }
            else
            {
                methodToInvoke.DynamicInvoke();
            }
        }

Sieht vll jemand das Problem? 😦

Hab die Code-Beispiele aus den Dotnet-Snippets:
http://dotnet-snippets.de/dns/threadsicheres-zuweisen-von-control-eigenschaften-SID829.aspx

Danke und Gruß,
Tobi

20.06.2009 - 19:28 Uhr

Habs jetzt gelöst...
Ich prüfe nun, welches OS die Anwendung derzeit ausführt, und zeichne dann für Vista oder höher den entsprechenden Rahmen...

Gruß,
Tobi

18.06.2009 - 22:34 Uhr

Nunja, ich habe mir ein UserControl gebaut, das ein Image enthält sowie eine Textbox ohne Border. Sodass ich links eben eine Lupe habe und rechts dann die Textbox für die Eingabe... (da der Cursor neben dem Image sein soll.) nun soll noch das UserControl wie eine TextBox aussehen, da es in Vista leider nicht an die anderen "normalen" TextBoxen angepasst wird...
Man soll ja nicht gleich sehen, dass es sich um zwei unterschiedliche Komponenten handelt...

Das rechte Bild im ersten Post ist nur ein Fake 😉
Das linke unter Vista real 😉

Gruß,
Tobi

18.06.2009 - 22:23 Uhr

Hab jetzt mal nochmal bissl probiert und versucht, die BorderStyle-Eigenschaft einer Textbox auf das UserControl zu übertragen mit


this.BorderStyle = textbox.BorderStyle;

Hat auch soweit funktioniert...
D.h. der BorderStyle der Textbox ist standardmäßig bei Vista Fixed3D. Nach der Zuweisung war der BorderStyle des UserControls auch Fixed3D.
Jedoch sah der BorderStyle des UserControls nicht so aus, wie der der Textbox.

Wie kann ich nun dem UserControl den exakt den selben BorderStyle einer Textbox zuweisen, damit ich in XP und in Vista immer den OS-BorderStyle habe?

Gruß,
Tobi

17.06.2009 - 21:59 Uhr

Hat vll noch jemand ne Idee?
Habs immer noch nicht lösen können 😦

Gruß,
Tobi

09.06.2009 - 21:33 Uhr


>

Ist doch aber nur ein enum... Behandelt das OS doch sowieso wie es will 😉

ja, das hatte ich schon probiert 😃
Jedoch überschrieb Vista hierbei nicht den BorderStyle 😉
Ich habs auch mit dem VisualStyleRenderer getestet... klappte bei XP, jedoch nicht bei Vista xD

Gruß,
Tobi

09.06.2009 - 20:38 Uhr

Ich hab jetzt rausgefunden, dass ich an dem UserControl auch einen BorderStyle setzen kann. Jetzt müsste ich nur noch wissen, wie ich dem UserControl den selben BorderStyle wie dem einer TextBox geben kann...
Sodass Vista diese wie ne TextBox behandelt...

Gruß,
Tobi

09.06.2009 - 15:19 Uhr

Hallo,

ich habe mir mit Hilfe eines User-Controls eine eigene Komponente erstellt. Diese beinhaltet ein Image sowie eine TextBox. Um dieses UserControl zeichne ich auch einen Rahmen. (siehe auf dem Bild die erste Komponente)

Unter Windows XP passt das Design auch noch wunderbar 😉
Wenn ich nun aber zu Windows Vista wechseln möchte, passt das Design nun nicht mehr, da Vista mein Design von den Komponenten mit dem aus Vista komplett überschreibt... bis auf das meines UserControls...

Gibt es irgendwie ne Möglichkeit, dass ich mein UserControl so wie auf der rechten Seite des Bildes zu sehen anzupassen?
Sprich, den Rahmen an das Design von Vista anzupassen oder komm ich da ums auslesen des Betriebssystem sowie dem selberzeichnen nicht drum herum?

Gruß,
Tobi

07.06.2009 - 22:07 Uhr

Ich hatte mal das selbe Problem... Bei mir hat im Konstruktor das this.SetStyle dem Anschein nach gar nichts gebracht... aber so funktioniert es bei mir einwandfrei:


protected override void OnCreateControl()
        {
            base.OnCreateControl();

            this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint, true);
            this.DoubleBuffered = true;
        }

Gruß,
Tobi

28.05.2009 - 19:05 Uhr

Dazu gibt es schon einige Beiträge, z.B.:

Ah, super, danke 😃
Hab mir schon gedacht, dass ich das so nicht funktioniert 😉
Danke!

Gruß,
Tobi

28.05.2009 - 18:37 Uhr

Hallo,

ich wollt mal fragen, ob es denn möglich ist, dass ich vor dem eigentlichen Programmstart meines Programmes abfrage, ob das entsprechende Framework auf dem Rechner vorhanden ist, sodass ich in dem Fall, dass das Framework nicht vorhanden ist, eine Meldung ausgeben kann und das Programm nicht gleich anhand der Fehlermeldung von Windows abstürzt?

Gruß,
Tobi

28.04.2009 - 19:04 Uhr

Eigentlich gehört diese Zeile genau in den ctor.
Wie ist das Verhalten wenn du die Zeile komplett weg lässt?

nun ja, dann flackert es wieder!

@rollerfreak2:
ja, das funktioniert bei mir einwandfrei!
Im Konstruktor war die Zeile wie wenn sie nicht da wäre und ohne Wirkung... In der Funktion hingegen, funktioniert sie zu 100% wie sie soll 😉

Gruß,
Tobi

27.04.2009 - 22:05 Uhr

Habs nun lösen können!!
Das hier:


this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint | ControlStyles.Opaque | ControlStyles.ResizeRedraw, true);

durfte nicht in den Konstruktor, sondern ich hab das Event OnCreateControl überschrieben und darin diese Zeile reingepackt.
Jetzt flackert auch das Control nicht mehr, so wie es sein soll 😃

Gruß,
Tobi

23.04.2009 - 19:38 Uhr

Hab jetzt noch ein paar Sachen getestet von euch, jedoch ohne Erfolg... flackert immer noch 😦

Das dumme ist, dass ich auf ein Invalidate() ja nicht verzichten kann, da beim Ziehen des Forms (und somit beim vergrößeren und verkleinern des Panels) der Rahmen, den ich um das Panel zeichne, immer auf dem Panel gezeichnet wird, und das dann öfters hintereinander und nicht mehr verschwindet, solange ich ein Invalidate() ausführe.

Hab jetzt mal den Code so vereinfacht, wie herbivore es vorgeschlagen hat, jedoch immer noch ein flackern...


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
using System.Drawing;
using System.Drawing.Imaging;

namespace Komponenten
{
    public partial class myPanel : Panel
    {
        private string _strHeaderText = "";
        private Image _imageHeader;
        private Color _colorCorner = Color.FromArgb();
        private Color _colorHeaderBottom = Color.FromArgb();
        private Color _colorHeaderTop = Color.FromArgb();
        private Color _colorBackground = Color.FromArgb();
        private Color _colorHeaderText = Color.FromArgb();

        private SolidBrush _sBrushBack;
        private SolidBrush _sBrushHeader;
        private LinearGradientBrush _lnBrush;
        private Pen _penLine;
        private Font _font;

        //////////////////////////////////////////////////////////

        public myPanel()
        {
            this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint | ControlStyles.Opaque | ControlStyles.ResizeRedraw, true);
            this.UpdateStyles();
            this.DoubleBuffered = true;

            InitializeComponent();
        }

        public myPanel(IContainer container)
        {
            container.Add(this);

            InitializeComponent();
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;

            if (this._sBrushBack == null)
            {
                this._lnBrush = new LinearGradientBrush();
                this._sBrushBack = new SolidBrush(this._colorBackground);
                this._penLine = new Pen(this._colorCorner);
                this._font = new Font("Tahoma", 10.5f, FontStyle.Bold);
                this._sBrushHeader = new SolidBrush(this._colorHeaderText);
            }

            //Weißen Hintergund zeichnen
            e.Graphics.FillRectangle();

            //Header-Hintergrund zeichnen
            e.Graphics.FillRectangle();

            //Rahmen aussen rum zeichnen
            e.Graphics.DrawRectangle(this._penLine, 0, 0, this.Width - 1, this.Height - 1);

            //Linie unter Header zeichnen
            e.Graphics.DrawLine();

            //Header-Text schreiben
            if (this._imageHeader != null)
                e.Graphics.DrawString();
            else
                e.Graphics.DrawString();

            //Header-Image zeichnen
            if (this._imageHeader != null)
                if (this._imageHeader.Height > 18 || this._imageHeader.Width > 18)
                    e.Graphics.DrawImage(this._imageHeader, new Rectangle(8, (29 - 16) / 2, 16, 16));
                else
                    e.Graphics.DrawImage(this._imageHeader, 8, (29 - this._imageHeader.Height) / 2);
        }
    }
}

Gruß,
Tobi

22.04.2009 - 19:36 Uhr

Hab etzt mal folgendes noch in meinen Konstruktor des Panels aufgenommen:


this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint | ControlStyles.Opaque | ControlStyles.ResizeRedraw, true);
            this.DoubleBuffered = true;

Ich habe auch nun beim Form.Resize die Invalidate's auf die Panels rausgenommen.
Jetzt ist es so, dass die Panels zwar nicht mehr flackern, jedoch wird das Panel nicht mehr neu gezeichnet (hat dann die Linien des Forms auf dem Panel, die durch das Ziehen entstehen)

Hier noch mein onPaint-Event des Panels (etwas vereinfacht dargestellt):


protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;

            e.Graphics.FillRectangle();

            using (LinearGradientBrush linGrBrush = new LinearGradientBrush()
                e.Graphics.FillRectangle();

            using (Pen p = new Pen(this._colorCorner))
                e.Graphics.DrawRectangle();

            using (Pen p = new Pen(this._colorCorner))
                e.Graphics.DrawLine();

            using (Font font = new Font("Tahoma", 10.5f, FontStyle.Bold))
                if (this._imageHeader != null)
                    e.Graphics.DrawString();
                else
                    e.Graphics.DrawString();

            if (this._imageHeader != null)
                if (this._imageHeader.Height > 18 || this._imageHeader.Width > 18)
                    e.Graphics.DrawImage(this._imageHeader, new Rectangle(8, (29 - 16) / 2, 16, 16));
                else
                    e.Graphics.DrawImage(this._imageHeader, 8, (29 - this._imageHeader.Height) / 2);
        }

Kann es vll sein, dass es auch beim Invalidate so lange dauert, weil ich immer gleich zeichne mit e.Graphics.Draw...?
Sollte ich vll besser zuerst alles in ein neues Graphics-Objekt zeichnen und dann am Ende erst auf das Panel zeichnen?

Gruß,
Tobi

22.04.2009 - 09:16 Uhr

Ok, das werde ich heute Abend gleich testen und dann bescheid geben, ob es funktioniert hat oder nicht 😉
Danke schonmal für eure Hilfe 😃

Gruß,
Tobi

22.04.2009 - 08:40 Uhr

Ja, das habe ich auch verwendet. Ich habe auch UserPaint, OptimizedDoubleBuffered verwendet (auch zusammen), nur leider ohne sehenswerte Besserung 😉

D.h., ich rechne mir aus, welchen Bereich ich auf meinem Panel neuzeichnen muss, und den lasse ich dann mit Invalidate mit den Parametern neuzeichnen?

Gruß,
Tobi

22.04.2009 - 08:07 Uhr

Ja, ich habe den DoubleBuffer bei den selbstgezeichneten Controls angewendet (und sogar auf der Form selber auch).

Den Eintrag über die Flackernden Controls, kenne ich und habe da schon alles durchprobiert was es gibt 😉 Jedoch immer der selbe flackernde Effekt.

Invalidate nutze ich beim Resize, damit ich in meinen Controls nicht die Linien bein Ziehen von der Form in den Controls habe.
Im Paint selbst nutze ich kein Invalidate und die Zeichenroutinen sollten jetzt auch nicht zu aufwendig sein... im Endeffekt zeichne ich nur ein Panel, bei dem ich die Ränder, einen Hintergrund sowie einen kleinen Header zeichne. Und das ohne irgendwelche BMP's oder sonstige Bilder.

@vbprogger: ich werde das mal testen von dir! Danke!

Gruß,
Tobi

21.04.2009 - 22:39 Uhr

Hallo,

vielleicht hilft Control.SuspendLayout davor und .ResumeLayout danach.

Hab ich auch bereits getestet... Hilft leider auch nicht.

Gruß,
Tobi

21.04.2009 - 22:28 Uhr

Hi,

da ich nun nach ein paar Stunden testen und probieren leider nicht mehr weiterweiß, finde ich vll bei euch noch einige Tipps.

Mein folgendes Problem:
Ich habe auch meiner Form einige Controls, ListView, Panel und ImageButtons (die ich alle 3 selber zeichne).
In dem Event Form.Resize hab ich einen Funktionsaufruf, der die Positionen und größen der Komponenten berechnet und dann evtl. vergrößert und die ImageButtons neu anordnet (ImageButton.Location).
Desweiteren führe ich in Form.Resize ein Invalide der Komponenten aus, so dass sie auch neugezeichnet werden.

Wenn ich nun die Form vergrößere oder verkleinere, flackern meine selbstgezeichneten Komponenten. Die ImageButtons verschwinden teilweise ganz...
Meine CPU steigt beim Ziehen des Forms auch auf ~95%.

Ich hab auch schon die ganzen Methoden, die dem Flackern entgegenwirken (DoubleBuffer, ControlStyles) in die Controls sowie auch mal in meine Form in den Konstruktor eingefügt, jedoch hat sich hier nichts am Flackern verändert.

Kann ich das Flackern noch irgendwie beim ziehen des Forms noch wegkriegen oder muss ich mich damit zufrieden geben?

Besten Dank schonmal!

Gruß,
Tobi

19.04.2009 - 17:17 Uhr

Danke für den Tipp mit Connect von Microsoft.
Da hab ich eben mal nach dem Bug von mir gesucht und siehe da, sogar was gefunden:
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=97027

Hab nun das Problem mit dem Ticket von Microsoft beheben können.
Ich muss zusätzlich zu SelectedIndexChanged noch auf das Event VirtualItemsSelectionRangeChanged (funktioniert aber nur, wenn VirtualMode auf true gesetzt ist!!) reagieren, damit er auch die Aktionen mit der Taste Umschalt + Klick richtig ausgibt.

Gruß,
Tobi