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

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

?? tntmenus.pas

?? Delphi知道現在也沒有提供Unicode支持
?? PAS
?? 第 1 頁 / 共 3 頁
字號:

{*****************************************************************************}
{                                                                             }
{    Tnt Delphi Unicode Controls                                              }
{      http://www.tntware.com/delphicontrols/unicode/                         }
{        Version: 2.3.0                                                       }
{                                                                             }
{    Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com)       }
{                                                                             }
{*****************************************************************************}

unit TntMenus;

{$INCLUDE TntCompilers.inc}

interface

uses
  Windows, Classes, Menus, Graphics, Messages;

type
{TNT-WARN TMenuItem}
  TTntMenuItem = class(TMenuItem{TNT-ALLOW TMenuItem})
  private
    FIgnoreMenuChanged: Boolean;
    FCaption: WideString;
    FHint: WideString;
    FKeyboardLayout: HKL;
    function GetCaption: WideString;
    procedure SetInheritedCaption(const Value: AnsiString);
    procedure SetCaption(const Value: WideString);
    function IsCaptionStored: Boolean;
    procedure UpdateMenuString(ParentMenu: TMenu);
    function GetAlignmentDrawStyle: Word;
    function MeasureItemTextWidth(ACanvas: TCanvas; const Text: WideString): Integer;
    function GetHint: WideString;
    procedure SetInheritedHint(const Value: AnsiString);
    procedure SetHint(const Value: WideString);
    function IsHintStored: Boolean;
  protected
    procedure DefineProperties(Filer: TFiler); override;
    function GetActionLinkClass: TMenuActionLinkClass; override;
    procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override;
    procedure MenuChanged(Rebuild: Boolean); override;
    procedure AdvancedDrawItem(ACanvas: TCanvas; ARect: TRect;
      State: TOwnerDrawState; TopLevel: Boolean); override;
    procedure DoDrawText(ACanvas: TCanvas; const ACaption: WideString;
      var Rect: TRect; Selected: Boolean; Flags: Integer);
    procedure MeasureItem(ACanvas: TCanvas; var Width, Height: Integer); override; 
  public
    procedure InitiateAction; override;
    procedure Loaded; override;
    function Find(ACaption: WideString): TMenuItem{TNT-ALLOW TMenuItem};
  published
    property Caption: WideString read GetCaption write SetCaption stored IsCaptionStored;
    property Hint: WideString read GetHint write SetHint stored IsHintStored;
  end;

{TNT-WARN TMainMenu}
  TTntMainMenu = class(TMainMenu{TNT-ALLOW TMainMenu})
  protected
    procedure DoChange(Source: TMenuItem{TNT-ALLOW TMenuItem}; Rebuild: Boolean); override;
  public
    {$IFDEF COMPILER_9_UP}
    function CreateMenuItem: TMenuItem{TNT-ALLOW TMenuItem}; override;
    {$ENDIF}
  end;

{TNT-WARN TPopupMenu}
  TTntPopupMenu = class(TPopupMenu{TNT-ALLOW TPopupMenu})
  protected
    procedure DoChange(Source: TMenuItem{TNT-ALLOW TMenuItem}; Rebuild: Boolean); override;
  public
    constructor Create(AOwner: TComponent); override;
    {$IFDEF COMPILER_9_UP}
    function CreateMenuItem: TMenuItem{TNT-ALLOW TMenuItem}; override;
    {$ENDIF}
    destructor Destroy; override;
    procedure Popup(X, Y: Integer); override;
  end;

{TNT-WARN NewSubMenu}
function WideNewSubMenu(const ACaption: WideString; hCtx: THelpContext;
  const AName: TComponentName; const Items: array of TTntMenuItem;
    AEnabled: Boolean): TTntMenuItem;
{TNT-WARN NewItem}
function WideNewItem(const ACaption: WideString; AShortCut: TShortCut;
  AChecked, AEnabled: Boolean; AOnClick: TNotifyEvent; hCtx: THelpContext;
    const AName: TComponentName): TTntMenuItem;

function MessageToShortCut(Msg: TWMKeyDown): TShortCut;

