PDA

View Full Version : حرفه ای: لود اهسته فرم و کنترل ها در صورت استفاده عکس در انها



ahmadi.edu
شنبه 21 اسفند 1389, 17:10 عصر
سلام به همه دوستانی که زحمت میکشن ، لطف میکنن و اطلاعاتشون رو در اختیار دیگران قرار میدن.
من یه فرم اصلی داخل برنامم دارم که تعدادی عکس داخلش هست مثلا کوچیک و بزرگ کردن وبستن فرم رو خودم بصورت عکس تو بخش عنوان فرم گذاشتم، و چندتا دیگه عکس هم تو عنوان و جاهای دیگر فرم گذاشتم، خلاصه اینکه فرم کاملا دست سازه، بعد فرمهای دیگر من از این فرم ارث میبرن.
زمانی که من فرمهای دیگر رو لود میکنم تمام عکس ها و کنترل ها یکی یکی ویواش یواش نمایش داده میشن نه خیلی یواش ولی فرم نرم لود نمیشه انگار و کاملا محسوسه. هرکس میتونه کمک کنه، بسم الله.
فکر کنم بدرد بقیه هم بخوره.

hamidsolat
شنبه 21 اسفند 1389, 22:01 عصر
سوالت کمی مبهمه، ولی فکر میکنم که شما میخواهید فرم رو از وضوح کم به وضوح کامل نشون بدید که از کد زیر میتونید استفاده کنید

this.Opacity = 0;
while (this.Opacity != 1.0)
{
this.Opacity += .05;

}

m.soleimani
شنبه 21 اسفند 1389, 23:34 عصر
سلام به همه دوستانی که زحمت میکشن ، لطف میکنن و اطلاعاتشون رو در اختیار دیگران قرار میدن.
من یه فرم اصلی داخل برنامم دارم که تعدادی عکس داخلش هست مثلا کوچیک و بزرگ کردن وبستن فرم رو خودم بصورت عکس تو بخش عنوان فرم گذاشتم، و چندتا دیگه عکس هم تو عنوان و جاهای دیگر فرم گذاشتم، خلاصه اینکه فرم کاملا دست سازه، بعد فرمهای دیگر من از این فرم ارث میبرن.
زمانی که من فرمهای دیگر رو لود میکنم تمام عکس ها و کنترل ها یکی یکی ویواش یواش نمایش داده میشن نه خیلی یواش ولی فرم نرم لود نمیشه انگار و کاملا محسوسه. هرکس میتونه کمک کنه، بسم الله.
فکر کنم بدرد بقیه هم بخوره.

شما قرار نیست برنامه نمایش عکس داشته باشی که تصاویر رو با کیفیت بالا داخلش قرار میدی توی فتوشاپ یا هر نرم‌افزار دیگه کیفیت تصاویرت رو پایین بیار یا اگر برای مثال پسوندش bmp هست اون رو به gif یا jpeg تغییر بده تا با همون کیفیت و با حجم بسیار کمتر برات ذخیره بشه در ضمن فرم یه گزینه به نام DoubleBuffered هم داره که می‌تونی مقدار true رو بهش بدی موفق باشی./

ahmadi.edu
یک شنبه 22 اسفند 1389, 10:17 صبح
من تصاویر رو با کیفیت بالا قرار نمیدم، همه پسوندها Png هستن، البته اینم کیفیتش بالاست ولی مجبورم ،چون عکس هام باید پشت زمینه نداشته باشن یعنی Transparent باشن، از DoubleBuffered استفاده نکردم استفاده میکنم ببینم جواب میده یا نه.
ولی کلا خیلی پیش میاد در یک فرم اگه از عکس ها ی زیاد استفاده کنیم، اون فرم اهسته لود میشه.
.
.
.
.
.
.
DoubleBuffered هم جواب نمیده.

