BCB界面设计的难题吗?为什么我发了几次帖还没人解答??高分相送,急!

goldolphin 2002-08-03 06:53:30
1.与不可作为独立窗口的控件的泊定有关,有一个属性FloatingDockSiteClass可以用来指定当控件浮动后动态生成的窗口的类来作为该控件的Parent,我新建了一个Form类,用__classid赋给我的控件的属性FloatingDockSiteClass。但是发现我在TMyForm类中添加的修改form的属性,响应事件的代码均不起作用。TMyForm是从TCustomDockForm派生的。程序运行中,将控件拖出成浮动状态时,动态生成的窗口的外观和行为仍和默认的一样,我的修改没有任何体现,包括对OnCreate,OnPaint,Onclose的响应,不知为什么,还请指教。
我的主窗口是MDI的,其上有一个TTreeView控件,响应主窗口的OnCreate事件,写了如下代码
void __fastcall TMainWnd::FormCreate(TObject *Sender)
{
trvMyTree->FloatingDockSiteClass=__classid(TPrjMgrForm);
}

新建了一个Form类TMyForm。
响应其OnCreate事件,写了如下代码
Caption="My Tree";
在其构造函数中也有上面这行代码。

但在运行中,将这个TreeView(trvMyTree)拖出主窗口成为浮动窗口时,浮动窗口标题栏仍是空的,而我在TMyForm类中写的其它响应OnPaint,OnClose等事件的代码也都没有得到执行,这是怎么回事,应该如何做才能控制这个浮动窗口,修改它的属性?

2.和上面相关,如何正确地泊定一个可作为独立窗口的控件?(BCB帮助有关这方面叙述很少,能否给出具体一点的步骤)

这两个问题问了数次了,至今还没得到解答,唉工作急迫,各位帮帮忙。到时可数帖一起给分。
...全文
48 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
xdspower 2002-08-05
  • 打赏
  • 举报
回复
学习
I_Love_Soft 2002-08-05
  • 打赏
  • 举报
回复
up
goldolphin 2002-08-05
  • 打赏
  • 举报
回复
UP
magicsnake 2002-08-05
  • 打赏
  • 举报
回复
取经:)
my12121 2002-08-05
  • 打赏
  • 举报
回复
季大哥真厉害
goldolphin 2002-08-05
  • 打赏
  • 举报
回复
真是太麻烦季前辈了,非常感谢。
我再试试。
我是CB初学者,看得出来你两次实现事件响的方法有不同,但是不太懂。
看样子还要多找点书看看。(前者似乎是类似MFC的宏映射方式,后者不知怎么描述~~~)
钛哥 2002-08-05
  • 打赏
  • 举报
回复
!@_@!
jishiping 2002-08-05
  • 打赏
  • 举报
回复
这个问题真的比较难,我可是费了好大的力气才搞出来。关键还是在于class
TCustomDockForm没有任何事件,不能在设计期生成控件。如果想添加控件,
控件必须动态生成。刚才我又试了一下,这样更加贴近VCL的写法:
class TPrjMgrForm : public TCustomDockForm
{
__published: // IDE-managed Components
void __fastcall FormPaint(TObject *Sender);
private: // User declarations
TButton* Button[2];
TControl* DockChild; //存放被拖动的控件

//void __fastcall OnPaint(TMessage&);
void __fastcall ButtonClick(TObject *Sender);
protected:
__property OnPaint; //注意这儿,公布OnPaint事件

DYNAMIC void __fastcall DoAddDockClient(
TControl* Client, const Windows::TRect &ARect);
public: // User declarations
__fastcall TPrjMgrForm(TComponent* Owner);
};

//---------------------------------------------------------
__fastcall TPrjMgrForm::TPrjMgrForm(TComponent* Owner)
: TCustomDockForm(Owner)
{
OnPaint = FormPaint; //在这儿,动态添加事件
}
//---------------------------------------------------------
void __fastcall TPrjMgrForm::DoAddDockClient(
TControl* Client, const Windows::TRect &ARect)
{
TCustomDockForm::DoAddDockClient(Client, ARect);
Client->Align = alNone;
BorderStyle = bsToolWindow;
Client->Top = 0;
Client->Left = 0;
ClientWidth = Client->Width;
ClientHeight = Client->Height + 40;
for(int n=0; n<2; n++) {
Button[n] = new TButton(this);
Button[n]->Caption = AnsiString(
"Button") + (n+1);
Button[n]->Parent = this;
Button[n]->SetBounds(4+68*n,
Client->Height+8, 60, 24);
Button[n]->OnClick = ButtonClick;
}
DockChild = Client;
}
//---------------------------------------------------------
void __fastcall TPrjMgrForm::ButtonClick(TObject *Sender)
{
TButton* Btn = (TButton*)Sender;
ShowMessage("你按了按钮\"" + Btn->Caption + '\"');
}
//---------------------------------------------------------
void __fastcall TPrjMgrForm::FormPaint(TObject *Sender)
{
Rectangle(Canvas->Handle, Button[1]->Left
+Button[1]->Width+8, Button[1]->Top,
ClientWidth, Button[1]->Top+Button[1]
->Height);
}
yangguo_god 2002-08-05
  • 打赏
  • 举报
回复
学习
jishiping 2002-08-05
  • 打赏
  • 举报
回复
所有的消息,需要自己来响应。下面是我测试出来的代码:

class TPrjMgrForm : public TCustomDockForm
{
__published: // IDE-managed Components
private: // User declarations
TButton* Button[2];
TControl* DockChild; //存放被拖动的控件

void __fastcall OnPaint(TMessage&);
void __fastcall OnCommand(TMessage&);
protected:
DYNAMIC void __fastcall DoAddDockClient(
TControl* Client, const Windows::TRect &ARect);
public: // User declarations
__fastcall TPrjMgrForm(TComponent* Owner);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_PAINT,TMessage,OnPaint)
MESSAGE_HANDLER(WM_COMMAND,TMessage,OnCommand)
END_MESSAGE_MAP(TCustomDockForm)
};
//-----------------------------------------------------------
extern PACKAGE TPrjMgrForm *PrjMgrForm;

//------------------------ CPP ------------------------------
__fastcall TPrjMgrForm::TPrjMgrForm(TComponent* Owner)
: TCustomDockForm(Owner)
{
}
//-----------------------------------------------------------
void __fastcall TPrjMgrForm::DoAddDockClient(
TControl* Client, const Windows::TRect &ARect)
{
TCustomDockForm::DoAddDockClient(Client, ARect);
Client->Align = alNone;
BorderStyle = bsToolWindow;
Client->Top = 0;
Client->Left = 0;
ClientWidth = Client->Width;
ClientHeight = Client->Height + 40;
for(int n=0; n<2; n++) {
Button[n] = new TButton(this);
Button[n]->Caption = AnsiString(
"Button") + (n+1);
Button[n]->Parent = this;
Button[n]->SetBounds(4+68*n,
Client->Height+8, 60, 24);
}
DockChild = Client;
}
//-----------------------------------------------------------
void __fastcall TPrjMgrForm::OnPaint(TMessage& Msg)
{
TCustomDockForm::Dispatch(&Msg);
HDC hDC = GetDC(Handle);
Rectangle(hDC, Button[1]->Left+
Button[1]->Width+8, Button[
1]->Top, ClientWidth, Button[
1]->Top+Button[1]->Height);
ReleaseDC(Handle, hDC);
}
//-----------------------------------------------------------
void __fastcall TPrjMgrForm::OnCommand(TMessage& Msg)
{
TCustomDockForm::Dispatch(&Msg);
for(int n=0; n<2; n++) {
if (Msg.LParam==(UINT)Button[n]->Handle) {
ShowMessage("你按了按钮\"" + Button[
n]->Caption + '\"');
break;
}
}
}

