📄 frmmain.pas
字号:
tmpStr: String;
begin
nbExeRes.ActivePage := 'TextPage';
memText.Clear;
tmpStream := TMemoryStream.Create;
try
tmpStream := CurExeImg.GetSegStream(AOffset,ASize);
tmpStream.Seek(0,0);
CurPosition := 0;
tmpStr := '';
while CurPosition < ASize do
begin
tmpStream.Read(tmpByte,SizeOf(tmpByte));
CurPosition := CurPosition + SizeOf(tmpByte);
if tmpByte in [$0A,$0D] then
begin
if tmpByte=$0D then
begin
memText.Lines.Add(tmpStr);
tmpStr := '';
end
end
else if tmpByte in [0..31] then
tmpStr := tmpStr + Format('$%.2x',[tmpByte])
else
tmpStr := tmpStr + Chr(tmpByte);
end;
//输出最后一行。
if tmpStr<>'' then
memText.Lines.Add(tmpStr);
finally
tmpStream.Free;
end;
end;
{ 显示工具栏中按钮对应的ID }
procedure TMainForm.ShowToolItem(AOffset,ASize:Integer);
var
tmpStream: TMemoryStream;
toolbarID: WORD;
CurPosition: Integer;
begin
nbExeRes.ActivePage := 'StringPage';
lvStringRes.Clear;
lvStringRes.Columns[0].Caption := '';
lvStringRes.Columns[1].Caption := '';
tmpStream := TMemoryStream.Create;
try
tmpStream := CurExeImg.GetSegStream(AOffset,ASize);
CurPosition := SizeOf(TToolItemInfo);
tmpStream.Seek(CurPosition,0);
while CurPosition < ASize do
with lvStringRes.Items.Add do
begin
tmpStream.Read(toolbarID,SizeOf(toolbarID));
CurPosition := CurPosition + SizeOf(toolbarID);
Caption := Format('%6d',[toolbarID]);
end;
finally
tmpStream.Free;
end;
end;
{ 显示菜单 }
procedure TMainForm.ShowMenuItem(AOffset,ASize:Integer;MenuText:String);
var
tmpStream: TMemoryStream;
miOption,miID: WORD; //表示菜单的标志及ID,
MenuChar: WChar;
tmpMenuCaption: String;
CurPosition,i: Integer;
popNode: TTreeNode;
topmi,curmi: TMenuItem;
IsTwoSkip,IsFirst: Boolean;
begin
nbExeRes.ActivePage := 'MenuPage';
trvMenuRes.Items.Clear;
{ 菜单资源数据的规则
最前面两个字节(4 Bytes)不知道是什么含义.
最后一个字节(2 Bytes)也不知道是什么含义.
之后读取miOption,如果miOption是MF_POPUP,则miID自动为0而不会保存到这里来。
直到某处的mtOption是$80,表示已经结束了这层POPUP.
否则,miOption<>MF_POPUP,下一个WORD是miID,指示菜单的标识ID.
//此办法在regedit.exe中失效.
}
tmpStream := TMemoryStream.Create;
try
tmpStream := CurExeImg.GetSegStream(AOffset,ASize);
tmpStream.Seek(4,0);
CurPosition := 4;
popNode := nil;
//清除原来的菜单项
for i:=MenuForm.mainmenu.Items.Count-1 downto 0 do
MenuForm.mainmenu.Items.Delete(i);
topmi := MenuForm.mainmenu.Items;
IsTwoSkip := False;
IsFirst := True;
//本部分可处理了多层,通过popNode来控制
while CurPosition < ASize-2 do
begin
//取miOption
tmpStream.Read(miOption,SizeOf(miOption));
CurPosition := CurPosition + SizeOf(miOption);
if (miOption and MF_POPUP) = MF_POPUP then
begin
miID := 0;
end
else begin
tmpStream.Read(miID,SizeOf(miID));
CurPosition := CurPosition + SizeOf(miID);
end;
tmpMenuCaption := '';
//取菜单Caption,当然miOption属于MF_String,即第0位为0,否则处理错误
//只能处理MF_String
Repeat
tmpStream.Read(MenuChar,SizeOf(MenuChar));
CurPosition := CurPosition + SizeOf(MenuChar);
if Ord(MenuChar) in [1..31] then
tmpMenuCaption := tmpMenuCaption + Format('$%.2x',[Ord(MenuChar)])
else
tmpMenuCaption := tmpMenuCaption + MenuChar;
until MenuChar=Chr(0);
tmpMenuCaption := trim(tmpMenuCaption);
if tmpMenuCaption = '' then tmpMenuCaption := '-';
curmi := TMenuItem.Create(self);
if pos('$09',tmpMenuCaption)>0 then
begin
curmi.Caption := Copy(tmpMenuCaption,0,Pos('$09',tmpMenuCaption)-1);
////还有ShortCut
end
else begin
curmi.Caption := tmpMenuCaption;
end;
//将菜单标题显示到一个树状列表同时加到一个形象化的菜单上
if (miOption and MF_POPUP)=MF_POPUP then
begin
popnode := trvMenuRes.Items.AddChild(popnode,Format('%d,%s',[miID,tmpMenuCaption]));
topmi.Add(curmi);
topmi := curmi;
if ((miOption and MF_END)=MF_END)and(not IsFirst) then IsTwoSkip := True;
end
else if (miOption and MF_END)=MF_END then
begin
trvMenuRes.Items.AddChild(popnode,Format('%d,%s',[miID,tmpMenuCaption]));
topmi.Add(curmi);
if popnode<>nil then
begin
popnode := popnode.Parent;
topmi := topmi.Parent;
end;
if (IsTwoSkip)and(popnode<>nil) then
begin
popnode := popnode.Parent;
topmi := topmi.Parent;
IsTwoSkip := False;
end;
end
else begin
trvMenuRes.Items.AddChild(popnode,Format('%d,%s',[miID,tmpMenuCaption]));
topmi.Add(curmi);
end;
IsFirst := False;
end;
trvMenuRes.FullExpand;
////如何将trvMenuRes定位到第一个为显示的,否则超过界面有个滚动条跑到最后
finally
tmpStream.Free;
end;
MenuForm.Caption := Format('菜单 - %s',[MenuText]);
btnShowCtrl.Visible := True;
if BtnShowCtrl.Tag =1 then
begin
btnShowCtrl.Caption := '隐藏菜单(&M)';
MenuForm.Show;
end
else begin
btnShowCtrl.Caption := '显示菜单(&M)';
MenuForm.Hide;
end;
end;
{ 显示对话框 }
procedure TMainForm.ShowDialogBox(AOffset,ASize:Integer);
var
tmpStream: TMemoryStream;
//DlgHandle: THandle;
DlgTemplate: TDlgTemplate;
DlgItemTemplate: TDlgItemTemplate;
tmpWord: WORD;
i: Integer;
tmpwChar: WChar;
IsSkip: Boolean;
tmpStr: String;
tmpButton: TButton;
tmpEdit: TEdit;
tmpStatic: TLabel;
tmpListBox: TListBox;
tmpComboBox: TComboBox;
tmpScrollBox: TScrollBox;
pt1: TPoint;
cm: DWORD;
begin
tmpStream := TMemoryStream.Create;
try
tmpStream := CurExeImg.GetSegStream(AOffset,ASize);
//先遍历所有已存在的控件并删除
for i := DialogForm.ControlCount-1 downto 0 do
DialogForm.Controls[i].Free;
tmpStream.Seek(0,0);
//读取对话框
tmpStream.Read(DlgTemplate,SizeOf(DlgTemplate));
cm := GetDialogBaseUnits;
//跳两个字
tmpStream.Read(tmpWord,SizeOf(tmpWord));
tmpStream.Read(tmpWord,SizeOf(tmpWord));
//取标题
tmpStr := '';
repeat
tmpStream.Read(tmpWChar,SizeOf(tmpWChar));
tmpStr := tmpStr + tmpWChar;
until tmpWChar=Chr(0);
tmpStr := trim(tmpStr);
with DlgTemplate do
begin
pt1.X := LoWORD(cm)*cx div 4;
pt1.Y := HiWORD(cm)*cy div 8;;
//pt1 := ScreenToClient(pt1);
DialogForm.Top :=LoWORD(cm)*x div 4;
DialogForm.Left:=HiWORD(cm)*y div 8;
DialogForm.ClientHeight := pt1.Y;
DialogForm.ClientWidth := pt1.X;
DialogForm.Caption := tmpStr;
end;
//取字号
tmpStream.Read(tmpWord,SizeOf(tmpWord));
//取字体;
tmpStr := '';
repeat
tmpStream.Read(tmpWChar,SizeOf(tmpWChar));
tmpStr := tmpStr + tmpWChar;
until tmpWChar=Chr(0);
tmpStr := trim(tmpStr);
DialogForm.Font.Charset := DEFAULT_CHARSET;
DialogForm.Font.Name := tmpStr;
DialogForm.Font.Size := tmpWord;
//读取每个控件的信息.
for i:=0 to dlgTemplate.cdit-1 do
begin
tmpStream.Read(DlgItemTemplate,SizeOf(DlgItemTemplate));
tmpStream.Read(tmpWord,SizeOf(tmpWord)); //跳过,一般为$FF
tmpStream.Read(tmpWord,SizeOf(tmpWord)); //表示控件类型.
//控件的描述
tmpStream.Read(tmpWChar,SizeOf(tmpWChar));
IsSkip := Ord(tmpWChar)=$FFFF;
//if tmpWChar = Chr($FFFF) then IsSkip := True
tmpStr := tmpWChar;
repeat
tmpStream.Read(tmpWChar,SizeOf(tmpWChar));
tmpStr := tmpStr + tmpWChar;
until tmpWChar=Chr(0);
tmpStr := trim(tmpStr);
if not IsSkip then
tmpStream.Read(tmpWChar,SizeOf(tmpWChar))
else
tmpStr := '';
Case tmpWord of
$0080:
begin
tmpButton := TButton.Create(DialogForm);
tmpButton.Parent := DialogForm;
tmpButton.Left := LoWORD(cm)*DlgItemTemplate.x div 4;
tmpButton.Top := HiWORD(cm)*DlgItemTemplate.y div 8;
tmpButton.Width := LoWORD(cm)*DlgItemTemplate.cx div 4;
tmpButton.Height :=HiWORD(cm)*DlgItemTemplate.cy div 8;
tmpButton.Font.Charset := DialogForm.Font.Charset;
tmpButton.Font.Name := DialogForm.Font.Name;
tmpButton.Font.Size := DialogForm.Font.Size;
tmpButton.Caption := tmpStr;
end;
$0081:
begin
tmpEdit := TEdit.Create(DialogForm);
tmpEdit.Parent := DialogForm;
tmpEdit.Left := LoWORD(cm)*DlgItemTemplate.x div 4;
tmpEdit.Top := HiWORD(cm)*DlgItemTemplate.y div 8;
tmpEdit.Width :=LoWORD(cm)*DlgItemTemplate.cx div 4;
tmpEdit.Height :=HiWORD(cm)*DlgItemTemplate.cy div 8;
tmpEdit.Text := tmpStr;
end;
$0082:
begin
tmpStatic := TLabel.Create(DialogForm);
tmpStatic.Parent := DialogForm;
tmpStatic.Left := LoWORD(cm)*DlgItemTemplate.x div 4;
tmpStatic.Top := HiWORD(cm)*DlgItemTemplate.y div 8;
tmpStatic.Width := LoWORD(cm)*DlgItemTemplate.cx div 4;
tmpStatic.Height :=HiWORD(cm)*DlgItemTemplate.cy div 8;
tmpStatic.Caption := tmpStr;
end;
$0083:
begin
tmpListBox := TListBox.Create(DialogForm);
tmpListBox.Parent := DialogForm;
tmpListBox.Left := DlgItemTemplate.x;
tmpListBox.Top := DlgItemTemplate.y;
tmpListBox.Width := DlgItemTemplate.cx;
tmpListBox.Height := DlgItemTemplate.cy;
//tmpListBox.Caption := tmpStr;
end;
$0084:
begin
tmpScrollBox := TScrollBox.Create(DialogForm);
tmpScrollBox.Parent := DialogForm;
tmpScrollBox.Left := DlgItemTemplate.x;
tmpScrollBox.Top := DlgItemTemplate.y;
tmpScrollBox.Width := DlgItemTemplate.cx;
tmpScrollBox.Height := DlgItemTemplate.cy;
end;
$0085:
begin
tmpComboBox := TComboBox.Create(DialogForm);
tmpComboBox.Parent := DialogForm;
tmpComboBox.Left := DlgItemTemplate.x;
tmpComboBox.Top := DlgItemTemplate.y;
tmpComboBox.Width := DlgItemTemplate.cx;
tmpComboBox.Height := DlgItemTemplate.cy;
end;
end;
end;
{
DlgStream.Seek(0,0);
//读取对话框
DlgStream.Read(DlgTemplate,SizeOf(DlgTemplate));
DlgHandle := CreateDialogIndirect(Application.Handle,DlgTemplate,MainForm.Handle,0);
if DlgHandle<>0 then
ShowWindow(DlgHandle,SW_SHOW);
}
finally
tmpStream.Free;
end;
btnShowCtrl.Caption := '显示对话(&D)';
btnShowCtrl.Tag := 2; //隐藏了对话
btnShowCtrl.Visible := True;
end;
{ 显示位图 }
procedure TMainForm.ShowBitmap(AOffset,ASize:Integer);
var
tmpStream: TMemoryStream;
tmpFileName:String;
//tmpBitmap: TBitmap;
begin
nbExeRes.ActivePage:='ImagePage';
tmpFileName := 'c:\tmp.bmp'; //ExtractFilePath(Application.ExeName)+'tmp.bmp';
tmpStream := TMemoryStream.Create;
try
tmpStream := CurExeImg.GetBitmapStream(AOffset,ASize);
tmpStream.SaveToFile(tmpFileName);
finally
tmpStream.Free;
end;
// 显示位图并调整位置到居中
with ImgPICRes do
begin
Visible:=False;
try
Picture.LoadFromFile(tmpFileName);
deleteFile(tmpFileName);
except
ShowMessage(tmpFileName+' 未找到!');
end;
ScrollBoxImgResize(nil);
Visible:=True;
end;
end;
{ 显示光标 }
procedure TMainForm.ShowCursor(AOffset,ASize,HeaderOffset,NameID:Integer);
var
tmpStream: TMemoryStream;
tmpFileName: String;
bWidth,bHeight:Byte;
begin
{--如果显示位图的能行,则ICON也可以吧
var
tmpICON: TICON;
}
nbExeRes.ActivePage:='ImagePage';
tmpFileName := Format('c:\%d.ico',[NameID]); // ExtractFilePath(Application.ExeName)+InttoStr(NameID)+'.ico';
tmpStream := TMemoryStream.Create;
try
tmpStream := CurExeImg.GetCursorStream(AOffset,ASize,HeaderOffset,NameID);
tmpStream.Seek(6,0);
tmpStream.Read(bWidth,SizeOf(bWidth));
tmpStream.Read(bHeight,SizeOf(bHeight));
tmpStream.SaveToFile(tmpFileName);
// 显示光标并调整位置到居中
with ImgPICRes do
begin
Visible:=False;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -