头痛:排版的问题(128分)

  • 主题发起人 主题发起人 szchengyu
  • 开始时间 开始时间
S

szchengyu

Unregistered / Unconfirmed
GUEST, unregistred user!
现Image上要画上几幅图片,然后用键盘(最多10个键)手动调整它们的大小和位置,
并且在调整其中任一个时,自动调整其它的图片,保持整个版面形状和空隙基本不变

好像涉及到算法,没什么头绪,想到就头晕

帮帮忙吧,给点思路也行



 
没人理?
是我表达太不清楚?

天哪,怎么办?
 
你要干什么用,说清楚,大家给你出主意
 
你真好人,我要排版!
调整IMAGE上的图片(1张到9张)的大小,位置,保持它们互不重叠,空隙最小
而每张图片长宽比例固定,总的长宽比例也固定

并且::::只能用键盘来调整

哇,又写了一遍了,知道我心里急什么了嘛?
 
键盘控制和长宽比例不变都可以解决
但这个算法好象确实难了点,我想想
 
等待。。。。。。。。
等待。。。。。。。。。。。。。。。。。
 
不确定量似乎太多了.....
要是算法可以参考一下内存分配算法
 
你可以根据image的left,top,width,heigth属性来重新调整其他的image的left,top
to szchengyu:你的排版中有没有涉及到文字,如果有的话,能否交流一下。我也想做一个
排版软件,现在不知道文字怎么处理。
如果哪位大虾知道,请指点一下(有分的)
lcy20@163.com
 
帮你提前
 
haha,
我前几天刚问问过相似的问题。没有得到解决。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=768626
在网上找了一个例子,你试试。这是用鼠标来排列窗体中的控件

unit SizerControl;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
TSizerControl = class(TCustomControl)
private
FControl: TControl;
FRectList: Array [1..8] of TRect;
FPosList: Array [1..8] of Integer;

{ Private declarations }
protected
{ Protected declarations }
public
constructor Create(AOwner: TComponent; AControl: TControl);
procedure CreateParams(var Params: TCreateParams); override;
procedure Createhandle;override;
procedure WmNcHitTest(var Msg: TWmNcHitTest); message wm_NcHitTest;
procedure WmSize(var Msg:TWmSize); message wm_Size;
procedure WmLButtonDown(var Msg: TWmLButtonDown); message wm_LButtonDown;
procedure WmMove(var Msg: TWmMove); message Wm_Move;
procedure Paint; override;
procedure SizeControlExit(Sender: TObject);

{ Public declarations }
published
{ Published declarations }
end;
const
sc_DragMove: Longint = $F012;


procedure Register;

implementation

constructor TSizerControl.Create(AOwner: TComponent; AControl: TControl);
var
R: TRect;
begin
inherited Create(AOwner);
FControl := AControl;
OnExit := SizeControlExit;

R := FControl.BoundsRect;
InflateRect(R, 2, 2);
BoundsRect := R;
Parent := FControl.Parent;
FPosList[1] := htTopLeft;
FPosList[2] := htTop;
FPosList[3] := htTopRight;
FPosList[4] := htRight;
FPosList[5] := htBottomRight;
FPosList[6] := htBottom;
FPosList[7] := htBottomLeft;
FPosList[8] := htLeft;

end;
procedure TSizerControl.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
//增加透明特性
Params.ExStyle := Params.ExStyle
+ WS_EX_TRANSPARENT;
end;

procedure TSizerControl.Createhandle;
begin
inherited Createhandle;
SetFocus;
end;

procedure TSizerControl.WmNcHitTest(var Msg: TWmNcHitTest);
var
Pt: TPoint;
I: Integer;
begin
Pt := Point(Msg.XPos, Msg.YPos);
Pt := ScreenToClient(Pt);
Msg.Result := 0;
//检测鼠标位置并改变状态
for I := 1 to 8 do
if PtInRect(FRectList, Pt) then
Msg.Result := FPosList;
if Msg.Result = 0 then
inherited;
end;


procedure TSizerControl.WmSize(var Msg:TWmSize);
var
R: TRect;
begin
R := BoundsRect;
InflateRect( R, -2, -2);
FControl.BoundsRect := R;
//计算8个黑方框
FRectList[1] := Rect(0 ,0, 5, 5);
FRectList[2] := Rect(Width div 2 - 3, 0, Width div 2 + 2, 5);
FRectList[3] := Rect(Width - 5, 0, Width, 5);
FRectList[4] := Rect(Width - 5, height div 2 - 3, Width, Height div 2 + 2);
FRectList[5] := Rect(Width - 5, Height - 5, Width, Height);
FRectList[6] := Rect(Width div 2 - 3, Height - 5, Width div 2 + 2, Height);
FRectList[7] := Rect(0, Height -5, 5, Height);
FRectList[8] := Rect(0, Height div 2 - 3, 5, Height div 2 + 2);
end;


procedure TSizerControl.WmLButtonDown(var Msg: TWmLButtonDown);
begin
//执行拖动命令
Perform(Wm_SysCommand, sc_DragMove, 0);
end;

procedure TSizerControl.WmMove(var Msg: TWmMove);
var
R: TRect;
begin
R := BoundsRect;
InflateRect( R, -2, -2);
FControl.Invalidate;
FControl.BoundsRect := R;
end;

procedure TSizerControl.Paint;
var
I: Integer;
begin
Canvas.Brush.Color := clBlack;
for I := 1 to 8 do
with FRectList do
Canvas.Rectangle (Left, Top, Right, Bottom);
end;

procedure TSizerControl.SizeControlExit(Sender: TObject);
begin
Free;
end;

procedure Register;
begin
RegisterNoicon([TSizerControl]);
end;

end

主窗口程序:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
btn: TButton;
GroupBox1: TGroupBox;
procedure btnMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure GroupBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private

{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
uses SizerControl;

{$R *.DFM}

procedure TForm1.btnMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
SizeControl: TSizerControl;
begin
SizeControl := TSizerControl.Create(self, btn);
end;

procedure TForm1.GroupBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
SizeControl: TSizerControl;
begin
SizeControl := TSizerControl.Create(self, GroupBox1);
end;

end.

 
怎样?楼上兄台的是不是你想要的?
只不过,思路有点乱罢了,可以达到预期效果。
 
to SSGYK:
能不能说说你的思路
 
做图像编辑就几个问题:
 1、解决鼠标在图像位置上问题。
 2、解决鼠标拖动图像不闪烁问题。
 3、解决图像放大与缩小上的问题。
 4、解决变换过程中按比例变换的问题。
   1) Shift 键
   2) Windows 98 坐标不支持32位坐标的问题。

看看你要将你的排版软件做成什么样。
另外还有,你目录的思路是将使用多个Image控件,还是只使用一个Image
控件的问题。
如果你只使用一个Image控件还应该解决层与层之间图像显示问题也就是图像引擎,
OK,先到这,下班了。
 
To SSGYK:
我要的是文字的排版的思路!!!
 
做文字排版与图像排版从意义上来讲其方法都是一样的。
只不过做文字排版时会比图像问题出的了多。
即:文字需要缩放,字间距,行间距等。
如果你是使用VC的话这些问题会比较简单点,呵呵!Delphi
Delphi的第一个问题当你的目标尺寸超过3000x3000时完了,系统很容易崩溃。
    第二个问题来自Window的消息处理的并不是很省事,部分根本无法实际。
现在来讲讲我个人的体会(实现文字排版过程)
准备内容数据也就是版面内容这个实现与所有程序类似。
在文字的处理上需要有一个专门的容器来存放这些数据,即文字,行间距,字间距,字体
字号等等。
在文字的构造上我会使用元文件(矢量图)
创建矢量图有二种方法
hMFT:TMetaFile;
hMFT = TMetaFile.Create;
///////////////////////////////////
HENHMETAFILE hMFT;
hMFT = CreateEnhMetaFile(pDC,NULL);
在元文件在准备好所有规矩数据(版面效果),最后将这些体现在屏幕上。
有一个需要攻关的问题:
  实现文字绕排这个问题本人大致上想了一个,不过到目前没有尝试过。
希望能互想得到点好的启发。

可以到我上次的问题
http://www.delphibbs.com/delphibbs/dispq.asp?lid=740754
里看看一个关于图像的小例子。
 
to SSGYK:

谢谢你这么热心解答我的问题,我还没考虑那么复杂的东东
只是我的程序里只有图像,没文字,并且只能用键盘,不用鼠标
 
哪你到我的问题里将代码复制编译你就可以用了,那是个移动的例子
 
多人接受答案了。
 
后退
顶部