ahmadi.edu
یک شنبه 22 اسفند 1389, 10:24 صبح
سوالت کمی مبهمه، ولی فکر میکنم که شما میخواهید فرم رو از وضوح کم به وضوح کامل نشون بدید که از کد زیر میتونید استفاده کنید
نه ، همچین کاری نمیخوام بکنم.شما فکر کن من یک فرم رو باز میکنم و فرم اهسته لود میشه یعنی محسوسه که عکس هاش یکی یکی نمایش داده میشن، این لود اهسته هم فقط بخاطر استفاده از عکس داخل فرم و کنترل هاست.

exlord
یک شنبه 22 اسفند 1389, 11:33 صبح
سلام به همه دوستانی که زحمت میکشن ، لطف میکنن و اطلاعاتشون رو در اختیار دیگران قرار میدن.
من یه فرم اصلی داخل برنامم دارم که تعدادی عکس داخلش هست مثلا کوچیک و بزرگ کردن وبستن فرم رو خودم بصورت عکس تو بخش عنوان فرم گذاشتم، و چندتا دیگه عکس هم تو عنوان و جاهای دیگر فرم گذاشتم، خلاصه اینکه فرم کاملا دست سازه، بعد فرمهای دیگر من از این فرم ارث میبرن.
زمانی که من فرمهای دیگر رو لود میکنم تمام عکس ها و کنترل ها یکی یکی ویواش یواش نمایش داده میشن نه خیلی یواش ولی فرم نرم لود نمیشه انگار و کاملا محسوسه. هرکس میتونه کمک کنه، بسم الله.
فکر کنم بدرد بقیه هم بخوره.
اگه میتونی کد های فرمتو بزار یه نگاهی بندازم ...

