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

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


Removing a pane from a static splitter window

Simon Young -- young_simon@jpmorgan.com
Wednesday, February 26, 1997

Environment: NT 3.51, VC++ 4.0

Can anyone help me with the best way to temporarily remove (programmatically) 
one of the panes in a static splitter window? There are normally two rows with 
just one column, and I want to hide the lower row from a toolbar button.

Simon




Dong Chen -- d_chen@ix.netcom.com
Wednesday, February 26, 1997

I saved a message posted here on last November by Rob den Breejen dealing
with this. I haven't had a chance to try it, but it might be helpful to
you.
--
Dong
d_chen@ix.netcom.com

---- saved message begins ----

Some handy Splitter functions can only be used for dynamic splitters. In
these functions there's an ASSERT for SPLS_DYNAMIC_SPLIT. You can fake this
by setting this style before calling a 'dynamic-style' function and
restore afterwards. In the following code I wrote my own 'static'
DeleteRow() and SplitRow().

void CSplitter::DeleteThisRow(int nRow)
{
	// Get current style
	long lStyle = GetWindowLong(this->GetSafeHwnd(), GWL_STYLE);
	SetWindowLong(this->GetSafeHwnd(), GWL_STYLE, lStyle |
SPLS_DYNAMIC_SPLIT);
	DeleteRow(nRow);
	// Restore style
	SetWindowLong(this->GetSafeHwnd(), GWL_STYLE, lStyle);
}

void CSplitter::SplitThisRow(int cyBefore)
{
	long lStyle = GetWindowLong(this->GetSafeHwnd(), GWL_STYLE);
	SetWindowLong(this->GetSafeHwnd(), GWL_STYLE, lStyle |
SPLS_DYNAMIC_SPLIT);
	m_pDynamicViewClass =3D RUNTIME_CLASS(CMyView);
	SetRowInfo(0, 100, 10);
	SplitRow(cyBefore);
	SetWindowLong(this->GetSafeHwnd(), GWL_STYLE, lStyle);
}
I hope this helps,
Rob den Breejen. (robb@and.nl)

---- end of saved message ----

----------
> From: Simon Young 
> To: mfc-l 
> Subject: Removing a pane from a static splitter window
> Date: Wednesday, February 26, 1997 3:22 PM
> 
> Environment: NT 3.51, VC++ 4.0
> 
> Can anyone help me with the best way to temporarily remove
(programmatically) 
> one of the panes in a static splitter window? There are normally two rows
with 
> just one column, and I want to hide the lower row from a toolbar button.
> 
> Simon
> 



Regis NICOLAS -- regis.nicolas@smartcode.fr
Thursday, February 27, 1997

[Mini-digest: 3 responses]

At 05:22 PM 2/26/97 EDT, you wrote:
>Environment: NT 3.51, VC++ 4.0
>
>Can anyone help me with the best way to temporarily remove (programmatically) 
>one of the panes in a static splitter window? There are normally two rows with 
>just one column, and I want to hide the lower row from a toolbar button.
>
>Simon
>
>
You may use SetRowInfo(?,0,0) to set the Ideal and Min Size to 0.
Hope it helps...

------------------------------
Regis NICOLAS -    R&D Windows
Smartcode Technologie

mailto:nicolas@smartcode.fr
http://www.smartcode.fr/
http://www.smartcodesoft.com/
Tel.: (33) (0)4 67 59 30 16

-----From: Simon Young 

>From regis.nicolas@smartcode.fr
>>At 05:22 PM 2/26/97 EDT, you wrote:
>>Environment: NT 3.51, VC++ 4.0
>>
>>Can anyone help me with the best way to temporarily remove (programmatically) 
>>one of the panes in a static splitter window? There are normally two rows 
with 
>>just one column, and I want to hide the lower row from a toolbar button.
>>
>>Simon
>>
>>
>You may use SetRowInfo(?,0,0) to set the Ideal and Min Size to 0.
>Hope it helps...

This is what I am currently doing (plus SetRowInfo(0, max, 0)) but it doesn't 
really help :-(
since the user can resize the other pane by using the splitter bar which 
appears at the bottom
of the frame. I want to remove the pane completely so the user can't get at it 
at all.

Simon

-----From: Regis NICOLAS 

At 02:57 PM 2/27/97 EDT, you wrote:
>>From regis.nicolas@smartcode.fr
>>>At 05:22 PM 2/26/97 EDT, you wrote:
>>>Environment: NT 3.51, VC++ 4.0
>>>
>>>Can anyone help me with the best way to temporarily remove
(programmatically) 
>>>one of the panes in a static splitter window? There are normally two rows 
>with 
>>>just one column, and I want to hide the lower row from a toolbar button.
>>>
>>>Simon
>>>
>>>
>>You may use SetRowInfo(?,0,0) to set the Ideal and Min Size to 0.
>>Hope it helps...
>
>This is what I am currently doing (plus SetRowInfo(0, max, 0)) but it doesn't 
>really help :-(
>since the user can resize the other pane by using the splitter bar which 
>appears at the bottom
>of the frame. I want to remove the pane completely so the user can't get at it 
>at all.
>
>Simon
>
>
Unfortunately if you use a static splitter you will not be able to
dynamically remove a pane.

Regis

------------------------------
Regis NICOLAS -    R&D Windows
Smartcode Technologie

mailto:nicolas@smartcode.fr
http://www.smartcode.fr/
http://www.smartcodesoft.com/
Tel.: (33) (0)4 67 59 30 16




Arkady Elterman -- arkady@neca.com
Thursday, February 27, 1997

[Mini-digest: 3 responses]

I don't think you can "remove" a pane from a 2x1 splitter, because there is
no such thing as a 1x1 splitter.

You can, though, "re-parent" both views to the frame window (the splitter's
parent), hide the lower view and destroy the splitter.  Later you can
re-create the splitter and re-parent the views back to it.

It's a little more complex than just that (you need to resize views
appropriately, assign correct window IDs, maybe play with windows' styles),
but you got the idea.

Arkady Elterman
arkady@neca.com
http://www.neca.com/~arkady/spin.htm

----------
: From: Simon Young 
: To: mfc-l 
: Subject: Removing a pane from a static splitter window
: Date: Wednesday, February 26, 1997 4:22 PM
: 
: Environment: NT 3.51, VC++ 4.0
: 
: Can anyone help me with the best way to temporarily remove
(programmatically) 
: one of the panes in a static splitter window? There are normally two rows
with 
: just one column, and I want to hide the lower row from a toolbar button.
: 
: Simon
: 
-----From: "Dorie Hannan" 

You can do this.  The best place to see what you can do is in Dr. 
Dobbs December and January issues.  Scot Wingo takes a look  inside
CSplitterWnd to show all kinds of neat stuff.
What you need to do is create your own Splitter Window class.  Mine 
for instance is CBrowseSplitter.  Then I have my own methods called 
HideSynColumn and ShowSynColumn.  Inside of these you change the 
values for  m_nCols or m_nRows(whichever you want to change). 

void CBrowseSplitter::HideSynColumn()
{
  m_nCols = 1;
  RecalcLayout();
}

void CBrowseSplitter::ShowSynColumn()
{ 
   m_nCols = 2;
  m_pSynPane->SetDlgCtrlID(IdFromRowCol(0,1));
  RecalcLayout();
}

void CBrowseSplitter::SetSynPane() 
{
  m_pSynPane = GetDlgItem(IdFromRowCol(0,1));
}

So I do this from a button by calling HideSynColumn() or 
ShowSynColumn(). 
Believe it or not its really that simple.  Hope that helps!

> Environment: NT 3.51, VC++ 4.0
> 
> Can anyone help me with the best way to temporarily remove (programmatically) 
> one of the panes in a static splitter window? There are normally two rows with 
> just one column, and I want to hide the lower row from a toolbar button.
> 
> Simon
> 
> 
-----From: Simon Young 

Thanks for this: this is exactly what I wanted.

Since it appears to be this simple to 'hack' the functionality in to a static 
splitter, it seems as if the 
ASSERT style = dynamic could be removed from the MFC code for the DeleteRow and 
SplitRow
calls (together with associated other minor changes) - Mike B?

Simon

To: mfc-l @ netcom.com @ SMTP
cc: 
From: d_chen @ ix.netcom.com ("Dong Chen") @ SMTP
Sent: Wed 02/26/97 09:22:00 PM EST
Subject: Re: Removing a pane from a static splitter window


I saved a message posted here on last November by Rob den Breejen dealing
with this. I haven't had a chance to try it, but it might be helpful to
you.
--
Dong
d_chen@ix.netcom.com

---- saved message begins ----

Some handy Splitter functions can only be used for dynamic splitters. In
these functions there's an ASSERT for SPLS_DYNAMIC_SPLIT. You can fake this
by setting this style before calling a 'dynamic-style' function and
restore afterwards. In the following code I wrote my own 'static'
DeleteRow() and SplitRow().

void CSplitter::DeleteThisRow(int nRow)
{
 // Get current style
 long lStyle = GetWindowLong(this->GetSafeHwnd(), GWL_STYLE);
 SetWindowLong(this->GetSafeHwnd(), GWL_STYLE, lStyle |
SPLS_DYNAMIC_SPLIT);
 DeleteRow(nRow);
 // Restore style
 SetWindowLong(this->GetSafeHwnd(), GWL_STYLE, lStyle);
}

void CSplitter::SplitThisRow(int cyBefore)
{
 long lStyle = GetWindowLong(this->GetSafeHwnd(), GWL_STYLE);
 SetWindowLong(this->GetSafeHwnd(), GWL_STYLE, lStyle |
SPLS_DYNAMIC_SPLIT);
 m_pDynamicViewClass =3D RUNTIME_CLASS(CMyView);
 SetRowInfo(0, 100, 10);
 SplitRow(cyBefore);
 SetWindowLong(this->GetSafeHwnd(), GWL_STYLE, lStyle);
}
I hope this helps,
Rob den Breejen. (robb@and.nl)

---- end of saved message ----

----------
> From: Simon Young 
> To: mfc-l 
> Subject: Removing a pane from a static splitter window
> Date: Wednesday, February 26, 1997 3:22 PM
> 
> Environment: NT 3.51, VC++ 4.0
> 
> Can anyone help me with the best way to temporarily remove
(programmatically) 
> one of the panes in a static splitter window? There are normally two rows
with 
> just one column, and I want to hide the lower row from a toolbar button.
> 
> Simon
> 








Become an MFC-L member | Вернуться в корень Архива |