Re: problems in creating file dialog in tab control
TabCtrl_GetCurSel(hWnd) is a the same as
SendMessage(hWnd,TCM_GETCURSEL,0,0);
I saw that you are creating the tab and adding items to it. In the code
that you have posted (assuming that this is all in the same function) the
current selection is always going to be 0 because you have just added a
bunch of items and haven't set an index other than 0. So GetCurSel will
always return a 0.
If you want to display a different dialog box when the tab's selection is
changed then you will need to catch the TCN_SELCHANGE notification in the
WinProc of the parent window of the tab control, and do you showing and
hiding of the dialog there.
AliR.
"lfsym" <clamayi@gmail.com> wrote in message
news:1154533958.860695.26360@s13g2000cwa.googlegroups.com...
Hi AliR,
I am sorry. the code is like this:
(1) create the tab control
hwndTabCtrl=CreateWindow
(WC_TABCONTROL,"",WS_CHILD|WS_CLIPSIBLINGS|WS_VISIBLE,0,0,rcClient.right,rcC
lient.bottom,hwndParent,NULL,g_hinst,NULL);
if(hwndTabCtrl==NULL)
AfxMessageBox("can't create tab control window");
(2) create three dialogs
pDialog[0]=new CPartDlg();
pDialog[0]->Create(IDD_DIALOG_FOR_PART,NULL);
pDialog[1]=new CMachineDlg();
pDialog[1]->Create(IDD_DIALOG_FOR_MACHINE,NULL);
pDialog[2]=new CProcessDlg();
pDialog[2]->Create(IDD_DIALOG_FOR_PROCESS,NULL);
(3) insert items to Tab control
m_tcitem.mask=TCIF_TEXT|TCIF_IMAGE;
m_tcitem.iImage=-1;
for(int i=0;i<TAB_PAGE_COUNT;i++)
{
m_tcitem.pszText=g_tabName[i];
if(TabCtrl_InsertItem(hwndTabCtrl,i,&m_tcitem)==-1)
{
AfxMessageBox("can't insert");
DestroyWindow(hwndTabCtrl);
}
(4)set the display area for tab control
DeferWindowPos(hdwp,hwndTabCtrl,NULL,rcClient.left,rcClient.top+100,(rcClien
t.right-rcClient.left)/4,(rcClient.bottom-rcClient.top)/3,0);
EndDeferWindowPos(hdwp);
(5) select the page and show the window
int i_nPage=TabCtrl_GetCurSel(hwndTabCtrl);
pDialog[i_nPage]->ShowWindow(i_nPage);
(this maybe a little different)
the big problem here is I always get the value of i_nPage=0, when I
select the second page, this value is still zero. Does it mean that I
have to process the message TCN_SELCHANGE? I remeber from MSDN saying
that can use the macro TabCtrl_GetCurSel() replace sending
TCN_SELCHANGE message explicitly? I don't know why. thanks again.
David
AliR wrote:
Hi David,
I am sorry but I can't really tell what is going on from the code you
provided.
AliR.
"lfsym" <clamayi@gmail.com> wrote in message
news:1154529256.800375.224700@p79g2000cwp.googlegroups.com...
Thanks,AliR. I modify my codes according to your suggestion. but there
still the same problem.What I want is like this: when I select the
first page,one dialog is shown up(not automatically) and when I select
the second page the other dialog is up. because I use DLL, it is not
easy to process the message TCN_SELCHANGE. i use the macro
TabCtrl_GetCurSel(), but I don't know why the return value is always
zero. Please help me!
The codes are like:
//create tab control handler
hwndTabCtrl=CreateWindow(WC_TABCONTROL,"",
WS_CHILD|WS_CLIPSIBLINGS|WS_VISIBLE,0,0,rcClient.right,rcClient.bottom,hwndP
arent,NULL,g_hinst,NULL);
if(hwndTabCtrl==NULL)
AfxMessageBox("can't create tab control window");
//create dialog for file
pDialog[0]=new CPartDlg();
pDialog[0]->Create(IDD_DIALOG_FOR_PART,NULL);
//create dialog for machine
// CMachineDlg *pMachineDlg;
pDialog[1]=new CMachineDlg();
pDialog[1]->Create(IDD_DIALOG_FOR_MACHINE,NULL);
//CREATE dialog for process
// CProcessDlg *pProcessDlg;
pDialog[2]=new CProcessDlg();
pDialog[2]->Create(IDD_DIALOG_FOR_PROCESS,NULL);
//fill tab control's information
m_tcitem.mask=TCIF_TEXT|TCIF_IMAGE;
m_tcitem.iImage=-1;
for(int i=0;i<TAB_PAGE_COUNT;i++)
{
m_tcitem.pszText=g_tabName[i];
if(TabCtrl_InsertItem(hwndTabCtrl,i,&m_tcitem)==-1)
{
AfxMessageBox("can't insert");
DestroyWindow(hwndTabCtrl);
}
}
TabCtrl_AdjustRect(hwndTabCtrl,FALSE,&rcClient);
TabCtrl_GetItemRect(hwndTabCtrl,0,&rcTab); //Get the tab page
dimension
hdwp=BeginDeferWindowPos(1);
DeferWindowPos(hdwp,hwndTabCtrl,NULL,rcClient.left,rcClient.top+100,(rcClien
t.right-rcClient.left)/4,(rcClient.bottom-rcClient.top)/3,0);
EndDeferWindowPos(hdwp);
int i_nPage=TabCtrl_GetCurSel(hwndTabCtrl);
if(pDialog[i_nPage]->m_hWnd)
pDialog[i_nPage]->ShowWindow(SW_HIDE);
for(int j=0;j<3;j++)
{
pDialog[j]->SetWindowPos(&pDialog[j]->wndTop,
rcClient.left,rcClient.top+100+rcTab.bottom-rcTab.top,
(rcClient.right-rcClient.left)/4,(rcClient.bottom-rcClient.top)/3,SWP_HIDEWI
NDOW);
}
pDialog[i_nPage]->SetWindowPos(&pDialog[j]->wndTop,
rcClient.left,rcClient.top+100+rcTab.bottom-rcTab.top,
(rcClient.right-rcClient.left)/4,(rcClient.bottom-rcClient.top)/3,SWP_SHOWWI
NDOW);
pDialog[i_nPage]->ShowWindow(SW_SHOW);
Thanks
David
AliR wrote:
In order for one dialog to be created as part of another window the
Dialog
must have the WS_CHILD style, and by default CFileDialog has the
WS_POPUP
style. There are ways around that, you can override the dialog
template
of
the file dialog and telling CFileDialog to load that instead.
http://www.codeproject.com/dialog/xfiledialog.asp
The other thing is that you will have to use CFileDialog::Create
method
instead of DoModal.
AliR.
"lfsym" <clamayi@gmail.com> wrote in message
news:1154442557.063598.252610@i42g2000cwa.googlegroups.com...
Hi,I am creating a tab control and want to pop up a file dialog
when
clicking one tab page. but now, the file dialog was shown up at
the
same time with tab control, not after selecting one page. Could
some
guys help me? Thanks
David
GetClientRect(hwndParent,&rcClient);
InitCommonControls();
hwndTabCtrl=CreateWindow(WC_TABCONTROL,"",
WS_CHILD|WS_CLIPSIBLINGS|WS_VISIBLE,0,0,rcClient.right,rcClient.bottom,hwndP
arent,NULL,g_hinst,NULL);
if(hwndTabCtrl==NULL)
AfxMessageBox("can't create tab control window");
m_tcitem.mask=TCIF_TEXT|TCIF_IMAGE;
m_tcitem.iImage=-1;
for(int i=0;i<TAB_PAGE_COUNT;i++)
{
m_tcitem.pszText=g_achTemp[i];
if(TabCtrl_InsertItem(hwndTabCtrl,0,&m_tcitem)==-1)
{
AfxMessageBox("can't insert");
DestroyWindow(hwndTabCtrl);
}
}
TabCtrl_AdjustRect(hwndTabCtrl,FALSE,&rcClient);
hdwp=BeginDeferWindowPos(1);
DeferWindowPos(hdwp,hwndTabCtrl,NULL,rcClient.left,rcClient.top+100,(rcClien
t.right-rcClient.left)/4,(rcClient.bottom-rcClient.top)/3,0);
EndDeferWindowPos(hdwp);
//try to get the current focus of tab page
if(TabCtrl_SetCurSel(hwndTabCtrl,3)==3)
{
CFileDialog partFileDlg
(TRUE,"prt",".prt",OFN_HIDEREADONLY,szFilter,CWnd::FromHandle(hwndTabCtrl));
if(partFileDlg.DoModal()==IDOK)
{
AfxMessageBox("create part file dialog");
}
}