ahmadi.edu
یک شنبه 22 اسفند 1389, 11:39 صبح
اگه میتونی کد های فرمتو بزار یه نگاهی بندازم ...
ّبرادر فکر نمیکنم و تقریبا 99% مطمئنم که ربطی به کدهام نداره کلا C# این مشکل رو داره که اگه تو یک فرم از چندتا عکس استفاده کنی فرم دیر باز بشه میخواستم ببینم راه حلی داره یا نه.
ولی بازم کدهای داخل فرمم رو میذارم که دوستان اگه خواستن یه نگاهی بکنن.
public partial class frmSkin : Form
{
public frmSkin()
{
InitializeComponent();
}
[DllImport("Gdi32.dll", EntryPoint = "CreateRoundRectRgn")]

public static extern IntPtr CreateRoundRectRgn
(
int nLeftRect, // x-coordinate of upper-left corner
int nTopRect, // y-coordinate of upper-left corner
int nRightRect, // x-coordinate of lower-right corner
int nBottomRect, // y-coordinate of lower-right corner
int nWidthEllipse, // height of ellipse
int nHeightEllipse // width of ellipse
);
public override Color BackColor
{
get
{
return base.BackColor;
}
set
{
base.BackColor = value;
backColor = BackColor;
}
}
public static Color backColor;
private void pictureBox_MouseEnter(object sender, EventArgs e)
{
PictureBox Temp = (PictureBox)sender;
switch (Temp.Name)
{
case "pictureBoxClose": pictureBoxClose.Image = global::EtahaClient.Properties.Resources.close_ove r;
break;
case "pictureBoxMax": pictureBoxMax.Image = global::EtahaClient.Properties.Resources.max_over;
break;
case "pictureBoxMin": pictureBoxMin.Image = global::EtahaClient.Properties.Resources.min_over;
break;
}
}

private void pictureBox_MouseLeave(object sender, EventArgs e)
{
PictureBox Temp = (PictureBox)sender;
switch (Temp.Name)
{
case "pictureBoxClose": pictureBoxClose.Image = global::EtahaClient.Properties.Resources.Close1;
break;
case "pictureBoxMax": pictureBoxMax.Image = global::EtahaClient.Properties.Resources.max;
break;
case "pictureBoxMin": pictureBoxMin.Image = global::EtahaClient.Properties.Resources.min;
break;
}
}

private void pictureBox_MouseDown(object sender, MouseEventArgs e)
{
PictureBox Temp = (PictureBox)sender;
switch (Temp.Name)
{
case "pictureBoxClose": pictureBoxClose.Image = global::EtahaClient.Properties.Resources.close_dow n;
this.Close();
break;
case "pictureBoxMax": pictureBoxMax.Image = global::EtahaClient.Properties.Resources.max_down;
{
if (WindowState == FormWindowState.Maximized)
WindowState = FormWindowState.Normal;
else
{
this.WindowState = FormWindowState.Maximized;
this.Size = this.MaximumSize;
}
}
break;
case "pictureBoxMin": pictureBoxMin.Image = global::EtahaClient.Properties.Resources.min_down;
this.WindowState = FormWindowState.Minimized;
break;
}
}

private void pictureBox_MouseUp(object sender, MouseEventArgs e)
{
PictureBox Temp = (PictureBox)sender;
switch (Temp.Name)
{
case "pictureBoxClose": pictureBoxClose.Image = global::EtahaClient.Properties.Resources.Close1;
break;
case "pictureBoxMax": pictureBoxMax.Image = global::EtahaClient.Properties.Resources.max;
break;
case "pictureBoxMin": pictureBoxMin.Image = global::EtahaClient.Properties.Resources.min;
break;
}
}
const int HT_CAPTION = 0x2;
const int WM_NCLBUTTONDOWN = 0xA1;

[DllImportAttribute("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[DllImportAttribute("user32.dll")]
public static extern bool ReleaseCapture();
private void frmSkin_Load(object sender, EventArgs e)
{
//GeneralSendRecieve.CurrentColor = cl_ModifyRegistry.Read("CurrentColor");
//if (GeneralSendRecieve.CurrentColor == "")
// GeneralSendRecieve.CurrentColor = "156, 221, 244";
//switch (GeneralSendRecieve.CurrentStyle)
//{
// case "Back_New1":
// GeneralSendRecieve.frmSkinForm.BackgroundImage = global::EtahaClient.Properties.Resources.back_new1 ;
// break;
// case "Back_New2":
// GeneralSendRecieve.frmSkinForm.BackgroundImage = global::EtahaClient.Properties.Resources.back_new2 ;
// break;
// case "Back_New3":
// GeneralSendRecieve.frmSkinForm.BackgroundImage = global::EtahaClient.Properties.Resources.back_new3 ;
// break;
//}
BackColor = Color.FromArgb(int.Parse(GeneralSendRecieve.Curren tColor.Trim().Split(',')[0]), int.Parse(GeneralSendRecieve.CurrentColor.Trim().S plit(',')[1]), int.Parse(GeneralSendRecieve.CurrentColor.Trim().S plit(',')[2]));
pictureBoxMax.Enabled = MaximizeBox;
pictureBoxMin.Enabled = MinimizeBox;

}
public void ChangeControlBackColor(Button b)
{
b.DataBindings.Add("BackColor", this, "BackColor");
}
public void SetFormSkin(Form frm)
{
frm.DataBindings.Add("BackColor", GeneralSendRecieve.frmSkinForm, "BackColor");
frm.DataBindings.Add("BackgroundImage", GeneralSendRecieve.frmSkinForm, "BackgroundImage");
}
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
SendMessage(this.Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
ReleaseCapture();
}
}

private void frmSkin_Paint(object sender, PaintEventArgs e)
{

}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Rectangle rectBar = new Rectangle();
rectBar = this.Bounds;
GraphicsPath path = null;
Pen p = new Pen(Color.FromArgb(128, 127, 250));
// Pen p = new Pen(Color.FromArgb(int.Parse(GeneralSendRecieve.Cu rrentBorder.Split(',')[0]), int.Parse(GeneralSendRecieve.CurrentBorder.Split(' ,')[1]), int.Parse(GeneralSendRecieve.CurrentBorder.Split(' ,')[2])));
path = Create(0, 0, rectBar.Width - 2, rectBar.Height - 2, 10);
e.Graphics.DrawPath(p, path);
p = new Pen(Color.White);
path = Create(1, 1, rectBar.Width - 4, rectBar.Height - 4, 9);
e.Graphics.DrawPath(p, path);
e.Graphics.SetClip(path);
e.Graphics.ResetClip();
}
private void panel2_Paint(object sender, PaintEventArgs e)
{

}
public enum RectangleCorners
{
None = 0, TopLeft = 1, TopRight = 2, BottomLeft = 4, BottomRight = 8,
All = TopLeft | TopRight | BottomLeft | BottomRight
}

public static GraphicsPath Create(int x, int y, int width, int height,
int radius, RectangleCorners corners)
{
int xw = x + width;
int yh = y + height;
int xwr = xw - radius;
int yhr = yh - radius;
int xr = x + radius;
int yr = y + radius;
int r2 = radius * 2;
int xwr2 = xw - r2;
int yhr2 = yh - r2;

GraphicsPath p = new GraphicsPath();
p.StartFigure();

//Top Left Corner
if ((RectangleCorners.TopLeft & corners) == RectangleCorners.TopLeft)
{
p.AddArc(x, y, r2, r2, 180, 90);
}
else
{
p.AddLine(x, yr, x, y);
p.AddLine(x, y, xr, y);
}

//Top Edge
p.AddLine(xr, y, xwr, y);

//Top Right Corner
if ((RectangleCorners.TopRight & corners) == RectangleCorners.TopRight)
{
p.AddArc(xwr2, y, r2, r2, 270, 90);
}
else
{
p.AddLine(xwr, y, xw, y);
p.AddLine(xw, y, xw, yr);
}

//Right Edge
p.AddLine(xw, yr, xw, yhr);

//Bottom Right Corner
if ((RectangleCorners.BottomRight & corners) == RectangleCorners.BottomRight)
{
p.AddArc(xwr2, yhr2, r2, r2, 0, 90);
}
else
{
p.AddLine(xw, yhr, xw, yh);
p.AddLine(xw, yh, xwr, yh);
}

//Bottom Edge
p.AddLine(xwr, yh, xr, yh);

//Bottom Left Corner
if ((RectangleCorners.BottomLeft & corners) == RectangleCorners.BottomLeft)
{
p.AddArc(x, yhr2, r2, r2, 90, 90);
}
else
{
p.AddLine(xr, yh, x, yh);
p.AddLine(x, yh, x, yhr);
}

//Left Edge
p.AddLine(x, yhr, x, yr);

p.CloseFigure();
return p;
}

public static GraphicsPath Create(Rectangle rect, int radius, RectangleCorners c)
{ return Create(rect.X, rect.Y, rect.Width, rect.Height, radius, c); }

public static GraphicsPath Create(int x, int y, int width, int height, int radius)
{ return Create(x, y, width, height, radius, RectangleCorners.All); }

public static GraphicsPath Create(Rectangle rect, int radius)
{ return Create(rect.X, rect.Y, rect.Width, rect.Height, radius); }

public static GraphicsPath Create(int x, int y, int width, int height)
{ return Create(x, y, width, height, 5); }

public static GraphicsPath Create(Rectangle rect)
{ return Create(rect.X, rect.Y, rect.Width, rect.Height); }

private void pictureBoxMax_Click(object sender, EventArgs e)
{

}
}

