PDA

View Full Version : دیالوگ های modeless



A_Salimi
دوشنبه 15 بهمن 1386, 00:45 صبح
با سلام

مدتیه که نیاز به ایجاد پنجره ای دارم که modal نباشه یعنی بشه به دیالوگ والد هم در صورت باز بودن دیالوگ فرزند دسترسی داشت

ممکنه بگید این کار چطور ممکنه ؟

من سعی کردم از showwindow و modeless استفاده کنم اما در هر حال موفق نشدم

ممکنه راهنمایی بدید ؟

ممنون میشم

simul8or
دوشنبه 15 بهمن 1386, 02:19 صبح
با سلام

مدتیه که نیاز به ایجاد پنجره ای دارم که modal نباشه یعنی بشه به دیالوگ والد هم در صورت باز بودن دیالوگ فرزند دسترسی داشت

ممکنه بگید این کار چطور ممکنه ؟

من سعی کردم از showwindow و modeless استفاده کنم اما در هر حال موفق نشدم

ممکنه راهنمایی بدید ؟

ممنون میشم

شما می توانید با استفاده از توابع CreateDialog و CreateDialogIndirect دیالوگ باکس های modeless تولید کنید. در MSDN در قسمت About Dialog Boxes توضیحات خوبی در این زمینه ارائه شده است.

اگر قصد شما ساخت یک برنامه Multiple-Document Interface یا به اختصار (MDI) است، مطالب زیر می تواند به شما کمک کند:
پنجره ی اصلی ی یک برنامه MDI مانند یک پنجره عادی با استایل WS_OVERLAPPEDWINDOW است. یعنی می تواند دارای منو ، toolbar و... باشد. ولی از client area این پنجره به طور مستقیم برای نمایش خروجی استفاده نمی شود، اما در عوض workspace یک برنامه MDI می تواند دارای یک یا چندین child windows باشد.
روش کلی ساخت یک برنامه ی MDI به این صورت است که ابتدا پنجره اصلی برنامه و سپس پنجره ی client window بر اساس کلاس ویندوز MDICLIENT و فراخوانی تابع CreateWindow و همچنین استفاده از استایل WS_CHILD ساخته می شود.
پس از ساخت client window شما می توانید با مقدار دهی ساختار MDICREATESTRUCT و فرستادن پیام WM_MDICREATE پنجره های فرزند را تولید نمایید.

در ضمن باید بگم، ساخت یک برنامه ی MDI خیلی سخت تر از برنامه های عادی است و نیاز به تجربه دارد.
موفق باشید.

A_Salimi
دوشنبه 15 بهمن 1386, 19:13 عصر
با سلام خدمت شما :
از پاسخ شما ممنونم . من این کار رو برای پروژه های مبتنی بر کادر تبادلی می خواستم و در ضمن در msdn
اون قسمتی رو که بهش اشاره کرده بودید رو دیدم اما متاسفانه نتونستم انجامش بدم . . .
ببینید من یک دیالوگ modeless رو نمی خوام خلق کنم بلکه فقط می خوام بازش کنم یعنی اول یک پروژه مبتنی بر کادر تبادلی ایجاد کردم و از طریق insert dialog یک دیالوگ جدید رو ایجاد کردم و تنها مشکلی که دارم باز کردن اون به صورت modeless هست . . .
در msdn یک مثال با عنوان :
MODELESS Sample: Uses a CDialog Object as a Modeless Dialog
هست اما متاسفانه متوجه نشدم چطوری کار می کنه :
اینجور کدی در اون مثال وجود داره :



if (m_pModeless == NULL)
{
m_pModeless = new CAdderDialog(this);
if (m_pModeless->Create() == TRUE)
GetDlgItem(IDOK)->EnableWindow(FALSE);
}
else
m_pModeless->SetActiveWindow();

فقط نمی دونم m_pModeless چیه . . .
اگه ممکنه راهنمایی بدید در پروژه های مبتنی بر کادر تبادلی در mfc چطور میشه مثلا با کلیک روی یک دکمه یک دیالوگ modeless رو که قبلا خودمون به صورت دستی ایجادش کردیم رو باز کنیم ؟
با تشکر

Nima_NF
سه شنبه 16 بهمن 1386, 00:42 صبح
فقط نمی دونم m_pModeless چیه . . .در MFC هرگاه با استفاده از create یک دیالوگ باکس بسازید ، آن را به صورت modeless می سازد (یعنی مثل همان قطعه کد خودتان) ، پس به شکل بسیار ساده این قطعه کد را ببینید:



CDialog * pDialog = new CDialog();

BOOL res = pDialog->Create(IDD_ABOUTBOX,NULL);

if(!res) //Create failed.
{
AfxMessageBox("Error");
}

pDialog->ShowWindow(SW_SHOW);


اما در اصل شما باید یک کلاس که از نوع CDialog مشتق می شود را بسازید (که این کار را توسط class wizard انجام دهید و مثلا کلاسی با نام CMyDialog از CDialog بسازید) و سپس یک اشاره گر به آن شئی بسازید ، یعنی m_pModeless در کد شما به جای pDialog در زیر است:






CMyDialog* pDialog;
pDialog = new CMyDialog();
pDialog->Create(IDD_MYDIALOG,this);

CMyDialog هم یک کلاس مشتق شده از کلاس CDialog می باشد که مثلا می تواند متد ها ، متغیر ها و توابع خاص همان دیالوگ را داشته باشد. و همانطور که گفته شد برای این کار می توانید از class wizard استفاده کنید و یا خودتان دستی بنویسید.
دقیقا مانند کلاس دیالوگ about ، اما فقط در موقع فراخوانی آن به جای modal از همان قطعه کدهای فوق( یعنی create ) استفاده کنید:



class CAboutDlg : public CDialog
{
...
}

این لینک نیز به شما کمک می کند:
http://www.codersource.net/mfc_tutorial_part6.html

A_Salimi
سه شنبه 16 بهمن 1386, 11:50 صبح
نیما جان :
از پاسخ شما تشکر می کنم من دو تا کلاس به نام test و test1 داشتم که به صورت زیر از کلاس test دیالوگ
Test1 رو ایجاد کردم :




test1* pDialog;
pDialog = new test1();
pDialog->Create(IDD_DIALOG1,this);
pDialog->ShowWindow(SW_SHOW);



فقط می خواستم بدونم متد destroy رو نباید برای آزاد شدن resourse ها فراخوانی کنیم ؟
اگه جواب مثبته این کار چطور ممکنه ؟

Nima_NF
سه شنبه 16 بهمن 1386, 16:51 عصر
از متد CWnd::DestroyWindow در قسمت کد های مربوط به ok و یا cancel استفاده کنید تا دیالوگی که با create ساخته شده را از بین ببرید و اگر هم خواستید می توانید در همین بخش سایر متغیر های دینامیک و اشیای ساخته شده از کلاس را پاک کنید و حافظه را آزاد کنید. توجه داشته باشید که در قسمت مخرب کلاس نباید اشیا را آزاد کنید چون دیالوگ modeless همراه در کنار پنجره اصلی در حال اجرا است و فقط هنگام بستن آن کار تمام می شود.


برای نمونه کد این صفحه را ببینید. (http://msdn2.microsoft.com/en-us/library/kt7c0708%28VS.80%29.aspx)