继续提问,请赐教!

yanzt 2000-03-29 10:06:00
谢谢各位的回答,尤其是kxy先生,我现在能够分割窗口了,但是问题仍然存在,现在我把我的问题描述详细一些。
我想达到如下的目标:
程序开始时,有一个窗体显示一定的内容,然后在窗体上点中鼠标,表明选中窗体,然后点击工具条的左右分割按钮,这时窗体左右分割为两个窗体,左边窗体为原来窗体的内容,右边窗体可以选择显示另外不同的内容,而且有Splitter可以自由拉动改变两个窗体的大小,同样我点中这两个窗体的中的任一个,在点击工具栏上的左右分割或者上下分割按钮,又可以对点中的窗体进行左右分割或者上下分割,左右分割时,左边为原来未分割窗体的内容,右边可以添加新的内容,上下分割时,上窗体为原来未分割时窗体的内容,下窗体为新内容。当我点中某一个窗体,然后点中工具条上删除按钮时,则能够删除该窗体。我现在可以自由的分割窗体,但是删除时却遇到了麻烦,大家提供一些比较好的思路和方法,谢谢了。
...全文
179 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
MarsXia 2000-03-29
  • 打赏
  • 举报
回复
删除时碰到什么麻烦?可以说清楚些。
如果不计较内存,隐藏是简单而实际的办法。
kxy 2000-03-29
  • 打赏
  • 举报
回复
你是如何删除的?什么麻烦?
Firing_Sky 2000-03-29
  • 打赏
  • 举报
回复
删除什么?隐藏起来不就得了吗?
Firing_Sky 2000-03-29
  • 打赏
  • 举报
回复
不要把父Panel删掉,删掉的话,肯定会出问题——子Panel的Parent等于父Panel呢!
yanzt 2000-03-29
  • 打赏
  • 举报
回复
我的程序设计的思路如下:
我先声明一个TList对象,把最初的Panel1加入到TList对象中,Panel1->OnClick = myClick;myClick是我定义的事件处理函数,用于设置Tag =1;当我点击分割按钮时,查找TList中所有的Panel对象,看哪个Panel->Tag==1,从而得到哪个Panel要被分割,然后我新建立两个Panel,一个Splitter,让他们的->Parent等于要被分割的Panel,从而分割好Panel。删除时我需要去掉要删除的Panel,以及同级别的Splitter。我现在觉得我的整个分割过程就是二分法的一个结构,我描述不太清楚。现在我把程序拷贝到下边,大家帮忙提供能够完成删除窗口操作的方法。

//头文件
class TFrmMain : public TForm
{
__published: // IDE-managed Components
TMainMenu *MainMenu1;
TPopupMenu *PopupMenu1;
TMenuItem *F1;
TMenuItem *S1;
TPanel *Panel4;
TBevel *Bevel4;
TLabel *Label1;
TMenuItem *Menu_Win;
TMenuItem *Menu_UDWin;
TMenuItem *Menu_LRWin;
TMenuItem *Menu_TrWin;
TMenuItem *Menu_QWin;
TMenuItem *Menu_SixWin;
TMenuItem *Menu_SWin;
TMenuItem *N1;
TMenuItem *O1;
TMenuItem *S2;
TPanel *ToolPanel;
TToolBar *ToolBar1;
TToolButton *ToolButton1;
TToolButton *ToolButton2;
TToolButton *ToolButton3;
TPanel *Panel1;
TImageList *ImageList1;
void __fastcall ToolPanelMouseMove(TObject *Sender, TShiftState Shift,
int X, int Y);
void __fastcall FormCreate(TObject *Sender);
void __fastcall FormResize(TObject *Sender);
void __fastcall ToolButton1Click(TObject *Sender);//上下分割
void __fastcall ToolButton2Click(TObject *Sender);//左右分割
void __fastcall ToolButton3Click(TObject *Sender);//删除窗体
private: // User declarations
TList *PanelList; //存储Panel对象
public: // User declarations
__fastcall TFrmMain(TComponent* Owner);
int Count;
void __fastcall PanelOnClick(TObject *Sender);
void __fastcall PanelOnMouseMove(TObject *Sender,TShiftState Shift,int X,int Y);
};
//---------------------------------------------------------------------------
extern PACKAGE TFrmMain *FrmMain;
bool Terminate;
//---------------------------------------------------------------------------
#endif