exlord
یک شنبه 22 اسفند 1389, 14:35 عصر
ّبرادر فکر نمیکنم و تقریبا 99% مطمئنم که ربطی به کدهام نداره کلا C# این مشکل رو داره که اگه تو یک فرم از چندتا عکس استفاده کنی فرم دیر باز بشه میخواستم ببینم راه حلی داره یا نه.
ولی بازم کدهای داخل فرمم رو میذارم که دوستان اگه خواستن یه نگاهی بکنن.

نمیدونم خواهری یا برادر پس هموطن من کد هات مشکل داره
نونمه کد فقط مخصوصه خودت نوشتم .... بخون اگه مشکلاتتو متوجه نشدی بگو توضیح بدم ...

ahmadi.edu
دوشنبه 23 اسفند 1389, 08:13 صبح
نمیدونم خواهری یا برادر پس هموطن من کد هات مشکل داره
نونمه کد فقط مخصوصه خودت نوشتم .... بخون اگه مشکلاتتو متوجه نشدی بگو توضیح بدم ...
ممنون از زحمتی که کشیدی و وقت گذاشتی و کدها رو بهینه کردی.
اما چند نکته اول اینکه من نتونستم پروژه رو باز کنم و فقط کدهاش رو دیدم و اجرا کردم
2 - من فرق محسوسی بین کدهای خودم وشما که بخواد سرعت لود فرم رو افزایش یا کاهش بده پیدا نکردم شاید کار شما اصولی تر باشه و شیءگرایی ، بیشتر توش رعایت شده باشه اما سرعت رو نه.
3 - نگاه کن اصلا بحث من فقط سر عکس نیست شما اگه کنترل های زیادی داشته باشی و داخل اونها هنگام لود فرم دیتا بریزی فرم نرم باز نمیشه.
4 - من تو پنلم که بعنوان هدر است عکس دارم و فرم های دیگه من که از فرم اصلی ارث میبرن انقدر ساده نیستن یه سری اطلاعات اینور و اونور میکنن.
ضمنا شما یه کم کدهای منو کچل کردی، تو کدهای شما من دیگه نمیتونم برای فرمم Border بذارم و ضخامت و رنگش رو تعیین کنم، و اینکه برای جابجا کردن فرم فکر نمیکنم کدهای شما بهتر از چیزی باشه که من نوشتم.