{TNT-WARN ShortCutToText}
function WideShortCutToText(WordShortCut: Word): WideString;
{TNT-WARN TextToShortCut}
function WideTextToShortCut(Text: WideString): TShortCut;
{TNT-WARN GetHotKey}
function WideGetHotkey(const Text: WideString): WideString;
{TNT-WARN StripHotkey}
function WideStripHotkey(const Text: WideString): WideString;
{TNT-WARN AnsiSameCaption}
function WideSameCaption(const Text1, Text2: WideString): Boolean;

function WideGetMenuItemCaption(MenuItem: TMenuItem{TNT-ALLOW TMenuItem}): WideString;
function WideGetMenuItemHint(MenuItem: TMenuItem{TNT-ALLOW TMenuItem}): WideString;

procedure NoOwnerDrawTopLevelItems(Menu: TMainMenu{TNT-ALLOW TMainMenu});

procedure FixMenuBiDiProblem(Menu: TMenu);

function MenuItemHasBitmap(MenuItem: TMenuItem{TNT-ALLOW TMenuItem}): Boolean;

type
  TTntPopupList = class(TPopupList)
  private
    SavedPopupList: TPopupList;
  protected
    procedure WndProc(var Message: TMessage); override;
  end;

var
  TntPopupList: TTntPopupList;

implementation

uses
  Forms, SysUtils, Consts, ActnList, ImgList, TntControls, TntGraphics,
  TntActnList, TntClasses, TntForms, TntSysUtils, TntWindows;

function WideNewSubMenu(const ACaption: WideString; hCtx: THelpContext;
  const AName: TComponentName; const Items: array of TTntMenuItem;
    AEnabled: Boolean): TTntMenuItem;
var
  I: Integer;
begin
  Result := TTntMenuItem.Create(nil);
  for I := Low(Items) to High(Items) do
    Result.Add(Items[I]);
  Result.Caption := ACaption;
  Result.HelpContext := hCtx;
  Result.Name := AName;
  Result.Enabled := AEnabled;
end;

function WideNewItem(const ACaption: WideString; AShortCut: TShortCut;
  AChecked, AEnabled: Boolean; AOnClick: TNotifyEvent; hCtx: THelpContext;
    const AName: TComponentName): TTntMenuItem;
begin
  Result := TTntMenuItem.Create(nil);
  with Result do
  begin
    Caption := ACaption;
    ShortCut := AShortCut;
    OnClick := AOnClick;
    HelpContext := hCtx;
    Checked := AChecked;
    Enabled := AEnabled;
    Name := AName;
  end;
end;

function MessageToShortCut(Msg: TWMKeyDown): TShortCut;
var
  ShiftState: TShiftState;
begin
  ShiftState := Forms.KeyDataToShiftState(TWMKeyDown(Msg).KeyData);
  Result := Menus.ShortCut(TWMKeyDown(Msg).CharCode, ShiftState);
end;

function WideGetSpecialName(WordShortCut: Word): WideString;
var
  ScanCode: Integer;
  KeyName: array[0..255] of WideChar;
begin
  Assert(Win32PlatformIsUnicode);
  Result := '';
  ScanCode := MapVirtualKeyW(WordRec(WordShortCut).Lo, 0) shl 16;
  if ScanCode <> 0 then
  begin
    GetKeyNameTextW(ScanCode, KeyName, SizeOf(KeyName));
    Result := KeyName;
  end;
end;

function WideGetKeyboardChar(Key: Word): WideChar;
var
  LatinNumChar: WideChar;
begin
  Assert(Win32PlatformIsUnicode);
  Result := WideChar(MapVirtualKeyW(Key, 2));
  if (Key in [$30..$39]) then
  begin
    // Check to see if "0" - "9" can be used if all that differs is shift state
    LatinNumChar := WideChar(Key - $30 + Ord('0'));
    if (Result <> LatinNumChar)
    and (Byte(Key) = WordRec(VkKeyScanW(LatinNumChar)).Lo) then  // .Hi would be the shift state
      Result := LatinNumChar;
  end;
end;

function WideShortCutToText(WordShortCut: Word): WideString;
var
  Name: WideString;