在上面的例子里,我动态添加了2个按钮,并且在第2个按钮的右边自己
画了一个矩形。这样,按照上面的写法,你自己可以做一些修改。上面
的代码,实现了自画,响应按钮消息等功能,还有实现了动态生成控件
的功能。注意,所有的控件,它的Parent必须为Form,否则Form收不到
控件的消息。
goldolphin 2002-08-05
  • 打赏
  • 举报
回复
第一个问题中,标题这样的属性修改是解决了,只是如要自画等这些功能不知该怎么做,事件响应又用不了,偶不懂object pascal(pascal其实就不会)。还有一个小问题,能否在拖动和泊定过程中的控件不是一个虚框,而是动态显示内容的?我系统的显示属性中已经设置了“拖动时显示窗口内容”。

第二个问题,是不是说非得从TCustomDockForm派生呢?但是这样生成了窗口显示时看不到设计期放入的控件,如果要手工添加控件,OnCreate又不能用,在构造函数里做这样的事不太好吧(主要是不太懂VCL的机制,若是MFC,构造函数执行时,窗口系统对象还未真正创建,必会出错)。
Bird1945 2002-08-05
  • 打赏
  • 举报
回复
up
781014 2002-08-04
  • 打赏
  • 举报
回复
goldolphin 2002-08-04
  • 打赏
  • 举报
回复
好,回头试试,衷心感谢!!
jishiping 2002-08-04
  • 打赏
  • 举报
回复
我刚才研究了一下,对于TCustomDockForm来说,它没有任何事件。我估计你
建立TPrjMgrForm时,是由IDE自动产生的,基类为TForm,然后你自己手动修改它的基类为TCustomDockForm。所以这时,你仍然可以设定Form的事件,但
实际上这些事件时不起作用的。你查一下Help就知道了,TCustomDockForm确
实是没有任何事件的,只有几个属性和一些函数。现在你明白为什么你写的
那些事件为什么没有被执行了吧。至于TCustomDockForm的标题,它的标题为
它的子窗口的标题,也就是那个被拖动的窗口的标题。可是对TTreeView来说,
它又没有属性Caption,那么该如何设定它的Caption呢?这时需要用API来实
现:SetWindowText(trvPrjTree->Handle, "工程管理器");这样当它被拖拉
到外面时,窗口的标题就变成"工程管理器"了。如果你想由TCustomDockForm
派生一个class,你可以参见TToolDockForm的源程序,在toolwin.pas里面。
TToolDockForm就是TToolBar使用的FloatingDockSiteClass。
goldolphin 2002-08-04
  • 打赏
  • 举报
回复
UP
goldolphin 2002-08-03
  • 打赏
  • 举报
回复
不知各位有否看懂我的意思??
UP
goldolphin 2002-08-03
  • 打赏
  • 举报
回复
谢谢楼上的指点

有关源代码如下
问题如前述。
//UMainWnd.cpp——我的主窗口的CPP文件,是MDI的,其上有一个Panel控件
//TPanel *pnlPrjDockSite 作为DockSite,其中泊定了一个树控件
//TTreeView *trvPrjTree
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "UMainWnd.h"
#include "UPrjMgrForm.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainWnd *frmMainWnd;
//---------------------------------------------------------------------------
__fastcall TMainWnd::TMainWnd(TComponent* Owner)
: TForm(Owner)
{
}

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


void __fastcall TMainWnd::FormCreate(TObject *Sender)
{
// 设置控件floating状态的父窗口 。
trvPrjTree->FloatingDockSiteClass=__classid(TPrjMgrForm);
}
//--------------------------------------------------------------------------

void __fastcall TMainWnd::trvPrjTreeMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if(Button==mbLeft)
((TTreeView *)Sender)->BeginDrag(false);//用手动drag&dock
}



