不知道DELPHI到底有没有模板这个概念,想要实现这样一个功能:
可以在运行期设计窗体(控件拖拉,图片编辑),然后将窗体样式保存为一个文件,这个暂且称它为模板的窗体,可供其它程序调用,就是其它程序可以载入这个文件,然后在它的界面上显示出这个窗体,并且能显示为略缩图的样式!
不知道具体要用到哪种方式?
希望有高人帮帮忙!!!!
可以在运行期设计窗体(控件拖拉,图片编辑),然后将窗体样式保存为一个文件,这个暂且称它为模板的窗体,可供其它程序调用,就是其它程序可以载入这个文件,然后在它的界面上显示出这个窗体,并且能显示为略缩图的样式!
不知道具体要用到哪种方式?
希望有高人帮帮忙!!!!
你把控件在上面摆好做好以后,在Frame上点右键->Add To Palette,就能把这个Frame保存了,以后要用就直接拖出来.其实要实现你的需求,还有一个推荐的方法,就是"继承".
你设计好一个窗体(模板),然后其它窗体类声明时直接继承它就行了,一试就爽,试试吧!
然后你在建一个模板From 在Form上右键选择Add to Repository,设置一个标题,选择你设置的页面保存,以后就可以用File->New->Other 来使用该模板了,复制、引用,继承 都可以。
关于拖动的实现方案网上很多,你搜一下"delphi 运行期 拖动控件",应该有很多收获.
其它编辑也简单,就是编辑那些控件的"属性"吧.2.窗体做为"模板",并由其它程序加载使用.
似乎直接的办法应该就是去加载窗体描述DFM文件.
用到"对象持久化"或叫"串行化"技术.
可以参考VCL源码TCustomForm.Create里是怎样载入DFM资源的.3.显示窗体的缩略图.
这个就相对简单了,就是把窗体的DC保存为图像.
至于缩放完全可以交给TImage去搞定.以上供参考,希望能对楼主有所帮助.
不仅仅是Delphi,其他语言也有持久性特性。你可以把他的内容以流的方式存储,并读出。
郁闷着,不在公司,刚刚找了下资料回去再看一下,谢谢 楼上的兄弟,我没这本书呢。。
http://blog.csdn.net/suiyunonghen/archive/2008/01/03/2022856.aspx
另一个总是就是,如何实现像设计期一样编辑控件的大小位置,就是可拖拉伸缩的功能,同样可画出控件的边框
我试了一下 mouseup,mousedown,mousemove,效果不太理想,不知道有没有什么捷径?
1.运行期可拖拉,大小可改变,就像DELPHI的设计期一样的功能,当然也要有边框线(这个难度不大)
2.文字大小可根据控件的大小自动变化 (字体和像素的转化,麻烦)
3.文字可调透明度(目前还知道怎么实现)
4.控件背景可调透明度(可在canvas 上画位图,通过修改位图的透明度)
5.文字角度可任意旋转(可在canvas 上用 DrawText 来角度旋转)我想通过继承 TGraphicsControl 类来自定义一个控件,但具体不知道要怎么搞,对VCL认识太少了,汗一个......
哪位帮帮忙吧!!!!
procedure TForm1.ManipulateControl(WinControl: TWinControl;
Shift: TShiftState; X, Y, Precision: integer);
//Precision:精度,该方法可以在onmousemove中调用
var SC_MANIPULATE: Word;
begin
//光标在控件的最左侧
if (X <= Precision) and (Y > Precision) and (Y < WinControl.Height - Precision)then
begin
SC_MANIPULATE := $F001;
WinControl.Cursor := crSizeWE;
end
//光标在控件的最右侧
else if (X >= WinControl.Width - Precision) and (Y > Precision) and (Y < WinControl.Height - Precision) then
begin
SC_MANIPULATE := $F002;
WinControl.Cursor := crSizeWE;
end
//光标在控件的最上侧
else if (X > Precision) and (X < WinControl.Width - Precision) and (Y <= Precision) then
begin
SC_MANIPULATE := $F003;
WinControl.Cursor := crSizeNS;
end
//光标在控件的左上角
else if (X <= Precision) and (Y <= Precision) then
begin
SC_MANIPULATE := $F004;
WinControl.Cursor := crSizeNWSE;
end
//光标在控件的右上角
else if (X >= WinControl.Width-Precision) and (Y <= Precision) then
begin
SC_MANIPULATE := $F005;
WinControl.Cursor := crSizeNESW ;
end
//光标在控件的最下侧
else if (X > Precision) and (X < WinControl.Width - Precision) and (Y >= WinControl.Height - Precision) then
begin
SC_MANIPULATE := $F006;
WinControl.Cursor := crSizeNS;
end
//光标在控件的左下角
else if (X <= Precision) and (Y >= WinControl.Height - Precision) then
begin
SC_MANIPULATE := $F007;
WinControl.Cursor := crSizeNESW;
end
//光标在控件的右下角
else if (X >= WinControl.Width - Precision) and (Y >= WinControl.Height - Precision) then
begin
SC_MANIPULATE := $F008;
WinControl.Cursor := crSizeNWSE;
end
//光标在控件的客户区(移动整个控件)
else if (X > 5) and (Y > 5) and (X < WinControl.Width - 5) and (Y < WinControl.Height - 5)then
begin
SC_MANIPULATE := $F009;
WinControl.Cursor := crSizeAll;
end
else
begin
SC_MANIPULATE := $F000;
WinControl.Cursor := crDefault;
end;
if Shift = [ssLeft] then
begin
ReleaseCapture;
WinControl.Perform(WM_SYSCOMMAND, SC_MANIPULATE, 0);
end;
end;
procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Caption := IntToStr(X) + '/' + IntToStr(Y);
ManipulateControl((Sender as TWinControl), Shift, X, Y, 10);
end;