begin
  if (not Win32PlatformIsUnicode)
  or (WordRec(WordShortCut).Lo in [$08..$09 {BKSP, TAB}, $0D {ENTER}, $1B {ESC}, $20..$28 {Misc Nav},
                               $2D..$2E {INS, DEL}, $70..$87 {F1 - F24}])
  then
    Result := ShortCutToText{TNT-ALLOW ShortCutToText}(WordShortCut)
  else begin
    case WordRec(WordShortCut).Lo of
      $30..$39: Name := WideGetKeyboardChar(WordRec(WordShortCut).Lo); {1-9,0}
      $41..$5A: Name := WideGetKeyboardChar(WordRec(WordShortCut).Lo); {A-Z}
      $60..$69: Name := WideGetKeyboardChar(WordRec(WordShortCut).Lo); {numpad 1-9,0}
    else
      Name := WideGetSpecialName(WordShortCut);
    end;
    if Name <> '' then
    begin
      Result := '';
      if WordShortCut and scShift <> 0 then Result := Result + SmkcShift;
      if WordShortCut and scCtrl <> 0 then Result := Result + SmkcCtrl;
      if WordShortCut and scAlt <> 0 then Result := Result + SmkcAlt;
      Result := Result + Name;
    end
    else Result := '';
  end;
end;

{ This function is *very* slow.  Use sparingly.  Return 0 if no VK code was
  found for the text }

function WideTextToShortCut(Text: WideString): TShortCut;

  { If the front of Text is equal to Front then remove the matching piece
    from Text and return True, otherwise return False }

  function CompareFront(var Text: WideString; const Front: WideString): Boolean;
  begin
    Result := (Pos(Front, Text) = 1);
    if Result then
      Delete(Text, 1, Length(Front));
  end;

var
  Key: TShortCut;
  Shift: TShortCut;
begin
  Result := 0;
  Shift := 0;
  while True do
  begin
    if      CompareFront(Text, SmkcShift) then Shift := Shift or scShift
    else if CompareFront(Text, '^')       then Shift := Shift or scCtrl
    else if CompareFront(Text, SmkcCtrl)  then Shift := Shift or scCtrl
    else if CompareFront(Text, SmkcAlt)   then Shift := Shift or scAlt
    else Break;
  end;
  if Text = '' then Exit;
  for Key := $08 to $255 do { Copy range from table in ShortCutToText }
    if WideSameText(Text, WideShortCutToText(Key)) then
    begin
      Result := Key or Shift;
      Exit;
    end;
end;

function WideGetHotkeyPos(const Text: WideString): Integer;
var
  I, L: Integer;
begin
  Result := 0;
  I := 1;
  L := Length(Text);
  while I <= L do
  begin
    if (Text[I] = cHotkeyPrefix) and (L - I >= 1) then
    begin
      Inc(I);
      if Text[I] <> cHotkeyPrefix then
        Result := I; // this might not be the last
    end;
    Inc(I);
  end;
end;

function WideGetHotkey(const Text: WideString): WideString;
var
  I: Integer;
begin
  I := WideGetHotkeyPos(Text);
  if I = 0 then
    Result := ''
  else
    Result := Text[I];
end;

function WideStripHotkey(const Text: WideString): WideString;
var
  I: Integer;
begin
  Result := Text;
  I := 1;
  while I <= Length(Result) do
  begin
    if Result[I] = cHotkeyPrefix then
      if SysLocale.FarEast
      and ((I > 1) and (Length(Result) - I >= 2)
      and (Result[I - 1] = '(') and (Result[I + 2] = ')')) then begin
        Delete(Result, I - 1, 4);
        Dec(I, 2);
      end else
        Delete(Result, I, 1);
    Inc(I);
  end;
end;

function WideSameCaption(const Text1, Text2: WideString): Boolean;
begin
  Result := WideSameText(WideStripHotkey(Text1), WideStripHotkey(Text2));
end;

function WideSameCaptionStr(const Text1, Text2: WideString): Boolean;
begin
  Result := WideSameStr(WideStripHotkey(Text1), WideStripHotkey(Text2));
end;

function WideGetMenuItemCaption(MenuItem: TMenuItem{TNT-ALLOW TMenuItem}): WideString;
begin
  if MenuItem is TTntMenuItem then
    Result := TTntMenuItem(MenuItem).Caption
  else
    Result := MenuItem.Caption;
end;

function WideGetMenuItemHint(MenuItem: TMenuItem{TNT-ALLOW TMenuItem}): WideString;
begin
  if MenuItem is TTntMenuItem then
    Result := TTntMenuItem(MenuItem).Hint
  else
    Result := MenuItem.Hint;
end;