void __fastcall TFrmMain::PanelOnClick(TObject *Sender)
{
int i;
Count = PanelList->Count;
TStPanel *curPanel = new TStPanel(this);
for(i = 0; i < Count; i++)
{
curPanel = (TStPanel *)PanelList->Items[i];
curPanel->Tag = 0;
}
curPanel = (TStPanel *)Sender;
curPanel->Tag = 1;
curPanel->BorderWidth = 2;
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::PanelOnMouseMove(TObject *Sender,TShiftState Shift,int X, int Y)
{
ToolBar1->Visible = false;

}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::ToolPanelMouseMove(TObject *Sender,
TShiftState Shift, int X, int Y)
{
if(Y<30)
{
ToolBar1->Visible = true;
}
else if(Y>=30)
{
ToolBar1->Visible = false;
}

}
//---------------------------------------------------------------------------

//-------------------------------------------------------------------------

void __fastcall TFrmMain::FormCreate(TObject *Sender)
{
CloclThread *Clock = new CloclThread(0);
Panel1->OnMouseMove = PanelOnMouseMove;
PanelList = new TList();
PanelList->Add(Panel1);
}
//---------------------------------------------------------------------------


void __fastcall TFrmMain::ToolButton1Click(TObject *Sender)
{
int i;
TStPanel *nPanel = new TStPanel(this);
nPanel->OnClick = PanelOnClick;
nPanel->OnMouseMove = PanelOnMouseMove;
TStPanel *ParPanel = new TStPanel(this);
Count = PanelList->Count;

for(i = 0; i<Count; i++)
{
ParPanel = (TStPanel *)PanelList->Items[i];
if(ParPanel->Tag == 1)
break;
}
nPanel->Height = ParPanel->Height/2;
nPanel->Parent = ParPanel;
nPanel->Align = alBottom;
nPanel->BevelInner = 0;
nPanel->BevelOuter = 0;
nPanel->BorderWidth = 0;
nPanel->Color = clBlack;
nPanel->Visible = true;
PanelList->Add(nPanel);
TSplitter *tmpSplitter = new TSplitter(this);
tmpSplitter->Parent = ParPanel;
tmpSplitter->Align = alBottom;
tmpSplitter->Beveled = true;
tmpSplitter->Height = 3;
tmpSplitter->Visible = true;
TStPanel *n2Panel = new TStPanel(this);
n2Panel->OnClick = PanelOnClick;
n2Panel->OnMouseMove = PanelOnMouseMove;
n2Panel->Parent = ParPanel;
n2Panel->Align = alClient;
n2Panel->BevelInner = 0;
n2Panel->BevelOuter = 0;
n2Panel->BorderWidth = 0;
n2Panel->Color = clBlack;
n2Panel->Visible = true;
ParPanel->Tag = 0;
n2Panel->Tag = 1;
n2Panel->BroPanel = nPanel;
n2Panel->BroSplitter = tmpSplitter;
nPanel->BroPanel = n2Panel;
nPanel->BroSplitter = tmpSplitter;
PanelList->Add(nPanel);

}
//---------------------------------------------------------------------------

void __fastcall TFrmMain::ToolButton2Click(TObject *Sender)
{
int i;
TStPanel *nPanel = new TStPanel(this);
nPanel->OnClick = PanelOnClick;
nPanel->OnMouseMove = PanelOnMouseMove;
TStPanel *ParPanel = new TStPanel(this);
Count = PanelList->Count;
if(Count>16)
{
Application->MessageBox("窗口开的太多了!","警告",MB_ICONWARNING);
return;
}
for(i = 0; i<Count; i++)
{
ParPanel = (TStPanel *)PanelList->Items[i];
if(ParPanel->Tag == 1)
break;
}
nPanel->Width = ParPanel->Width/2;
nPanel->Parent = ParPanel;
nPanel->Align = alRight;
nPanel->BevelInner = 0;
nPanel->BevelOuter = 0;
nPanel->BorderWidth = 0;
nPanel->Color = clBlack;
nPanel->Visible = true;
PanelList->Add(nPanel);
TSplitter *tmpSplitter = new TSplitter(this);
tmpSplitter->Parent = ParPanel;
tmpSplitter->Align = alRight;
tmpSplitter->Beveled = true;
tmpSplitter->Width = 3;
tmpSplitter->Visible = true;
TStPanel *n2Panel = new TStPanel(this);
n2Panel->OnClick = PanelOnClick;
n2Panel->OnMouseMove = PanelOnMouseMove;
n2Panel->Parent = ParPanel;
n2Panel->Align = alClient;
n2Panel->BevelInner = 0;
n2Panel->BevelOuter = 0;
n2Panel->BorderWidth = 0;
n2Panel->Color = clBlack;
n2Panel->Visible = true;
ParPanel->Tag = 0;
n2Panel->Tag = 1;
n2Panel->BroPanel = nPanel;
n2Panel->BroSplitter = tmpSplitter;
nPanel->BroPanel = n2Panel;
nPanel->BroSplitter = tmpSplitter;
PanelList->Add(nPanel);
}
//---------------------------------------------------------------------------

void __fastcall TFrmMain::ToolButton3Click(TObject *Sender)
{
int i;
TStPanel *curPanel = new TStPanel(this);
Count = PanelList->Count;
for(i = 0;i < Count; i++)
{
curPanel = (TStPanel *)PanelList->Items[i];
if(curPanel->Tag == 1)
{
PanelList->Remove(curPanel);
break;
}
}
curPanel->Visible = false;
TStPanel *NxtPanel = new TStPanel(this);
TSplitter *curSplitter = new TSplitter(this);
NxtPanel = curPanel->BroPanel;
NxtPanel->Tag = 1;
curSplitter = curPanel->BroSplitter ;
NxtPanel->Visible = true;
NxtPanel = (TStPanel *)NxtPanel->Parent;
NxtPanel->Tag = 1;
NxtPanel->Visible = true;

}
//------------------------------------------------------------------------

在上边的程序中,TStPanel是我自己扩充的TPanel类,它增加了TPanel *BroPanel,和TSplitter *BroSpliter两个变量,因为我觉得似乎可以按照树删除子树的方法实现。但是,结果不对。

请帮忙。

13,824

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