PDA

View Full Version : دستکاری کنترل های دیالوگ parent توسط دیالوگ فرزند در حالت modal



A_Salimi
چهارشنبه 08 اسفند 1386, 23:22 عصر
با سلام

من میخوام برای برنامم یک دیالوگ Option درست کنم ، حالا میخوام زمانی که یک پنجره modal رو باز میکنم (فرضا با فشار یک دکمه و با دستور DoModal ) از طریق یک کنترل (مثل دکمه یا چک باکس) روی دیالوگ فرزند ، خاصیت یکی از اشیا (مثل visible و یا enable ) رو روی دیالوگ Parent تغییر بدم من سعی می کردم یک شی از اون کلاس رو ایجاد کنم و توسط اون شی به توابع کلاس دیالوگ پدر دسترسی داشته باشم اما بعد از اجرا با assert مواجه میشدم
البته دلیلش رو در codeproject دیدم اما راه حلش رو نه . . .




For example, this MFC code will assert:
BOOL CYourDlg::OnInitDialog()
{
CListCtrl wndList;
wndList.InsertColumn ( 0, "abcdef" );
}
CListCtrl::InsertColumn() contains this check:
ASSERT(::IsWindow(m_hWnd));



which fails because the wndList object wasn't attached to a real list view control
البته این مثال برای لیست کنترل آورده شده ولی من هم با این assert مواجه میشم
حالا ممکنه یه راه حل پیش پای من بذارید ؟
ممنون میشم

Nima_NF
پنج شنبه 09 اسفند 1386, 18:47 عصر
یک روش می تواند این باشد :

هندل کنترل مورد نظر را دریافت کنید و در یکجا ذخیره کنید و سپس از توابع ایجاد تغییر مورد نظر استفاده کنید
و یا از طریق SendMessage یا SendDlgItemMessage و استفاده از پیام مورد نظر

.

A_Salimi
جمعه 10 اسفند 1386, 00:24 صبح
با تشکر

ممکنه کمی بیشتر توضیح بدید ؟

این مسئله مدت زیادیه که برای من سوال شده

من سعی می کردم با اشاره گر this توسط ایجاد یک شی سازنده کلاس پدر رو وادار به اجرای یک تابع کنم که این کد در آن قرار داشت کنم




GetDlgItem(IDC_EDIT1)->ShowWindow(SW_HIDE);



در حالت دیباگ متوجه شدم دقیقا وقتی به این خط می رسید دچار اشکال میشد
این به دلیل مدال بودن نیست ؟چون اجازه دسترسی به پنجره پدر از ما گرفته شده

Nima_NF
جمعه 10 اسفند 1386, 15:14 عصر
یک نمونه مثل زیر را انجام دهید و با debug ببینید که مقدار شما cast خواهد شد یا صفر می شود:



CWnd* pWnd = GetDlgItem(IDC_EDIT1);
pEdit = (CEdit*)pWnd;
pEdit->SetSel(0, -1);


این مقاله روش بهتر این کار را با استفاده از subclass نیز توضیح می دهد:
http://www.microsoft.com/msj/1297/c1297.aspx

A_Salimi
یک شنبه 12 اسفند 1386, 12:45 عصر
روشی رو که مطرح کردید متاسفانه جواب نداد !

متغیر pEdit یک متغیر کنترلی است یا نه ؟

ضمنا در لینکی که دادید من نتونستم جواب سوالمو پیدا کنم :گریه:

اگه ممکنه و براتون مقدوره یک روش مناسب رو بگید که من بتونم از یک پنجره فرزند که مدال هم هست یکی از کنترلها رو در دیالوگ والد با GetDlgItem دستکاری کنم

ممنون

Nima_NF
یک شنبه 12 اسفند 1386, 16:23 عصر
من یک دیالوگ ساختم که از طریق آن یک دیالوگ فرزند به صورت modal باز می شود و سپس قطعه کد زیر را در داخل رویدادی در دیالوگ فرزند نوشتم تا Edit box را در دیالوگ والد مخفی کند (و یا هر تغییر دیگر).

این قطعه کد را هم نوشتم که جواب می دهد:



CWnd* pParent = this->GetParent(); // pParent points to the Parent dialog

CEdit* pEdit =(CEdit*) pParent->GetDlgItem (IDC_EDIT1);

pEdit->ShowWindow(SW_HIDE );

CWnd دیالوگ والد را دریافت کردم و از طریق آن اشاره گری به کنترل در همان دیالوگ والد بدست آوردم.
امیدوارم این دفعه علامت حل شده را ببینم

موفق باشید

A_Salimi
یک شنبه 12 اسفند 1386, 17:43 عصر
از کمک شما ممنونم و بالاخره به جواب رسیدم
اون رو برای دیگر توابع هم بکار بردم مثلا برای خاتمه کار یک تایمر در کلاس والد :




CWnd* pParent = this->GetParent();
CTime* time =(CTime*) pParent->KillTimer(1);


که به درستی جواب داد
با تشکر از زحمات شما