15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Implementing CTabCtrl in a dialog app

Terry Wellmann -- wellmatl@cs.purdue.edu
Thursday, May 16, 1996

Env:  Win 95, VC++ 4.0

I've created a dialog application and have added a CTabCtrl to the dialog.
I've also create a dialog that will be used as my page and derived it from
CPropertyPage.

The dialog has the following properties: 
style: child
border: none
Checked items: Titlebar, Visable, Disabeled

In my OnInitDialog() function I have the following code:

	// set up the tab control
	TC_ITEM TabItem;
	char szTitle[80];

	CSearchRange *pSearchRange;
	pSearchRange = new CSearchRange;

	TabItem.mask = TCIF_PARAM | TCIF_TEXT;
	TabItem.lParam = (LPARAM)pSearchRange;
	VERIFY(pSearchRange->Create(CSearchRange::IDD, &m_SettingsTabCtrl));
	pSearchRange->GetWindowText(szTitle, sizeof(szTitle));
	TabItem.pszText = szTitle;
	m_SettingsTabCtrl.InsertItem(0,&TabItem);
	pSearchRange->SetWindowPos(NULL, 10, 30, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
	pSearchRange->ShowWindow(SW_SHOW);
	pSearchRange->EnableWindow(TRUE);

	// show the first tab
	m_SettingsTabCtrl.SetCurSel(0);


When I run the app I get the dialog box drawn inside the CTabCtrl with the
title bar intact and you can move it around as if it were a normal dialog box.

What am I doing wrong in my implementation?  I quickly searched the April 96
eddition of MSDN and didn't find any implementation schemes. The one
mentioned above came from "Programming Windows 95 Unleashed" by SAM's
publishing.  The book was published before VC++ 4.0 was released and some
things don't correspond.

Thanks,

Terry





Matthias Bohlen -- MATTES@logotec.com
Tuesday, May 21, 1996

[Mini-digest: 2 responses]

Hello Terry,

I have the same environment as you have and have had the same 
problem:

> I've created a dialog application and have added a CTabCtrl to the
> dialog. I've also create a dialog that will be used as my page and
> derived it from CPropertyPage.
> 
> The dialog has the following properties: 
> style: child
> border: none
> Checked items: Titlebar, Visable, Disabeled
> 

.... some code removed here

> When I run the app I get the dialog box drawn inside the CTabCtrl
> with the title bar intact and you can move it around as if it were a
> normal dialog box.
> 
> What am I doing wrong in my implementation? 

I think, both you and me were not doing something significantly 
wrong. I solved the problem with one additional call to 
ModifyStyle():

pDialogPage->GetWindowText(szTitle, sizeof(szTitle));
TabItem.pszText = szTitle;
---> added: -----> pDialogPage->ModifyStyle (WS_CAPTION, 0);

One minor difference from your solution to mine was: I did not use 
CPropertyPage as a base class for my dialog class but a plain vanilla 
"CDialog".

Hope this helps...
Matthias

-------------------------------------------------------
Matthias Bohlen             |  Logotec Software GmbH
Phone: +49 228 64 80 520    |  Chateauneufstr. 10 
FAX:   +49 228 64 80 525    |  D-53347 Alfter, Germany
                            |
E-mail: mattes@logotec.com  |  CAD systems development
-------------------------------------------------------
-----From: "David W. Gillett" 

  The CPropertyPage docs call for a caption and a thin border -- 
because if you don't have a border, you don't have a caption in the 
template.  The CPropertySheet code extracts the caption to use as a 
tab label, and strips off the border.  

  (a) Since you're trying to use a "naked" CTabCtrl, you don't get 
any of this CPropertySheet functionality.  Deriving your child dialog 
from CPropertyPage is therefore inheriting a bunch of functionality 
that you can't use without a whole lot more work.
  (b) By the time it's displayed, a page should have neither border 
nor caption.  Supplying a titlebar is probably causing a lot of the 
unwanted behaviour you're seeing.


> What am I doing wrong in my implementation?  I quickly searched
> the April 96 eddition of MSDN and didn't find any implementation
> schemes. The one mentioned above came from "Programming Windows 95
> Unleashed" by SAM's publishing.  The book was published before VC++
> 4.0 was released and some things don't correspond.

  CPropertySheet provides a whole bunch of glue to connect 
notifications from its embedded tab control to handlers in its 
sheets.  Trying to reproduce this functionality by hand is probably a 
waste of time.  Instead of creating a CTabCtrl, I create a static 
rectangle (not visible), and create a borderless WS_CHILD 
CPropertySheet-derivative positioned over it, and add the DS_CONTROL 
and WS_EX_CONTROLPARENT styles to it (in its OnWinitDialog()).  I may 
need to fiddle with size/position issues, but I take advantage of a 
whole lot of CPropertySheet functionality that connects to 
CPropertyPage objects.
  [There's a method to get at the embedded CTabCtrl object inside a 
CPropertySheet, so even for cases where you need to manipulate that 
control directly, you are still usually much further ahead to use a 
property sheet instead.]

Dave

 



Terry Wellmann -- wellmatl@cs.purdue.edu
Thursday, May 23, 1996

Follow-up:

Env. is still Win 95 VC 4.0

I've played with some of the suggestions, although haven't had much
time but when I tried to implement my pages derived from CDialog
in the CTabCtrl I had troubles with the centering.  It didn't want to
automatically center my dialog box.  

As I look at the workspace setting that Microsoft gives and wonder. Just
how do they do it so nicely?  I would prefer to use CTabCtrl because I
don't want the tabs overlapping themselves like in a typical 
CPropertySheet.  

Thank you all for replying to my plea.  I've just got to set aside
some time to play with it.

Terry



>[Mini-digest: 2 responses]
>
>Hello Terry,
>
>I have the same environment as you have and have had the same 
>problem:
>
>> I've created a dialog application and have added a CTabCtrl to the
>> dialog. I've also create a dialog that will be used as my page and
>> derived it from CPropertyPage.
>> 
>> The dialog has the following properties: 
>> style: child
>> border: none
>> Checked items: Titlebar, Visable, Disabeled
>> 
>
>.... some code removed here
>
>> When I run the app I get the dialog box drawn inside the CTabCtrl
>> with the title bar intact and you can move it around as if it were a
>> normal dialog box.
>> 
>> What am I doing wrong in my implementation? 
>
>I think, both you and me were not doing something significantly 
>wrong. I solved the problem with one additional call to 
>ModifyStyle():
>
>pDialogPage->GetWindowText(szTitle, sizeof(szTitle));
>TabItem.pszText = szTitle;
>---> added: -----> pDialogPage->ModifyStyle (WS_CAPTION, 0);
>
>One minor difference from your solution to mine was: I did not use 
>CPropertyPage as a base class for my dialog class but a plain vanilla 
>"CDialog".
>
>Hope this helps...
>Matthias
>
>-------------------------------------------------------
>Matthias Bohlen             |  Logotec Software GmbH
>Phone: +49 228 64 80 520    |  Chateauneufstr. 10 
>FAX:   +49 228 64 80 525    |  D-53347 Alfter, Germany
>                            |
>E-mail: mattes@logotec.com  |  CAD systems development
>-------------------------------------------------------
>-----From: "David W. Gillett" 
>
>  The CPropertyPage docs call for a caption and a thin border -- 
>because if you don't have a border, you don't have a caption in the 
>template.  The CPropertySheet code extracts the caption to use as a 
>tab label, and strips off the border.  
>
>  (a) Since you're trying to use a "naked" CTabCtrl, you don't get 
>any of this CPropertySheet functionality.  Deriving your child dialog 
>from CPropertyPage is therefore inheriting a bunch of functionality 
>that you can't use without a whole lot more work.
>  (b) By the time it's displayed, a page should have neither border 
>nor caption.  Supplying a titlebar is probably causing a lot of the 
>unwanted behaviour you're seeing.
>
>
>> What am I doing wrong in my implementation?  I quickly searched
>> the April 96 eddition of MSDN and didn't find any implementation
>> schemes. The one mentioned above came from "Programming Windows 95
>> Unleashed" by SAM's publishing.  The book was published before VC++
>> 4.0 was released and some things don't correspond.
>
>  CPropertySheet provides a whole bunch of glue to connect 
>notifications from its embedded tab control to handlers in its 
>sheets.  Trying to reproduce this functionality by hand is probably a 
>waste of time.  Instead of creating a CTabCtrl, I create a static 
>rectangle (not visible), and create a borderless WS_CHILD 
>CPropertySheet-derivative positioned over it, and add the DS_CONTROL 
>and WS_EX_CONTROLPARENT styles to it (in its OnWinitDialog()).  I may 
>need to fiddle with size/position issues, but I take advantage of a 
>whole lot of CPropertySheet functionality that connects to 
>CPropertyPage objects.
>  [There's a method to get at the embedded CTabCtrl object inside a 
>CPropertySheet, so even for cases where you need to manipulate that 
>control directly, you are still usually much further ahead to use a 
>property sheet instead.]
>
>Dave
>
> 
>
>





| Вернуться в корень Архива |