PDA

View Full Version : اضافه کردن form به یک tab control ؟؟



A_Salimi
پنج شنبه 18 بهمن 1386, 14:14 عصر
با سلام :
من در ویژوال سی 2005 در یک پروژه mfc و مبتنی بر کادر تبادلی یک tab control رو به فرمم اضافه کردم و سه tab به شکل زیر به اون اضافه کردم :




m_ctrlTab.InsertItem(0,_T("test1"));
m_ctrlTab.InsertItem(1,_T("test2"));
m_ctrlTab.InsertItem(2,_T("test3"));
m_ctrlTab.SetCurSel(0);


حالا سوالم اینه که چطور میشه یک فرم (دیالوگ ) رو به اون اضافه کرد ؟ مثلا برای اضافه کردن یک دیالوگ موجود در برنامه به اون چکار باید کرد ؟

Nima_NF
پنج شنبه 18 بهمن 1386, 16:12 عصر
شما باید ابتدا اندازه و موقعیت منطقه مورد نمایش را پیدا کنید و سپس دیالوگ ها را در آن نمایش دهید، لبنک زیر را نگاه کنید ، دو روش در آن ذکر شده که می توانید از آن ها استفاده کنید.
در روش اول یک تابعی به نام CreateContents که به خوبی نحوه کار را نشان می دهید:
http://simplesamples.info/MFC/CTabCtrl.php

A_Salimi
جمعه 19 بهمن 1386, 17:01 عصر
با سلام :
با اینکه اون لینک رو دادید ولی در هر حال من باز هم نتونستم متوجه بشم که این کار چطور ممکنه ؟؟
در مثال اول با این اشکالات مواجه شدم :
1)ا یک کلاس مشتق شده چطور ایجاد میشه ؟

In the CTabCtrl derived class create a member variable for the modeless dialog that currently exists in the tab control (which varies based on which tab is selected)
در کلاس مشتق شده از CTabCtrl یک متغیر عضو برای دیالوگ modless که هم اکنون در tabcontrol وجود دارد ایجاد کنید (که بستگی دارد کدام تب انتخاب شده است )
2) متغیر های موجود در جدول در کجا باید تعریف شوند ؟

3) آیا تابع CreateContents را خودمان ایجاد می کنیم یا اینکه جزء توابع ویژال سی است ؟


Add a member function to the CTabCtrl derived class to create a modeless dialog to be the content for each tab; I called mine "CreateContents". This member function will be called once for each tab's dialog.
یک تابع عضو به کلاس مشتق شده از CTabCtrl اضافه کنید تا یک دیالوگ modeless خلق کنید که محتوی هر tab است که ان را CreateContents نامیدم .این تابع عضو یک بار برای هر دیالوگ tab فراخوانی خواهد شد .

در کل ممکنه بیشتر توضیح بدید چون حدود یک هفته میشه که باهاش سر و کله میزنم !
کاری که من انجام دادم این بود :اول یک پروژه dialog based ایجاد کردم در دیالوگ اصلی یک tab control رو به فرمم اضافه کردم و یک متغیر عضو به نام m_ctlTab (همانند مثال) واسش تعریف کردم بعد هم سه تا دیالوگ جدید اضافه کردم و خاصیت style از نوع child و title bar رو false کردم .برای دیالوگ ها هم کلاس تعریف کردم اما در مورد قرار دادن و کپی کردن کدها اشکال داشتم . . .
با تشکر

Nima_NF
جمعه 19 بهمن 1386, 19:34 عصر
1) یک کلاس مشتق شده چطور ایجاد میشه ؟

2) متغیر های موجود در جدول در کجا باید تعریف شوند ؟

3) آیا تابع CreateContents را خودمان ایجاد می کنیم یا اینکه جزء توابع ویژال سی است ؟

شما قبل از ادامه کار با MFC ، نیاز به مطالعه یک کتاب در مورد MFC دارید تا با مفاهیم MFC و oop خوب آشنا شوید ، ادامه کار از طریق خواندن مقاله و یا سوال به شما کمک زیادی نسبت به مطالعه کتاب نخواهد کرد.

1) در MFC وقتی گفته می شود یک کلاس مشتق شده از یک کنترل یا هر چیز دیگر بسازید یعنی از طریق class wizard این کار را باید انجام دهید. در مقاله ذکر شده ، پس از اضافه کردن کنترل Tab به دیالوگ ، باید از طریق class wizard یک کلاس با نام دلخواه بسازید که نوع base class آن باید CTabCtrl باشد (در مقاله نام دلخواه مشخص شده)

2) این همان قسمت OOP یا شئی گرایی است:
از طریق قابلیت add variable ( با راست کلیک کردن بر روی کنترل شما ) و یا اضافه کردن راحت و ساده متغیر ها در همان کلاس ساخته شده در مرحله 1 ، به صورت اعضای private

3) کاملا واضح است که یک یک تابع عضو با نام دلخواه کلاس است که خودتان باید بسازید.


...I called mine CreateContents...
از متد GetCurSel استفاده می کند تا بداند کدام tab فعال شده است.

------------------------
این هم یک مقاله دیگر که ساده تر و کامل تر ، از اول تا آخر ، حتی class wizard را هم توضیح می دهد: http://www.codersource.net/mfc_ctabctrl.html

در پایان این مقاله و همین طور مقاله قبلی در پست قبل ، فایل sample قابل دریافت است ، حتما نگاه کنید.

موفق باشید

A_Salimi
شنبه 20 بهمن 1386, 16:15 عصر
البته من فکر می کنم مشکل اساسی تفاوتهایی هست که بین ویژوال 2005 و ویژوال 6 وجود داره لینک دومی رو که دادید رو با ویژوال 2005 نتونستم اجرا کنم و مجبور شدم ویژوال 6 رو نصب کنم و با اون تونستم بالاخره جواب بگیرم حالا سوالی که پیش میاد اینه که برای افزودن یک کلاس مشتق شده در ویژوال 2005باید چیکار کنیم ؟ چون در اونجا نه class wizard ی هست و نه اینکه از قسمت add class چیزی به نام base class وجود داره!
بعد هم در اون لینک چه متغیر و یا متغیر هایی اندازه tab control رو مشخص می کند.
با تشکر

Nima_NF
شنبه 20 بهمن 1386, 17:09 عصر
چون در اونجا نه class wizard ی هست و نه اینکه از قسمت add class چیزی به نام base class وجود داره!

در visual C++ 2005 از طریق منوی Project و سپس Add class ، در دیالوگ ظاهر شده MFC class را انتخاب کنید و Add را کلیک کنید . wizard ظاهر می شود ، به همین راحتی.


بعد هم در اون لینک چه متغیر و یا متغیر هایی اندازه tab control رو مشخص می کند.خوب وقتی شما اندازه کنترل را به صورت دستی به دیالوگی اضافه می کنید ، دیگر نیازی به متغیر برای تنظیم اندازه خود tab ندارید.

A_Salimi
یک شنبه 21 بهمن 1386, 00:00 صبح
در visual C++ 2005 از طریق منوی Project و سپس Add class ، در دیالوگ ظاهر شده MFC class را انتخاب کنید و Add را کلیک کنید . wizard ظاهر می شود ، به همین راحتی.


من شکل دیالوگی رو که همیشه از اون استفاده می کنیم و شما گفتید رو در زیر آوردم و منوی base class رو هم باز کردم حالا میشه بگید mfc class کدومه ؟؟ ضمنا در اینجا دکمه add ی وجود نداره فقط finish هست
که بعد از کلیک کردن اون کلاس ایجاد میشه (اما فکر نکنم مشتق شده باشه).

http://www.imageupload.ir/files/47xnr1rm2ozv46i7tq6g.jpg

در ضمن من این دیالوگ رو در برنامه ای باز کردم که tab control روی فرمش بود پس چرا ctabctrl در base class وجود نداره ؟

Nima_NF
یک شنبه 21 بهمن 1386, 01:23 صبح
شما وقتی وارد منوی project می شوید نباید در قسمت طراحی دیالوگ باشید و همین طور نباید در هیچ جای دیگری باشید. فقط روی solution explorer و آن هم بر روی فایل build شما که با2 علامت مثبت روی آیکن ان مشخص شده است و یا بر روی هر صفحه ای از کدها .h یا cpp. پروژه می توانید باشید .

باز شدن class wizard ربطی به دیالوگ مورد نظر ندارد ، بلکه این کار را برای پروژه شما انجام می دهد.

Nima_NF
یک شنبه 21 بهمن 1386, 01:53 صبح
خوب این را هم توضیح بدم که در قسمت Initializing and Activating the Tab Sheets in CTabCtrl در مقاله دوم ، برای ارتباط ID کنترل با دیالوگ و کلاس ساخته شده ، در VC++ 2005 نباید Class wizard را انتخاب کنید ، بلکه با راست کلیک کردن بر روی کنترل tab در نمای طراحی دیالوگ گزینه Add variable را باید انتخاب کنید.

A_Salimi
پنج شنبه 25 بهمن 1386, 11:51 صبح
با سلام

از وقتی که TABCONTROL رو به برنامه اصلیم اضافه کردم در ابتدای اجرای برنامه با یک ERROR مواجه میشم که بعد از زدن دکمه Retry و یا Ignor به این خط از برنامه در فایل dlgdata.cpp راهنمایی میشم و بعدش برنامه کامل و بی نقص اجرا میشه . . . ممکنه بگید ایراد از کجاست ؟



ASSERT(!pDX->m_bSaveAndValidate);
pDX->PrepareCtrl(nIDC);
HWND hWndCtrl;
pDX->m_pDlgWnd->GetDlgItem(nIDC, &hWndCtrl);

با تشکر