|
JLI Spieleprogrammierung
|
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
|
Verfasst am: 23.02.2008, 18:01 Titel: [C#] Probleme nach Änderung der Fenstergröße |
|
|
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 |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 23.02.2008, 20:28 Titel: |
|
|
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 |
|
Nach oben |
|
|
valentin_ Mini JLI'ler
Alter: 34 Anmeldedatum: 16.07.2006 Beiträge: 28 Wohnort: Graz Medaillen: Keine
|
Verfasst am: 24.02.2008, 07:23 Titel: |
|
|
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 ... |
|
Nach oben |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 24.02.2008, 09:14 Titel: |
|
|
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 |
|
|
valentin_ Mini JLI'ler
Alter: 34 Anmeldedatum: 16.07.2006 Beiträge: 28 Wohnort: Graz Medaillen: Keine
|
Verfasst am: 24.02.2008, 13:30 Titel: |
|
|
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?!?!?! |
|
Nach oben |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 24.02.2008, 16:32 Titel: |
|
|
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 |
|
|
|
|
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
|