JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=8ea3d6776e7f6514d6985e426ed70f81Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

[C#] Probleme nach Änderung der Fenstergröße

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
valentin_
Mini JLI'ler


Alter: 34
Anmeldedatum: 16.07.2006
Beiträge: 28
Wohnort: Graz
Medaillen: Keine

BeitragVerfasst am: 23.02.2008, 18:01    Titel: [C#] Probleme nach Änderung der Fenstergröße Antworten mit Zitat

in meinem Programm kann der Anwender per Drag'n'Drop Datein auf das Fenster ziehen. Für jede Datei wird Dynamisch eine pictureBox erzeugt und dort dann das Icon der Datei angezeigt. Die pictureBox wird auf eine TabPage erzeugt. Zu Beginn gibts nur ein leeres TabControl. Die TabPages werden auch dynamisch erzeugt. Das Fenster( und natürlich das TabControl per Anchor) sollen sich vergrößern, wenn mehr Icons angezeigt werden.

Ich verwende dafür folgenden Code

CPP:
if ((tempPictureBox.Location.X + SizeOfIcon) > tempTabPage.Parent.Parent.Width)
{
    tempTabPage.Parent.Parent.Width += SizeOfIcon;
}




Das ganze funktionert auch ganz gut. Nur danach funktioniert nichs mehr und es hängt. Es braucht dann ca. 30 Sekunden um auf eine andere TabPage umzuschalten.

Wenn ich das Fenster von haus aus groß genug aufziehe gibt es überhaupt keine Probleme!!

Bitte helft mir!! Ich kann mir dieses verhalten nicht erklären!!

LG valentin_
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 23.02.2008, 20:28    Titel: Antworten mit Zitat

Wenn man die tabPages umschaltet werden in denen dann bei bedarf auch PictureBoxen und so weiter erstellt? Und bei jeder Picturebox die erstellt wird, wird ebenfalls die Grösse der page neu berechnet gell?

Dann würde ich sagen das erstmal das erstellen enorm viel zeit kostet bei vielen Elementen.

Aber am besten versorgst du uns mit noch mehr Informationen, aktuell muss zumindest ich mir noch vieles selbst ausmalen Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
valentin_
Mini JLI'ler


Alter: 34
Anmeldedatum: 16.07.2006
Beiträge: 28
Wohnort: Graz
Medaillen: Keine

BeitragVerfasst am: 24.02.2008, 07:23    Titel: Antworten mit Zitat

auch wenn ich nur eine Tabpage habe treten die Probleme auf.
Die PictureBoxen werden erzeugt, sobald man eine Datei auf die TabPage zieht und dann wird die Fenstergröße neu Berechnet.
Wenn das Fenster zu Beginn Platz für 2 Elemente hat kommen die Probleme ab dem 3. Element. Wenn aber schon Platz für 10 Elemente am Anfang sind hängt es ab dem 11! Also sobald ich die Fenstergröße ändere.

Mit dieser Funktion erzeuge ich die PictureBoxen:

CPP:
private void createPicBoxes(string filePath)
{      
   PictureBox tempPictureBox = new PictureBox();

   PicBoxCount++;

   //Properties
   tempPictureBox.Name = PicBoxCount.ToString();
   tempPictureBox.Size = new Size(SizeOfIcon, SizeOfIcon);
   tempPictureBox.BorderStyle = BorderStyle.None;
   tempPictureBox.Location = new Point(3 + SizeOfIcon * PicBoxCount, 3);
   tempPictureBox.TabStop = false;
   tempPictureBox.SizeMode = PictureBoxSizeMode.CenterImage;
   tempPictureBox.Image = createPic(filePath,SizeOfIcon);
   
   //Fenstergröße anpassen
   if ((tempPictureBox.Location.X + SizeOfIcon) > tempTabPage.Parent.Parent.Width)
   {
      tempTabPage.Parent.Parent.Width += SizeOfIcon;
   }
   
   // Eventhandler anmelden:
   tempPictureBox.Click += pb_Click;
   tempPictureBox.MouseEnter += pb_MouseEnter;
   tempPictureBox.MouseLeave += pb_MouseLeave;

   //Controls hinzufügen
   tempTabPage.Controls.Add(tempPictureBox);
}   




Ich verstehs einfach nicht ... Sad
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 24.02.2008, 09:14    Titel: Antworten mit Zitat

Klappt doch ganz wunderbar:

CPP:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using WindowsFormsApplication1.NativeWin32;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private int m_nCount;

        public Form1()
        {
            InitializeComponent();
        }

        private void tabPage1_DragDrop(object sender, DragEventArgs e)
        {
            string[] data = e.Data.GetData( DataFormats.FileDrop ) as string[];

            foreach ( string file in data )
            {
                CreateNewEntry( file, tabPage1, this, ref m_nCount );
            }
        }

        private void tabPage1_DragEnter(object sender, DragEventArgs e)
        {
            e.Effect = e.Data.GetDataPresent( DataFormats.FileDrop, false ) ? DragDropEffects.All : DragDropEffects.None;
        }

        private void CreateNewEntry( string filename, Control parent, Form parentWindow, ref int index )
        {
            System.Drawing.Icon icon = null;
            SHFILEINFO info = new SHFILEINFO();

            if ( NativeWin32.Shell32.SHGetFileInfo( filename, 0, out info, ( uint )Marshal.SizeOf( info ), NativeWin32.Shell32.SHGFI_USEFILEATTRIBUTES | NativeWin32.Shell32.SHGFI_ICON | NativeWin32.Shell32.SHGFI_LARGEICON ) != 0 )
            {
                icon = Icon.FromHandle( info.hIcon );
            }
            else
                icon = ( Icon )Icon.Clone(); // default icon :-)))

            PictureBox box = new PictureBox();

            int posx = icon.Width * index;

            if ( posx + icon.Width > parent.Width )
            {
                int newWidth = parentWindow.Width + ( ( posx - parent.Width ) + 2 * icon.Width );
                newWidth -= newWidth % icon.Width;
                parentWindow.SetBounds( parentWindow.Location.X, parentWindow.Location.Y, newWidth, parentWindow.Height );
                parentWindow.Refresh();
            }

            box.Name = string.Format( "pcb_{0}", index++ );
            box.Size = new Size( icon.Width, icon.Height );
            box.Image = icon.ToBitmap();
            box.Location = new Point( posx, 0 );

            parent.Controls.Add( box );
        }
    }

    namespace NativeWin32
    {
        [ StructLayout( LayoutKind.Sequential, CharSet =CharSet.Auto ) ]
        public struct SHFILEINFO
        {
            public IntPtr hIcon;
            public int iIcon;
            public uint dwAttributes;
            [ MarshalAs( UnmanagedType.ByValTStr, SizeConst = 260 ) ]
            public string szDisplayName;
            [ MarshalAs( UnmanagedType.ByValTStr, SizeConst = 80 ) ]
            public string szTypeName;
        }

        public static class Shell32
        {
            public static readonly uint SHGFI_LARGEICON = 0x00000000;
            public static readonly uint SHGFI_SMALLICON = 0x00000001;
            public static readonly uint SHGFI_ICON = 0x00000100;
            public static readonly uint SHGFI_USEFILEATTRIBUTES = 0x00000010;

            [ DllImport( "shell32.dll", CharSet=CharSet.Auto ) ]
            public static extern int SHGetFileInfo( string pszPath, uint dwFileAttributes, out SHFILEINFO psfi, uint cbFileInfo, uint uFlags );
        }
    }
}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
valentin_
Mini JLI'ler


Alter: 34
Anmeldedatum: 16.07.2006
Beiträge: 28
Wohnort: Graz
Medaillen: Keine

BeitragVerfasst am: 24.02.2008, 13:30    Titel: Antworten mit Zitat

Ich hab deinen Code getestet und er hat super funktioniert. Dann Hab ich deinen Code bei mir eingebaut und ... es gab wieder die gleichen Probleme!!

Dann hab ich mal auf die Unterschiede geachtet. Ich hab bei meinem Fenster die Hindergrundfarbe und den TransperencyKey geändert gehabt. Als ich dann diese beiden Einstellungen auf die Default-Einstellungen gesetzt habe hat alles super funktioniert, auch mit meinem Code!

Versteht das irgendwer?!?!?! Rolling Eyes
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 24.02.2008, 16:32    Titel: Antworten mit Zitat

Vielleicht landet das Programm irgendwie in einer Endlosschleife, beim Zeichnen. Oder der Zeichenaufwand ist durch das Colorkeying gestiegen und drückt die Performanz.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum