PDA

View Full Version : سوال: به دست آوردن هندل یک Splitter در پنجره (پروژه SDI)



حسین محمدی
سه شنبه 27 اسفند 1387, 11:53 صبح
با سلام

در یک پروژه SDI که توسط یک Splitter به دو بخش Left و Right تقسیم شده است.

همانطور که می دانیم کلاس CMainFrame ما در پروژه SDI از کلاس CFrameWnd ارث می برد. و در این کلاس توسط این کد این splitter ساخته شده است.



BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext)
{
// create splitter window
if (!m_wndSplitter.CreateStatic(this, 1, 2))
return FALSE;
if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CLeftView), CSize(100, 100), pContext) ||
!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CRightView), CSize(100, 100), pContext))
{
m_wndSplitter.DestroyWindow();
return FALSE;
}
return TRUE;
}


سوال در اینجاست که چگونه من می توانم به هندل یا آبجکت Splitter و View های ایجاد شده برسم؟
و سوال دوم اینکه آیا splitter فرزند پنجره اصلی است و View ها فرزند Splitter هستند؟

حسین محمدی
سه شنبه 27 اسفند 1387, 11:58 صبح
اگر کد کمی نا خواناست باید ببخشید.
زیرا هر چه space در ابتدای خطها می زنم این ویرایشگر برنامه نویس بعضی ها را حذف می کند.

Nima_NF
سه شنبه 27 اسفند 1387, 18:15 عصر
شما در یک برنامه SDI نمونه splitter را در CMainFrame ساخته اید پس برای دسترسی به هر کدام از view ها فقط کافیست از GetPane استفاده کنید، مثلا:



CRightView* pView = (CRightView*)m_wndSplitter.GetPane(0,1);

هندل؟ احتمالا منظور شما خود همان شئی m_wndSplitter است... قبل از هر چیز باید مشخص کنید که در کجا می خواهید آن را دریافت کنید. بهتر هست برای جلوگیری از پیچیدگی همه کارهای لازم را در همان CMainFrame انجام دهید.
از آنجایی که عضو کلاس هست، اگر آن را می خواهید آن را public تعریف کنید و سپس از طریق توابع مختلف document را پیدا کنید(مانند تابع GetDocument) و از طریق توابع دیگر مانند GetFirstViewPosition و GetNextView یا برای فریم از طریق تابع GetTopLevelFrame کلاس CMainFrame را پیدا کنید:



POSITION pos = GetFirstViewPosition();
CView* pView = GetNextView(pos);

CMainFrame* pFrame = GetTopLevelFrame(pos);

حال که به CMainFrame دسترسی دارید به راحتی m_wndSplitter را استفاده کنید.




و سوال دوم اینکه آیا splitter فرزند پنجره اصلی است و View ها فرزند Splitter هستند؟ splitter فرزند همان چیزی است که در پارامتر اول CreateStatic وارد کرده اید شما this نوشته اید پس والد همان CMainFrame است.

حسین محمدی
چهارشنبه 28 اسفند 1387, 07:46 صبح
با تشکر از پاسخ خوب شما

اولا باید تصحیح کنم منظور من از هندل همان شی m_wndSplitter که است.

من در کلاس Document هستم و می خواهم به شی m_wndSplitter (که protected نیز می باشد) دسترسی پیدا کنم.

من کد خود را به این شکل نوشته بودم:



CFrameWnd* pMainWnd = (CFrameWnd*)AfxGetMainWnd();
CView* pActiveView = pMainWnd->GetActiveView();
CSplitterWnd* pSplitter = (CSplitterWnd *)pActiveView->GetParent();
pRightView = (CView*)pSplitter->GetPane(0, 1);


آیا با توجه به اینکه m_wndSplitter فرزند CMainFrame می باشد می توان کد زیر را نوشت؟



CSplitterWnd* pSplitter = (CSplitterWnd *)pMainWnd->GetWindow(GW_CHILD);


از کجا می توان مطمئن شد که CMainFrame چند فرزند دارد و ما دقیقا شی m_wndSplitter را در pSplitter قرار داده ایم؟

Nima_NF
چهارشنبه 28 اسفند 1387, 16:29 عصر
اگر همچنان نمی خواهید m_wndSplitter را public تعریف کنید، کار را برای خودتان راحت کنید و یک تابع بنویسید که آن را به شما بدهد:



CSplitterWnd GetSplitter( )
{
return m_wndSplitter;
}

پس هرگاه به پنجره هندل پنجره مورد نظر رسیدید کافیست آن را فراخوانی کنید. (کدی را که نوشتم نیز دقیقا در کلاس document قابل استفاده هست)

یافتن تمامی فرزند ها در MFC به این شکل وقتی نام کلاس و پنجره کنترل را نداریم به راحتی نیست، در هر حال برخی API ها مانند EnumChildWindows برای این کارها وجود دارد.