procedure NoOwnerDrawTopLevelItems(Menu: TMainMenu{TNT-ALLOW TMainMenu});
{If top-level items are created as owner-drawn, they will not appear as raised
buttons when the mouse hovers over them. The VCL will often create top-level
items as owner-drawn even when they don't need to be (owner-drawn state can be
set on an item-by-item basis). This routine turns off the owner-drawn flag for
top-level items if it appears unnecessary}

  function ItemHasValidImage(Item: TMenuItem{TNT-ALLOW TMenuItem}): boolean;
  var
    Images: TCustomImageList;
  begin
    Assert(Item <> nil, 'TNT Internal Error: ItemHasValidImage: item = nil');
    Images := Item.GetImageList;
    Result := (Assigned(Images) and (Item.ImageIndex >= 0) and (Item.ImageIndex < Images.Count))
           or (MenuItemHasBitmap(Item) and (not Item.Bitmap.Empty))
  end;

var
  HM: HMenu;
  i: integer;
  Info: TMenuItemInfoA;
  Item: TMenuItem{TNT-ALLOW TMenuItem};
  Win98Plus: boolean;
begin
  if Assigned(Menu) then begin
    Win98Plus:= (Win32MajorVersion > 4)
      or((Win32MajorVersion = 4) and (Win32MinorVersion > 0));
    if not Win98Plus then
      Exit; {exit if Windows 95 or NT 4.0}
    HM:= Menu.Handle;
    Info.cbSize:= sizeof(Info);
    for i := 0 to GetMenuItemCount(HM) - 1 do begin
      Info.fMask:= MIIM_FTYPE or MIIM_ID;
      if not GetMenuItemInfo(HM, i, true, Info) then
        Break;
      if Info.fType and MFT_OWNERDRAW <> 0 then begin
        Item:= Menu.FindItem(Info.wID, fkCommand);
        if not Assigned(Item) then
          continue;
        if Assigned(Item.OnDrawItem)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品一区二区在线免费观看| 欧美男人的天堂一二区| 一本大道av伊人久久综合| 69堂国产成人免费视频| 中文字幕乱码亚洲精品一区| 蜜臀精品久久久久久蜜臀 | 日韩亚洲欧美综合| 国产精品不卡一区二区三区| 免费成人深夜小野草| 在线观看一区二区视频| 国产精品嫩草影院av蜜臀| 精东粉嫩av免费一区二区三区| 欧美三级日韩在线| 亚洲乱码一区二区三区在线观看| 国产精品一区二区久久不卡| 欧美一区二区三区在线看| 一区二区三区在线免费视频| 99国产精品视频免费观看| 久久精品一区二区三区不卡牛牛 | 欧美日韩卡一卡二| 亚洲欧美自拍偷拍| 丁香婷婷综合网| 久久综合九色综合97_久久久| 午夜电影久久久| 欧美欧美午夜aⅴ在线观看| 亚洲久草在线视频| 91麻豆国产福利在线观看| 欧美高清一级片在线观看| 国产电影精品久久禁18| 久久久久久久久一| 国产精品系列在线观看| 久久久久久一级片| 国产91露脸合集magnet| 国产精品人人做人人爽人人添| 国产不卡高清在线观看视频| 中文字幕av不卡| 不卡的电影网站| 亚洲欧美乱综合| 欧美三级在线播放| 日韩在线一区二区| 欧美xxxx老人做受| 国产精品自拍av| 国产精品久久久久一区| 色综合天天做天天爱| 亚洲午夜私人影院| 欧美精选一区二区| 激情五月激情综合网| 久久影院午夜片一区| 成人性生交大片免费看在线播放| 国产精品天美传媒| 精品一区中文字幕| 久久久99久久| 在线观看一区二区视频| 免费欧美日韩国产三级电影| 欧美精品一区二区在线观看| 成人午夜激情片| 亚洲成av人片在线观看无码| 精品乱码亚洲一区二区不卡| 丰满少妇在线播放bd日韩电影| 国产偷国产偷亚洲高清人白洁 | 亚洲欧洲精品天堂一级| 欧美羞羞免费网站| 久久9热精品视频| 精品成人一区二区三区| 色综合久久久久久久| 久久丁香综合五月国产三级网站| 国产精品日韩成人| 日韩欧美国产麻豆| 99久久精品国产一区二区三区| 五月天欧美精品| 欧美国产精品一区二区| 欧美肥胖老妇做爰| yourporn久久国产精品| 久久精品国产亚洲高清剧情介绍| 中文字幕一区二区三区视频| 日韩一级片网站| 在线观看日产精品| 成人动漫一区二区| 麻豆免费看一区二区三区| 亚洲欧美日韩系列| 国产日韩欧美电影| 欧美大尺度电影在线| 一本大道久久a久久精二百| 国产福利一区二区三区视频| 日日骚欧美日韩| 亚洲精品免费在线播放| 国产欧美日韩不卡| 精品噜噜噜噜久久久久久久久试看| 色婷婷av一区二区三区之一色屋| 国产一区免费电影| 免费在线看成人av| 亚洲国产日日夜夜| 中文字幕欧美一区| 国产精品免费久久| 久久久亚洲欧洲日产国码αv| 在线成人高清不卡| 欧美三级电影一区| 91传媒视频在线播放| 99久久伊人久久99| 国产成人亚洲综合a∨婷婷| 精品中文字幕一区二区| 秋霞成人午夜伦在线观看| 亚洲成人tv网| 亚洲国产日韩一级| 亚洲va欧美va人人爽午夜| 一区二区三区资源| 亚洲蜜臀av乱码久久精品蜜桃| 欧美精彩视频一区二区三区| 久久久国产精品午夜一区ai换脸| 欧美一级在线观看| 91精品欧美综合在线观看最新 | 国产欧美一区二区精品秋霞影院| 欧美一级欧美三级| 6080国产精品一区二区| 91精品免费观看| 在线成人小视频| 日韩欧美第一区| 精品少妇一区二区三区视频免付费 | 亚洲福中文字幕伊人影院| 亚洲综合在线五月| 亚洲成a人片综合在线| 日韩电影在线观看一区| 久久99精品久久久久久国产越南 | 中国色在线观看另类| 专区另类欧美日韩| 亚洲一区二区视频在线| 午夜精品免费在线观看| 免费成人在线视频观看| 国产福利一区二区三区视频在线 | 日韩激情一区二区| 久久www免费人成看片高清| 国产精品亚洲成人| www.欧美.com| 欧美在线观看禁18| 7777精品伊人久久久大香线蕉 | 国产91精品欧美| 99久久夜色精品国产网站| 欧美在线免费观看亚洲| 精品久久久久一区二区国产| 中文字幕久久午夜不卡| 一区二区三区中文字幕电影| 麻豆国产欧美日韩综合精品二区 | 亚洲欧美在线观看| 亚洲国产日韩精品| 国产麻豆视频一区二区| 色素色在线综合| 欧美tickling挠脚心丨vk| 国产精品毛片a∨一区二区三区| 亚洲一二三区不卡| 久久99国产精品麻豆| 91色在线porny| 精品毛片乱码1区2区3区| 中文字幕亚洲不卡| 麻豆精品国产传媒mv男同| 91网站在线播放| 精品成人一区二区三区| 亚洲综合网站在线观看| 国产精品77777竹菊影视小说| 在线中文字幕不卡| 欧美国产丝袜视频| 老司机精品视频一区二区三区| 97成人超碰视| 久久久不卡网国产精品二区| 亚洲国产美国国产综合一区二区| 国产精选一区二区三区 | 色成年激情久久综合| 精品免费视频一区二区| 亚洲一区二区三区精品在线| 国产a区久久久| 91精品国产综合久久蜜臀 | 欧美精品一区二区精品网| 亚洲欧美日韩人成在线播放| 国产精品综合网| 欧美成人vps| 亚洲6080在线| 91色porny在线视频| 久久网这里都是精品| 日韩二区在线观看| 91电影在线观看| 亚洲卡通动漫在线| 99精品黄色片免费大全| 久久精品视频在线免费观看| 老鸭窝一区二区久久精品| 欧美人与禽zozo性伦| 亚洲综合自拍偷拍| 日本道精品一区二区三区| 中文字幕亚洲一区二区av在线| 国产成人精品亚洲777人妖| 精品久久人人做人人爽| 乱一区二区av| 欧美精品一区二区三区久久久| 六月丁香综合在线视频| 日韩欧美亚洲国产精品字幕久久久 | 国产综合久久久久影院| 日韩欧美一区电影| 免费成人在线观看| 日韩欧美国产综合在线一区二区三区| 天使萌一区二区三区免费观看| 欧美伊人精品成人久久综合97| 亚洲乱码中文字幕综合|