📄 unitlayercontrol.pas
字号:
unit UnitLayerControl;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, MapXLib_TLB, ExtCtrls, OleCtrls;
type
TFrmLayerControl = class(TForm)
BitBtnOK: TBitBtn;
BitBtnCancel: TBitBtn;
GroupBox1: TGroupBox;
CheckBoxVisible: TCheckBox;
CheckBoxSelectable: TCheckBox;
CheckBoxEditable: TCheckBox;
GroupBox2: TGroupBox;
ListBoxLayers: TListBox;
BitBtnUp: TBitBtn;
BitBtnDown: TBitBtn;
BitBtnAdd: TBitBtn;
BitBtnRemove: TBitBtn;
OpenDialog1: TOpenDialog;
BitBtnNew: TBitBtn;
TimerInfo: TTimer;
procedure FormCreate(Sender: TObject);
procedure BitBtnAddClick(Sender: TObject);
procedure BitBtnRemoveClick(Sender: TObject);
procedure ListBoxLayersKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure BitBtnUpClick(Sender: TObject);
procedure BitBtnDownClick(Sender: TObject);
procedure Fill_Layers();
procedure SelectLayerNum_zero();
procedure Control_UpDownBtn();
procedure Enabled_PropertyPan();
procedure View_PropertyPan();
procedure Edit_PropertyPan();
procedure ListBoxLayersMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure CheckBoxVisibleMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure CheckBoxSelectableMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure CheckBoxAutoLablesMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure CheckBoxEditableMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure BitBtnNewClick(Sender: TObject);
procedure BitBtnOKClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure TimerInfoTimer(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormDestroy(Sender: TObject);
private
procedure WMNCPaint(var Msg: TWMNCPaint); message WM_NCPAINT;
{ Private declarations }
public
{ Public declarations }
end;
var
FrmLayerControl: TFrmLayerControl;
SelectLayerNum, BeforeLayerNum: Integer;
GMap: TMap;
OnShowing: Boolean;
implementation
uses UnitMain, UnitNewLayer, UnitCommonModule, UnitModify, UnitEagleEye;
{$R *.dfm}
procedure TFrmLayerControl.WMNCPaint(var Msg: TWMNCPaint);
var
dc : hDc;
Pen : hPen;
OldPen : hPen;
OldBrush : hBrush;
begin
inherited;
dc := GetWindowDC(Handle);
msg.Result := 1;
Pen := CreatePen(PS_SOLID, 2, RGB(255, 0, 0));
OldPen := SelectObject(dc, Pen);
OldBrush := SelectObject(dc, GetStockObject(NULL_BRUSH));
if OnShowing and TimerInfo.Enabled then Windows.Rectangle(dc, 0, 0, Width, Height+5);
if Not TimerInfo.Enabled then Windows.Rectangle(dc, 0, 0, Width, Height);
if Not OnShowing and TimerInfo.Enabled then Windows.Rectangle(dc, 0, 0, Width, Height-5);
SelectObject(dc, OldBrush);
SelectObject(dc, OldPen);
DeleteObject(Pen);
ReleaseDC(Handle, Canvas.Handle);
end;
procedure TFrmLayerControl.Fill_Layers;
var
i, j: Integer;
begin
With FrmMain do
begin
GMap.Layers.RemoveAll;
for i := BeforeLayerNum downto 1 do
begin
GMap.Layers.Add(Map1.Layers[i].FileSpec, 0);
if GMap.Layers[1].Name <> Map1.Layers[i].Name then
begin
for j := 1 to GMap.Layers.Count do
if GMap.Layers[j].Name = Map1.Layers[i].Name then break;
GMap.Layers.Move(j, 1);
end;
GMap.Layers[1].Visible := Map1.Layers[i].Visible;
GMap.Layers[1].Selectable := Map1.Layers[i].Selectable;
// ld(i).InitPos = i
// ld(i).LabelChanged = False
// ld(i).StyleChanged = False
GMap.Layers[1].Editable := Map1.Layers[i].Editable;
GMap.Layers[1].ZoomLayer := Map1.Layers[i].ZoomLayer;
GMap.Layers[1].ZoomMin := Map1.Layers[i].ZoomMin;
GMap.Layers[1].ZoomMax := Map1.Layers[i].ZoomMax;
// GMap.Layers[1].Name := Map1.Layers[1].Name;
GMap.Layers[1].OverrideStyle := Map1.Layers[i].OverrideStyle;
GMap.Layers[1].Style := Map1.Layers[i].Style;
// GMap.Layers[Map1.Layers[i].Name].LabelProperties.Style := Map1.Layers[i].LabelProperties.Style;
end;
end;
end;
procedure TFrmLayerControl.SelectLayerNum_zero;
begin
BitBtnRemove.Enabled:=False;
CheckBoxVisible.Enabled:=False;
CheckBoxSelectable.Enabled:=False;
CheckBoxEditable.Enabled:=False;
CheckBoxVisible.Checked:=False;
CheckBoxSelectable.Checked:=False;
CheckBoxEditable.Checked:=False;
end;
procedure TFrmLayerControl.Control_UpDownBtn;
begin
// 0 1
if ListBoxLayers.Count<2 then
begin
BitBtnUp.Enabled:=False;
BitBtnDown.Enabled:=False;
end;
// >= 2
if ListBoxLayers.Count>=2 then
if SelectLayerNum=1 then
begin
BitBtnUp.Enabled:=False;
BitBtnDown.Enabled:=True;
end
else if SelectLayerNum=ListBoxLayers.Count then
begin
BitBtnUp.Enabled:=True;
BitBtnDown.Enabled:=False;
end
else begin
BitBtnUp.Enabled:=True;
BitBtnDown.Enabled:=True;
end;
if ListBoxLayers.Count>0 then ListBoxLayers.Selected[SelectLayerNum-1]:=True;
end;
procedure TFrmLayerControl.Enabled_PropertyPan;
begin
CheckBoxVisible.Enabled:=True;
CheckBoxSelectable.Enabled:=True;
CheckBoxEditable.Enabled:=True;
end;
procedure TFrmLayerControl.View_PropertyPan;
begin
if SelectLayerNum<>0 then
begin
Enabled_PropertyPan;
CheckBoxVisible.Checked:=GMap.Layers[SelectLayerNum].Visible;
CheckBoxSelectable.Checked:=GMap.Layers[SelectLayerNum].Selectable;
CheckBoxEditable.Checked:=GMap.Layers[SelectLayerNum].Editable;
if Not CheckBoxEditable.Checked then
CheckBoxSelectable.Checked := False;
end;
end;
procedure TFrmLayerControl.Edit_PropertyPan;
begin
if SelectLayerNum<>0 then
begin
GMap.Layers[SelectLayerNum].Visible := CheckBoxVisible.Checked;
GMap.Layers[SelectLayerNum].Selectable := CheckBoxSelectable.Checked;
GMap.Layers[SelectLayerNum].Editable := CheckBoxEditable.Checked;
if Not CheckBoxEditable.Checked then
CheckBoxSelectable.Checked := False;
end;
end;
procedure TFrmLayerControl.FormCreate(Sender: TObject);
begin
GMap:= TMap.Create(GMap);
OpenDialog1.Filter := 'MapInfo Tables(*.TAB)|*.TAB';
OpenDialog1.Title := '请选择图层';
OpenDialog1.InitialDir:=ExeFilePath+'Maps';
end;
procedure TFrmLayerControl.BitBtnAddClick(Sender: TObject);
var
i: Integer;
FName: String;
begin
if OpenDialog1.Execute then
begin
GMap.Layers.Add(OpenDialog1.FileName, 0);
FName := ExtractFileName(OpenDialog1.FileName);
Delete(FName, StrLen(Pchar(FName))-3, 4);
if GMap.Layers[1].Name <> FName then
begin
for i := 1 to GMap.Layers.Count do
if GMap.Layers[i].Name = FName then break;
GMap.Layers.Move(i, 1);
end;
ListBoxLayers.Items.Insert(0, GMap.Layers[1].Name);
ListBoxLayers.Selected[0]:=True;
SelectLayerNum:=1;
BitBtnRemove.Enabled:=True;
end;
Control_UpDownBtn;
View_PropertyPan;
end;
procedure TFrmLayerControl.BitBtnRemoveClick(Sender: TObject);
begin
GMap.Layers.Remove(SelectLayerNum);
ListBoxLayers.Items.Delete(SelectLayerNum-1);
// 处理下一个选择的图层
if ListBoxLayers.Count>0 then
begin
if SelectLayerNum=ListBoxLayers.Count+1
then SelectLayerNum:=SelectLayerNum-1;
end else SelectLayerNum:=0;
if SelectLayerNum=0 then SelectLayerNum_zero
else ListBoxLayers.Selected[SelectLayerNum-1]:=True;
Control_UpDownBtn;
View_PropertyPan;
end;
procedure TFrmLayerControl.ListBoxLayersKeyUp(Sender: TObject;
var Key: Word; Shift: TShiftState);
var
i: Integer;
begin
for i:=1 to ListBoxLayers.Count do
if ListBoxLayers.Selected[i-1] then SelectLayerNum:=i;
Control_UpDownBtn;
View_PropertyPan;
end;
procedure TFrmLayerControl.BitBtnUpClick(Sender: TObject);
begin
GMap.Layers.Move(SelectLayerNum, SelectLayerNum-1);
ListBoxLayers.Items.Move(SelectLayerNum-1, SelectLayerNum-2);
SelectLayerNum:=SelectLayerNum-1;
Control_UpDownBtn;
View_PropertyPan;
end;
procedure TFrmLayerControl.BitBtnDownClick(Sender: TObject);
begin
GMap.Layers.Move(SelectLayerNum+1, SelectLayerNum);
ListBoxLayers.Items.Move(SelectLayerNum, SelectLayerNum-1);
SelectLayerNum:=SelectLayerNum+1;
Control_UpDownBtn;
View_PropertyPan;
end;
procedure TFrmLayerControl.ListBoxLayersMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
i: Integer;
begin
for i:=1 to ListBoxLayers.Count do
if ListBoxLayers.Selected[i-1] then SelectLayerNum:=i;
Control_UpDownBtn;
View_PropertyPan;
end;
procedure TFrmLayerControl.CheckBoxVisibleMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
Edit_PropertyPan;
end;
procedure TFrmLayerControl.CheckBoxSelectableMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
Edit_PropertyPan;
end;
procedure TFrmLayerControl.CheckBoxAutoLablesMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
Edit_PropertyPan;
end;
procedure TFrmLayerControl.CheckBoxEditableMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
Edit_PropertyPan;
end;
procedure TFrmLayerControl.BitBtnNewClick(Sender: TObject);
begin
if FrmNewLayer = Nil then
Application.CreateForm(TFrmNewLayer, FrmNewLayer);
FrmNewLayer.ShowModal;
upDate_LayerToFtTypes();
end;
procedure TFrmLayerControl.BitBtnOKClick(Sender: TObject);
var
i, j: Integer;
begin
With FrmMain do
begin
Map1.AutoRedraw:=False;
Map1.Layers.RemoveAll;
for i := GMap.Layers.Count downto 1 do
begin
Map1.Layers.Add(GMap.Layers[i].FileSpec, 0);
if Map1.Layers[1].Name <> GMap.Layers[i].Name then
begin
for j := 1 to Map1.Layers.Count do
if Map1.Layers[j].Name = GMap.Layers[i].Name then break;
Map1.Layers.Move(j, 1);
end;
Map1.Layers[1].Visible := GMap.Layers[i].Visible;
Map1.Layers[1].Selectable := GMap.Layers[i].Selectable;
// ld(i).InitPos = i
// ld(i).LabelChanged = False
// ld(i).StyleChanged = False
Map1.Layers[1].Editable := GMap.Layers[i].Editable;
Map1.Layers[1].ZoomLayer := GMap.Layers[i].ZoomLayer;
Map1.Layers[1].ZoomMin := GMap.Layers[i].ZoomMin;
Map1.Layers[1].ZoomMax := GMap.Layers[i].ZoomMax;
// Map1.Layers[1].Name := GMap.Layers[i].Name;
Map1.Layers[1].OverrideStyle := GMap.Layers[i].OverrideStyle;
Map1.Layers[1].Style := GMap.Layers[i].Style;
// Map1.Layers[1].LabelProperties := GMap.Layers[i].LabelProperties;
end;
if Map1.Layers.Count>0 then
Map1.SaveMapAsGeoset('JLU-MAP', ExeFilePath+'Maps\JLU-MAP.GST');
Map1.AutoRedraw:=True;
Map1.Refresh;
FrmEagleEye.MapEagleEye.Refresh;
// upDate LayerToFtTypes
upDate_LayerToFtTypes();
// 绑定图层
BindLayerToDataset();
end;
// 修改窗体的初始化设置
FrmModify.SetIniFrmModify();
end;
procedure TFrmLayerControl.FormShow(Sender: TObject);
var
i: Integer;
begin
TimerInfo.Enabled := True;
OnShowing := True;
BeforeLayerNum := FrmMain.Map1.Layers.Count;
Fill_Layers;
ListBoxLayers.Clear;
for i:=1 to GMap.Layers.Count do
ListBoxLayers.Items.Add(GMap.Layers[i].Name);
if ListBoxLayers.Count=0 then // 没有图层
begin
BitBtnRemove.Enabled:=False;
SelectLayerNum:=0;
end
else begin
BitBtnRemove.Enabled:=True;
SelectLayerNum:=1;
end;
Control_UpDownBtn;
View_PropertyPan;
end;
procedure TFrmLayerControl.TimerInfoTimer(Sender: TObject);
begin
if OnShowing then
begin
Height := Height + 5;
if Height > 275 then TimerInfo.Enabled := False;
end
else
begin
Height := Height - 5;
if Height < 30 then
begin
TimerInfo.Enabled := False;
Close;
end;
end;
end;
procedure TFrmLayerControl.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
if Height > 30 then
begin
CanClose := False;
OnShowing := False;
TimerInfo.Enabled := True;
end;
end;
procedure TFrmLayerControl.FormDestroy(Sender: TObject);
begin
GMap.Destroy;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -