PDA

View Full Version : دسترسی به فرم دایلوگ از داخل یک فایل سی پلاس پلاس دیگر



soroush_vs
یک شنبه 16 فروردین 1388, 10:39 صبح
با سلام
من میخام از داخل یک فایل دیگه سی پلاس پلاس که در پروژه ی ما هست به اجزای فرم دسترسی پیدا کنم.پروژه از نوع Dialog هست.
ممنون میشم اگه روشش رو بگید.

Nima_NF
یک شنبه 16 فروردین 1388, 13:53 عصر
با استفاده از GetDlgItem می توانید یک اشاره گر به کنترل ها بدست آورید:



CEdit* pEditBox;
pEditBox = (CEdit*) GetDlgItem(IDC_EDIT1);

البته نیاز نیست یک اشاره گر کنترل مانند CEdit و ... بسازید به شکل زیر متد دلخواه خود را فراخوانی کنید، مثلا:




CString str1;

int length = GetDlgItem(IDC_EDIT1)->LineLength( GetDlgItem(IDC_EDIT1)->LineIndex(0) );
GetDlgItem(IDC_EDIT1)->GetLine(0, str1.GetBuffer(length), length);

meysamg_alone
یک شنبه 16 فروردین 1388, 14:09 عصر
GetDlgItem
فقط برای کلاس mfc هست ؟

Nima_NF
یک شنبه 16 فروردین 1388, 19:03 عصر
GetDlgItem
فقط برای کلاس mfc هست ؟
هم برای MFC (به صورت متدی از کلاس CWnd) و هم برای win32 API

soroush_vs
پنج شنبه 20 فروردین 1388, 15:48 عصر
ممنونم آقا نیما اما منظور من این بود که از داخل یه فایل سی پلاس پلاس دیگه که در پروژه ی ما وجود داره به اجزای فرم که اونم فایل سی پلاس پلاس خودش رو داره دسترسی پیدا کنم..از داخل اون فایل مجزا قصد دارم که به اجزای دایلوگ و کامپوننت هاش دسترسی پیدا کنم.
اگه هنوز منظورم رو توجه نشدید بفرمایید تا بیشتر توضیح بدم

Nima_NF
پنج شنبه 20 فروردین 1388, 18:56 عصر
ممنونم آقا نیما اما منظور من این بود که از داخل یه فایل سی پلاس پلاس دیگه که در پروژه ی ما وجود داره به اجزای فرم که اونم فایل سی پلاس پلاس خودش رو داره دسترسی پیدا کنم..از داخل اون فایل مجزا قصد دارم که به اجزای دایلوگ و کامپوننت هاش دسترسی پیدا کنم.
اگه هنوز منظورم رو توجه نشدید بفرمایید تا بیشتر توضیح بدم
من هم جواب همین سوال شما را دادم.

فقط یک نکته را فراموش کردم که بگم. شما باید ابتدا با هر تابعی که مد نظر شما هست ابتدا hwnd پنجره یا دیالوگ مورد نظر را بگیرید و سپس GetDlgItem را برای آن فراخوانی کنید. به جای GetDlgItem (متد در MFC) از GetDlgItem در API ها استفاده کنید:



::GetDlgItem(hwnd, IDC_EDIT1);



نکات:

- ID ها در فایل resource.h تعریف شده اند پس در همه جا به آن ها دسترسی دارید، فقط باید هدر فایل آن را در بالای فایل cpp خود include کنید. پس فرقی نمی کند در کجا آن را فراخوانی می کنید.



- متغیر m_hWnd در پنجره یا دیالوگ شما HWND را نگه می دارد. می توانید تابعی بنویسید که آن را ارسال کند به سایر قسمت های برنامه(به سایر فایل های برنامه). یا از تابع GetSafeHwnd استفاده کنید.

- به این شکل دیگر نمی توانید از UpdateData و امثال آن استفاده کنید، مگر اینکه برای آن ها توابع جداگانه بنویسید که با تعریف هدر فایل آن در فایل های دیگر، آن توابع قابل اجرا باشد.

soroush_vs
پنج شنبه 20 فروردین 1388, 20:17 عصر
خیلی خوب..ریسورس ها رو میتونم با اینکلود کردن هدر فایل ریسورس بهشون دسترسی پیدا کنم
اما حالا اون هندل دایلاگ رو چگونه به اون فایل سی پلاس پلاس بفرستم؟ میشه لطفا مثالی بزنید؟

soroush_vs
جمعه 21 فروردین 1388, 00:40 صبح
ایا اینجاو برای این هدف extern ClassName ObjectName هم میتونه کمک کنه؟

Nima_NF
جمعه 21 فروردین 1388, 01:43 صبح
می توانید یک تابع static در کلاس دیالوگ تعریف کنید که بدون تعریف یک شئی از کلاس بتوانید آن را مستقیم فراخوانی کنید و m_hWnd را به خروجی بدهد .

اما راه بهتر که معمولا از آن برای تبادل hwnd استفاده می کنیم تخصیص متغیر عمومی هست، نیاز نیست کل کلاس را extern تعریف کنید، فقط یک متغیر عمومی از نوع HWND در خارج از کلاس دیالوگ تعریف کنید و در سایر فایل های آن را با extern مشخص کنید تا از آن استفاده کند.



HWND hwndDlg1; // global

در هنگام شروع برنامه نیز در WM_INITDIALOG یا همان OnInitDialog یا هر جای دیگر در شروع دیالوگ متغیر Hwnd را در این متغیر عمومی بریزید:



hwndDlg1 = m_hWnd ;

include هدر فایل فراموش نشود.
در جایی هم که از آن استفاده می کنید:



extern HWND hwndDlg1;