//UPrjMgrForm.cpp——树控件成为floating 状态时的父窗口CPP文件
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "UPrjMgrForm.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
//---------------------------------------------------------------------------
__fastcall TPrjMgrForm::TPrjMgrForm(TComponent* Owner)
: TCustomDockForm(Owner)
{
Caption="工程管理器";//这些改动在运行中都没有体现,包括下面
//的事件响应的代码。这就是问题之所在。
}
//---------------------------------------------------------------------------
void __fastcall TPrjMgrForm::FormCreate(TObject *Sender)
{
Caption="工程管理器";
MessageBox(NULL,"floated","f",MB_OK);
}
//---------------------------------------------------------------------------
void __fastcall TPrjMgrForm::FormClose(TObject *Sender,
TCloseAction &Action)
{
MessageBox(NULL,"floated","f",MB_OK);

}
//---------------------------------------------------------------------------
void __fastcall TPrjMgrForm::FormPaint(TObject *Sender)
{
MessageBox(NULL,"floated","f",MB_OK);

}
//---------------------------------------------------------------------------
goldolphin 2002-08-03
  • 打赏
  • 举报
回复
谢谢楼上的指点

有关源代码如下
问题如前述。
//UMainWnd.cpp——我的主窗口的CPP文件,是MDI的,其上有一个Panel控件
//TPanel *pnlPrjDockSite 作为DockSite,其中泊定了一个树控件
//TTreeView *trvPrjTree
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "UMainWnd.h"
#include "UPrjMgrForm.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainWnd *frmMainWnd;
//---------------------------------------------------------------------------
__fastcall TMainWnd::TMainWnd(TComponent* Owner)
: TForm(Owner)
{
}

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


void __fastcall TMainWnd::FormCreate(TObject *Sender)
{
// 设置控件floating状态的父窗口 。
trvPrjTree->FloatingDockSiteClass=__classid(TPrjMgrForm);
}
//--------------------------------------------------------------------------

void __fastcall TMainWnd::trvPrjTreeMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if(Button==mbLeft)
((TTreeView *)Sender)->BeginDrag(false);//用手动drag&dock
}



//UPrjMgrForm.cpp——树控件成为floating 状态时的父窗口CPP文件
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "UPrjMgrForm.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
//---------------------------------------------------------------------------
__fastcall TPrjMgrForm::TPrjMgrForm(TComponent* Owner)
: TCustomDockForm(Owner)
{
Caption="工程管理器";//这些改动在运行中都没有体现,包括下面
//的事件响应的代码。这就是问题之所在。
}
//---------------------------------------------------------------------------
void __fastcall TPrjMgrForm::FormCreate(TObject *Sender)
{
Caption="工程管理器";
MessageBox(NULL,"floated","f",MB_OK);
}
//---------------------------------------------------------------------------
void __fastcall TPrjMgrForm::FormClose(TObject *Sender,
TCloseAction &Action)
{
MessageBox(NULL,"floated","f",MB_OK);

}
//---------------------------------------------------------------------------
void __fastcall TPrjMgrForm::FormPaint(TObject *Sender)
{
MessageBox(NULL,"floated","f",MB_OK);

}
//---------------------------------------------------------------------------
jishiping 2002-08-03
  • 打赏
  • 举报
回复
你讲的我没有做过,所以对你上面讲的不是很明白。我想很多人都是不明白
你的意思,所以才没有跟你的帖子。可以的话,你就多贴一些相关的代码在
上面(需要是真正的代码,而不是伪代码),意思不明白,看了试了代码就
知道是怎么回事了,这样大家才可以发言。在CSDN上,很少有人跟贴的情况,
一般是有一定难度,但是贴主讲的大家又没有明白,所以干脆就不跟贴了。
如果很难,但是大家明白怎么回事,即使不会,也会有人说一些无关紧要的
话(如up,我不会,帮你up),当然也会有人帮你想办法。没有人跟贴,我想
还是大家不明白你的意思。
加载更多回复(1)

604

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 控件与界面
社区管理员
  • 控件与界面社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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