gama118
دوشنبه 23 اسفند 1389, 09:44 صبح
منم اين مشكل رو دارم با اينكه فقط چند تا دكمه دارم كه توش آيكن استفاده كردم ولي باز فرم نرم باز ميشه !!!!

exlord
دوشنبه 23 اسفند 1389, 18:44 عصر
شما اومدین توی اونت Paint آبجکت های جدید ساختین از اونجایی که اونت Paint خیلی زیاد اجرا میشه این کارتون باعث کند شدن اجراش میشه ...
توی خیلی از اونایی که تازه دارن با paint کار میکنن دیدم که چون فکر میکنن paint فقط 1 بار اجرا میشه ... مثل یه متد معمولی باهاش رفتار میکنن و همه object هاشونو اونتو میسازن ...

Rectangle rectBar = new Rectangle();
rectBar = this.Bounds;
GraphicsPath path = null; // in 3 khate balayi aslan lazem nist
Pen p = new Pen(Color.FromArgb(128, 127, 250)); // pen nabayd inja sakhte beshe tu form besazin va inja fagat estefade konin
path = Create(0, 0, rectBar.Width - 2, rectBar.Height - 2, 10); // path ro ham age lazem darin bazam ye jaye sabet besazin va inja fagat estefade konin



اینارو اصلا واصه چی استفاده کردین ؟
e.Graphics.SetClip(path);
e.Graphics.ResetClip();


اینم border :
private void BaseForm_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawPath( p,gp);
}


شما اگه کنترل های زیادی داشته باشی و داخل اونها هنگام لود فرم دیتا بریزی فرم نرم باز نمیشه
دیتاتو توی background لود کن

ahmadi.edu
چهارشنبه 25 اسفند 1389, 10:20 صبح
شما اومدین توی اونت Paint آبجکت های جدید ساختین از اونجایی که اونت Paint خیلی زیاد اجرا میشه این کارتون باعث کند شدن اجراش میشه ...
توی خیلی از اونایی که تازه دارن با paint کار میکنن دیدم که چون فکر میکنن paint فقط 1 بار اجرا میشه ... مثل یه متد معمولی باهاش رفتار میکنن و همه object هاشونو اونتو میسازن ...

