如何转换坐标系

horizon2003 2003-05-13 12:07:01
通常情况下,坐标系得原点总是在窗口的左上角的,我希望把原点设置成和普通的一样即左下角,因为我要做很多的坐标处理,这样更方便。windows有一个函数,SetWindowOrgEx(HDC hdc,int X,int Y,LPPOINT lpPoint),其中最后一个参数在delphi下使用ppoint类型,用来指定原来的原点。
可是我使用时总是在ppoint那里出错,ppoint类型在帮助里查不到,不知道该怎么设定。
谁能帮帮忙,在线等待
...全文
130 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
智商无下限 2003-05-13
  • 打赏
  • 举报
回复
刚刚注意到,楼上的好多星星呀!大家都来看星星呀!!!!!!!
智商无下限 2003-05-13
  • 打赏
  • 举报
回复
楼上的写的这么多!那我就不插嘴了!呵呵。。。。
TechnoFantasy 2003-05-13
  • 打赏
  • 举报
回复
改变视口以及窗口的范围以及原点

var
Form1: TForm1;
WOrigin: TPoint; // 保存窗口原点
VOrigin: TPoint; // 保存视口原点
WExt: TPoint; // 保存窗口范围
VExt: TPoint; // 保存视口范围
MyDisplayDC: HDC; // 保存设备环境
MyMapMode: Integer; // 保存映射模式

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
{设置原始跟踪条得缩放}
TrackbarSWOX.Max := Panel1.Width;
TrackbarSWOY.Max := Panel1.Height;
TrackbarSVOX.Max := Panel1.Width;
TrackbarSVOY.Max := Panel1.Height;

{将跟踪条初始化到中间位置}
TrackbarSWOX.Position := TrackbarSWOY.Max div 2;
TrackbarSWOY.Position := TrackbarSWOX.Max div 2;
TrackbarSVOX.Position := TrackbarSVOY.Max div 2;
TrackbarSVOY.Position := TrackbarSVOX.Max div 2;
TrackbarSWEX.Position := TrackbarSWEY.Max div 2;
TrackbarSWEY.Position := TrackbarSWEX.Max div 2;
TrackbarSVEX.Position := TrackbarSVEY.Max div 2;
TrackbarSVEY.Position := TrackbarSVEX.Max div 2;
end;

procedure TForm1.ReportPosition;
var
ReturnValue: TPoint; // 保存窗口与视口原点
ReturnSize: TSize; // 保存窗口与视口范围
ReadMapMode: Integer; // 保存映射模式
ReadFinalOrigin: TPoint; // 保存设备原点
begin
{显示窗口原点}
GetWindowOrgEx(MyDisplayDC,ReturnValue);
Label9.Caption := IntToStr(ReturnValue.x)
+ ', ' + IntToStr(ReturnValue.y);

{显示视口原点}
GetViewportOrgEx(MyDisplayDC,ReturnValue);
Label10.Caption := IntToStr(ReturnValue.x)
+ ', ' + IntToStr(ReturnValue.y);

{显示窗口范围}
GetWindowExtEx(MyDisplayDC,ReturnSize);
Label11.Caption := IntToStr(ReturnSize.cx)
+ ', ' + IntToStr(ReturnSize.cy);

{显示视口范围}
GetViewportExtEx(MyDisplayDC,ReturnSize);
Label12.Caption := IntToStr(ReturnSize.cx)
+ ', ' + IntToStr(ReturnSize.cy);

{显示当前映射模式}
ReadMapMode := GetMapMode(MyDisplayDC);
case ReadMapMode of
MM_TEXT: LabelGMMresult.Caption := 'MM_TEXT';
MM_ANISOTROPIC:LabelGMMresult.Caption := 'MM_ANISOTROPIC';
MM_ISOTROPIC: LabelGMMresult.Caption := 'MM_ISOTROPIC';
MM_HIENGLISH: LabelGMMresult.Caption := 'MM_HIENGLISH';
MM_HIMETRIC: LabelGMMresult.Caption := 'MM_HIMETRIC';
MM_LOENGLISH: LabelGMMresult.Caption := 'MM_LOENGLISH';
MM_LOMETRIC: LabelGMMresult.Caption := 'MM_LOMETRIC';
MM_TWIPS: LabelGMMresult.Caption := 'MM_TWIPS';
end;

{显示设备环境得最后的平移原点}
GetDCOrgEx(MyDisplayDC, ReadFinalOrigin);
LabelGetDCOrgExResult.Caption := IntToStr(ReadFinalOrigin.X) + ', ' +
IntToStr(ReadFinalOrigin.Y);
end;

procedure TForm1.ReadUserRequest;
begin
{获得选择的映射模式}
case RadioGroup1.ItemIndex of
0: MyMapMode := MM_TEXT;
1: MyMapMode := MM_ANISOTROPIC;
2: MyMapMode := MM_ISOTROPIC;
3: MyMapMode := MM_HIENGLISH;
4: MyMapMode := MM_HIMETRIC;
5: MyMapMode := MM_LOENGLISH;
6: MyMapMode := MM_LOMETRIC;
7: MyMapMode := MM_TWIPS;
end;

{根据跟踪条得位置设置原点和范围值}
WOrigin.x := TrackBarSWOX.Position;
WOrigin.y := TrackBarSWOY.Position;
VOrigin.x := TrackBarSVOX.Position;
VOrigin.y := TrackBarSVOY.Position;
WExt.x := TrackBarSWEX.Position;
WExt.y := TrackBarSWEY.Position;
VExt.x := TrackBarSVEX.Position;
VExt.y := TrackBarSVEY.Position;
end;

procedure TForm1.PaintImage;
begin
{获得panel的设备环境}
MyDisplayDC := GetDC(Panel1.Handle);

{删除当前图像}
Panel1.Repaint;

{获得用户自定义值}
ReadUserRequest;

{将映射模式设置为选择的值}
SetMapMode(MyDisplayDC, MyMapMode);
if Checkbox1.Checked
then SetWindowOrgEx(MyDisplayDC, WOrigin.x, WOrigin.y, nil);
if Checkbox2.Checked
then SetViewportOrgEx(MyDisplayDC, VOrigin.x, VOrigin.y, nil);
if Checkbox3.Checked
then SetWindowExtEx(MyDisplayDC, WExt.x, WExt.y, nil);
if Checkbox4.Checked
then SetViewportExtEx(MyDisplayDC, VExt.x, VExt.y, nil);

{绘制图像}
Windows.Rectangle(MyDisplayDC,0,0,50,50);
Windows.Rectangle(MyDisplayDC,-25,24,75,26);
Windows.Rectangle(MyDisplayDC,24,-25,26,75);

{显示当前设置}
ReportPosition;

{释放设备环境}
ReleaseDC(Panel1.Handle, MyDisplayDC);
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
{display the image}
PaintImage;
end;
sysu 2003-05-13
  • 打赏
  • 举报
回复
var pt: TPoint;

SetWindowOrgEx(hdc, 0, 0, @pt);
horizon2003 2003-05-13
  • 打赏
  • 举报
回复
to TechnoFantasy
你好!我把你的程序敲进去,可是原点好像并没有改变。
procedure TForm1.Button2Click(Sender: TObject);
var
worigin:Tpoint;
preorg:Tpoint;
begin
worigin.X:=0;
worigin.Y:=panel1.ClientHeight ;
MYdisplaydc:=getdc(panel1.Handle);
panel1.Repaint ;
setmapmode(mydisplaydc,1);
SetWindowOrgEx(MyDisplayDC, WOrigin.x, WOrigin.y, nil);
SetViewportOrgEx(MyDisplayDC, WOrigin.x, WOrigin.y, nil);
Windows.Rectangle(MyDisplayDC,0,0,50,50);
ReportPosition;
end;

reportposition和你的是完全一样的。结果时,矩形框仍然显示在左上角,尽管reportposition报告的坐标原点已经改变了。
horizon2003 2003-05-13
  • 打赏
  • 举报
回复
谢谢TechnoFantasy了,好强阿
崇拜ing
myling 2003-05-13
  • 打赏
  • 举报
回复
1,2,3,4,5

晕死

今天遇见神仙姐姐了


哈哈

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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