亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? main.pas

?? [原創]這是我寫的一個圖像組件!組件中使用了GraphicEx庫
?? PAS
?? 第 1 頁 / 共 2 頁
字號:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Menus, ActnList, ComCtrls, StdCtrls;

type
  TMainForm = class(TForm)
    MainMenu1: TMainMenu;
    Browsefolder1: TMenuItem;
    Browsefile1: TMenuItem;
    N1: TMenuItem;
    Exit1: TMenuItem;
    ActionList1: TActionList;
    Action1: TAction;
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Exit1Click(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure Action1Execute(Sender: TObject);
  private
    FThumbFrame,
    FThumbOffset,
    FTextHeight: Integer;
    FFileList: TList;
    FSelectedImage,
    FThumbWidth,
    FThumbHeight,
    FLastIndex: Integer;
    FDirectory: String;
    procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;
    procedure CalculateSize;
    procedure ClearFileList;
    procedure RescaleImage(Source, Target: TBitmap; FastStretch: Boolean);
    procedure CalculateCounts(var XCount, YCount, HeightPerLine, ImageWidth: Integer);
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

//----------------------------------------------------------------------------------------------------------------------

implementation

{$R *.DFM}

uses
  FileCtrl, GraphicEx,
  ShlObj, ActiveX; // these both just for the SelectDirectory function

type
  PFileEntry = ^TFileEntry;
  TFileEntry = record
    Name: String;
    Bitmap: TBitmap;
  end;

//----------------------------------------------------------------------------------------------------------------------

function BrowseCallbackProc(hwnd: HWND; uMsg: UINT; lParam, lpData: LPARAM): Integer; stdcall;

// callback function used in SelectDirectory to set the status text and choose an initial dir

var
  Path: array[0..MAX_PATH] of Char;
  X, Y: Integer;
  R: TRect;

begin
  case uMsg of
    BFFM_INITIALIZED:
      begin
        // Initialization has been done, now set our initial directory which is passed in lpData
        // (and set btw. the status text too).
        // Note: There's no need to cast lpData to a PChar since the following call needs a
        //       LPARAM parameter anyway.
        SendMessage(hwnd, BFFM_SETSELECTION, 1, lpData);
        SendMessage(hwnd, BFFM_SETSTATUSTEXT, 0, lpData);

        // place the dialog screen centered
        GetWindowRect(hwnd, R);
        X := (Screen.Width - (R.Right - R.Left)) div 2;
        Y := (Screen.Height - (R.Bottom - R.Top)) div 2;
        SetWindowPos(hwnd, 0, X, Y, 0, 0, SWP_NOSIZE or SWP_NOZORDER); 
      end;
    BFFM_SELCHANGED:
      begin
        // Set the status window to the currently selected path.
        if SHGetPathFromIDList(Pointer(lParam), Path) then SendMessage(hwnd, BFFM_SETSTATUSTEXT, 0, Integer(@Path));
      end;
  end;
  Result := 0;
end;

//----------------------------------------------------------------------------------------------------------------------

function SelectDirectory(const Caption, InitialDir: String; const Root: WideString;
                         ShowStatus: Boolean; out Directory: String): Boolean;

// Another browse-for-folder function with the ability to select an intial directory
// (other SelectDirectory functions are in FileCtrl.pas).

var
  BrowseInfo: TBrowseInfo;
  Buffer: PChar;
  RootItemIDList,
  ItemIDList: PItemIDList;
  ShellMalloc: IMalloc;
  IDesktopFolder: IShellFolder;
  Eaten, Flags: LongWord;
  Windows: Pointer;
  Path: String;

begin
  Result := False;
  Directory := '';
  Path := InitialDir;
  if (Length(Path) > 0) and (Path[Length(Path)] = '\') then Delete(Path, Length(Path), 1);
  FillChar(BrowseInfo, SizeOf(BrowseInfo), 0);
  if (ShGetMalloc(ShellMalloc) = S_OK) and (ShellMalloc <> nil) then
  begin
    Buffer := ShellMalloc.Alloc(MAX_PATH);
    try
      SHGetDesktopFolder(IDesktopFolder);
      IDesktopFolder.ParseDisplayName(Application.Handle, nil, PWideChar(Root), Eaten, RootItemIDList, Flags);
      with BrowseInfo do
      begin
        hwndOwner := Application.Handle;
        pidlRoot := RootItemIDList;
        pszDisplayName := Buffer;
        lpszTitle := PChar(Caption);
        ulFlags := BIF_RETURNONLYFSDIRS;
        if ShowStatus then ulFlags := ulFlags or BIF_STATUSTEXT;
        lParam := Integer(PChar(Path));
        lpfn := BrowseCallbackProc;
      end;

      // make the browser dialog modal
      Windows := DisableTaskWindows(Application.Handle);
      try
        ItemIDList := ShBrowseForFolder(BrowseInfo);
      finally
        EnableTaskWindows(Windows);
      end;

      Result :=  ItemIDList <> nil;
      if Result then
      begin
        ShGetPathFromIDList(ItemIDList, Buffer);
        ShellMalloc.Free(ItemIDList);
        Directory := Buffer;
      end;
    finally
      ShellMalloc.Free(Buffer);
    end;
  end;
end;

//----------------------------------------------------------------------------------------------------------------------

procedure TMainForm.FormCreate(Sender: TObject);

begin
  // the space to be left between the border and the content in an image (horizontally and vertically)
  FThumbFrame := 2;
  // the space to be left between two adjacent images (horizontally and vertically)
  FThumbOffset := 15;
  // height of the entire text area below each image
  FTextHeight := 15;
  // thumb size
  FThumbWidth := 100;
  FThumbHeight := 100;

  FSelectedImage := -1;
  
  FFileList := TList.Create;
end;

//----------------------------------------------------------------------------------------------------------------------

procedure TMainForm.WMEraseBkgnd(var Message: TWMEraseBkgnd);

begin
  Message.Result := 1;
end;

//----------------------------------------------------------------------------------------------------------------------

procedure TMainForm.CalculateCounts(var XCount, YCount, HeightPerLine, ImageWidth: Integer);

begin
  // How many images per line?
  ImageWidth := FThumbWidth + 2 * (FThumbFrame + 1) + FThumbOffset;
  XCount := Trunc((ClientWidth + FThumbOffset) / ImageWidth);
  if XCount = 0 then XCount := 1;
  // How many (entire) images above the client area?
  HeightPerLine := FThumbHeight + 2 * (FThumbFrame + 1) + FThumbOffset + FTextHeight;
  YCount := Trunc(VertScrollBar.Position / HeightPerLine);
end;

//----------------------------------------------------------------------------------------------------------------------

procedure TMainForm.FormPaint(Sender: TObject);

var
  XPos,
  YPos,
  Index,
  XCount,
  YCount,
  HeightPerLine,
  ImageWidth,
  EraseTop: Integer;
  R,
  ImageR,
  TextR: TRect;
  S: String;
  ImageData: PFileEntry;

begin
  with Canvas do
  begin
    // calculate and set initial values
    Brush.Color := clBtnHighlight;
    Pen.Width := FThumbFrame;
    Pen.Color := clBtnHighlight;

    CalculateCounts(XCount, YCount, HeightPerLine, ImageWidth);
    // vertical draw offset is then:
    YPos := 5 - VertScrollBar.Position + YCount * HeightPerLine;
    // finally we need the image index to start with
    Index := XCount * YCount;
    // from where to start erasing unfilled parts
    EraseTop := 0;

    // now loop until the client area is filled 
    if Index < FFileList.Count then 
    repeat
      XPos := (Index mod XCount) * ImageWidth;

      if (FLastIndex = -1) or (Index >= FLastIndex) then
      begin
        // get current image
        ImageData := FFileList[Index]; 
       
        // determine needed display area 
        R := Rect(XPos, YPos, XPos + FThumbWidth + 2 * (FThumbFrame + 1),
          YPos + FThumbHeight + 2 * (FThumbFrame + 1) + FTextHeight);

        S := ExtractFileName(ImageData.Name);
        TextR := R; 
        TextR.Top := TextR.Bottom - FTextHeight; 
        OffsetRect(TextR, 0, -(1 + FThumbFrame)); 
        InflateRect(TextR, -(1 + FThumbFrame), 0); 

        // skip images not shown in the client area 
        if R.Bottom > 0 then 
        begin 
          // early out if client area is filled 
          if R.Top > Height then Break; 

          // fill thumb frame area (frame only to avoid flicker)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区高清免费观看影视大全| 99久久精品费精品国产一区二区| 国产高清久久久| 欧美丝袜丝交足nylons| 久久网站最新地址| 亚洲成人免费av| 97se亚洲国产综合自在线 | 精品国产一二三区| 一区二区三区毛片| 99久免费精品视频在线观看 | 免费观看一级欧美片| 91福利社在线观看| 国产精品国产馆在线真实露脸| 麻豆视频观看网址久久| 欧美麻豆精品久久久久久| 亚洲视频一二三区| 成人午夜在线免费| 国产亚洲短视频| 国产精品系列在线播放| 日韩精品在线一区| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美色爱综合网| 亚洲无人区一区| 精品视频资源站| 亚洲国产cao| 欧美亚洲高清一区二区三区不卡| 日韩毛片一二三区| 99久久99久久精品国产片果冻| 国产精品青草久久| 成人免费va视频| 国产精品美女久久久久高潮| 成人中文字幕合集| 亚洲欧洲色图综合| 色噜噜狠狠成人网p站| 亚洲一区二区三区在线看| 欧美影院一区二区三区| 亚洲国产一区二区三区青草影视 | 欧美一区在线视频| 蜜桃av一区二区在线观看 | 国产精品美女久久久久aⅴ | 日韩一区二区免费电影| 青青草伊人久久| 久久综合九色综合欧美98| 国产一区二区调教| 中文字幕制服丝袜一区二区三区 | 国产酒店精品激情| 中文字幕亚洲在| 欧美天堂一区二区三区| 男人的天堂久久精品| 久久久亚洲精品石原莉奈| 国产suv精品一区二区三区| 国产精品传媒入口麻豆| 欧美日韩综合在线| 韩国欧美国产一区| 亚洲色图在线看| 91精品国产品国语在线不卡| 九九精品视频在线看| 国产精品第13页| 91精品一区二区三区在线观看| 久久99精品久久久久久动态图| 精品粉嫩aⅴ一区二区三区四区| 国产成人啪免费观看软件| 亚洲视频免费在线| 精品欧美一区二区三区精品久久| www.亚洲人| 美女一区二区视频| 亚洲三级电影网站| 精品剧情在线观看| 91福利精品第一导航| 国产一区二区看久久| 亚洲一区免费在线观看| 久久婷婷国产综合国色天香| 91浏览器在线视频| 国产一区二区免费在线| 午夜精品一区在线观看| 国产精品剧情在线亚洲| 日韩欧美国产综合在线一区二区三区| 国产**成人网毛片九色| 亚洲成人tv网| 中文字幕制服丝袜一区二区三区| 制服丝袜中文字幕亚洲| eeuss鲁片一区二区三区在线观看| 五月激情六月综合| 亚洲精品欧美综合四区| 国产午夜精品美女毛片视频| 日韩亚洲欧美成人一区| 色婷婷久久99综合精品jk白丝| 国内精品免费**视频| 日韩高清不卡一区二区三区| 中文字幕日本不卡| 久久久久久久精| 日韩天堂在线观看| 欧美浪妇xxxx高跟鞋交| 91国偷自产一区二区三区成为亚洲经典| 韩日av一区二区| 另类综合日韩欧美亚洲| 日一区二区三区| 亚洲伊人色欲综合网| 亚洲天堂精品视频| 亚洲国产岛国毛片在线| xf在线a精品一区二区视频网站| 91精品国产综合久久蜜臀| 欧美午夜片在线观看| 欧美在线一二三| 91成人免费电影| 91黄色免费看| 在线观看av一区二区| 色94色欧美sute亚洲线路一ni| 不卡av电影在线播放| 成人av中文字幕| 国产福利电影一区二区三区| 国产精品99久久久久久久女警| 久久se精品一区精品二区| 久久精品国产色蜜蜜麻豆| 久久er99精品| 国产成人在线色| 波多野结衣欧美| 91啪在线观看| 欧美亚洲免费在线一区| 欧美人牲a欧美精品| 91麻豆精品久久久久蜜臀| 91麻豆精品国产91久久久久久久久 | 亚洲精品国久久99热| 一区二区三区日韩| 亚洲成人一区在线| 免费日本视频一区| 国产福利一区二区三区在线视频| 国产高清不卡一区| 成人激情黄色小说| 欧美日韩中文精品| 欧美va在线播放| 欧美激情一区二区| 亚洲乱码国产乱码精品精可以看| 亚洲最大成人综合| 日韩av一区二区三区四区| 韩国欧美国产一区| 成年人午夜久久久| 欧美日韩国产区一| 亚洲精品一线二线三线无人区| 中文欧美字幕免费| 亚洲成在线观看| 精久久久久久久久久久| 成av人片一区二区| 6080日韩午夜伦伦午夜伦| 精品va天堂亚洲国产| 成人欧美一区二区三区黑人麻豆 | 久久精品久久99精品久久| 成人高清免费观看| 欧美男人的天堂一二区| 亚洲精品一区二区三区99| 中文字幕一区二区在线播放| 亚洲一区二区视频在线| 国产精品99久久久久久有的能看| 色先锋久久av资源部| 精品欧美一区二区在线观看| 亚洲精品国产a| 国内久久精品视频| 欧美日韩一二三| 中文字幕一区二区三区乱码在线 | 日韩avvvv在线播放| 国产成人av一区二区三区在线观看| 91在线视频观看| 精品久久人人做人人爽| 亚洲一区二区欧美日韩| 国产一区二区在线观看视频| 欧美亚洲精品一区| 中文字幕在线不卡一区| 激情都市一区二区| 4438x亚洲最大成人网| 亚洲人亚洲人成电影网站色| 久久精品免费看| 欧美日韩一区 二区 三区 久久精品| 国产欧美一区二区在线| 天天综合天天做天天综合| 一本到三区不卡视频| 日本一区二区成人| 国产主播一区二区| 欧美一级艳片视频免费观看| 亚洲一区二区三区四区不卡| av电影在线不卡| 国产欧美日韩一区二区三区在线观看| 免费成人美女在线观看.| 在线亚洲精品福利网址导航| 国产精品国产a| 成人av综合在线| 2023国产精品自拍| 久久99久久精品| 日韩精品一区二区三区在线播放 | 亚洲综合激情小说| 91蜜桃婷婷狠狠久久综合9色| 国产欧美日韩一区二区三区在线观看| 九一久久久久久| 久久亚洲私人国产精品va媚药| 免费av网站大全久久| 91精品国产高清一区二区三区蜜臀 | 成人激情av网| 国产精品国模大尺度视频| 成人av在线电影| 亚洲欧美激情插 | 日韩高清在线观看|