Rectangle rectBar = new Rectangle();
rectBar = this.Bounds;
GraphicsPath path = null; // in 3 khate balayi aslan lazem nist
Pen p = new Pen(Color.FromArgb(128, 127, 250)); // pen nabayd inja sakhte beshe tu form besazin va inja fagat estefade konin
path = Create(0, 0, rectBar.Width - 2, rectBar.Height - 2, 10); // path ro ham age lazem darin bazam ye jaye sabet besazin va inja fagat estefade konin



اینارو اصلا واصه چی استفاده کردین ؟
e.Graphics.SetClip(path);
e.Graphics.ResetClip();


اینم border :
private void BaseForm_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawPath( p,gp);
}


دیتاتو توی background لود کن


بازم اول تشکر فراوان دارم که پیگیر این مشکل من هستید و براش وقت گذاشتید.چند نکته رو میخواستم بگم
اول اینکه من میدونم رویداد paint فقط یک بار اجرا نمیشه حتی قبل از اینکه بخوایم برنامه رو اجرا کنیم فقط برای دیدن designer فرم هم این رویداد اجرا میشه، اما در زمان اجرای پروژه خیلی هم اجرا نمیشه . بعدش هم اون چندتا ابجکتی که من new کردم اصلا برای سرعت کامپیوتر های امروزی چیزی نیست که برنامه بخواد سر اونا سرعتش پایین بیاد. ایکی ثانیه اون رویداد رو رد میکنه، در این شکی نیست.
2. همونطور که گفتم نمونه کدهایی که شما به من دادی و میگی از نظر منطقی بهتر و قشنگتر است اما در سرعت تاثیری نداره.
3. من اون فایلی که گذاشتی رو ندیدم چون برنامشو الان ندارم(تو مسافرتم).ولی اگه منظورت استفاده از thread هست ، خوب من همون موقعی که فرمم باز میشه میخوام اطلاعاتم رو ببینم. بعدش هم میدونم تاثیری نداره، چون یک بار تست کردم، من فکر میکنم این مشکل، مشکل render گرافیکی فرم هاست ، یه دستوری ، تابعی، اگه باشه که بشه سرعتش رو بیشتر کرد خیلی خوبه.
4. راستی من اینکه گفتم ممکنه داخل textbox هام داده باشه، خودم همچین مشکلی رو ندارم، مشکل من لود کنترل هایی است که در اونها عکسه. البته بازم thread رو یک بار دیگه با دقت بیشتری انجام میدم، ولی چشمم اب نمیخوره.
راستی اگه تو نمایش فرمها از یک effect استفاده کنیم اصلا همچین مشکلی به چشم نمیاد ولی میخوام ببینم راه منطقی داره یا نه.

saeidi.yusuf
چهارشنبه 25 اسفند 1389, 14:18 عصر
دوستان سلام:
یه لطفی کنید(ahmadi.edu) صفحه ی مذکور رو باز کنید و صبر کنید تا لودش کامل شه.یه save as از صفحتون بگیرید بعد حجم "صفحه و فلدرش" رو دربیارید بگید.شاید بتونم کمکتون کنم.

ahmadi.edu
شنبه 28 اسفند 1389, 21:43 عصر
دوستان سلام:
یه لطفی کنید(ahmadi.edu) صفحه ی مذکور رو باز کنید و صبر کنید تا لودش کامل شه.یه save as از صفحتون بگیرید بعد حجم "صفحه و فلدرش" رو دربیارید بگید.شاید بتونم کمکتون کنم.
سلام دوست عزیز: سوال من درباره برنامه های ویندوز بود، حالا اگه شما منظورتون برنامه ویندوزه راستش اصلا منظورتون رو نفهمیدم.