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

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

?? tntcontrols.pas

?? TNT Components Source
?? 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 TntControls;

{$INCLUDE TntCompilers.inc}

{
  Windows NT provides support for native Unicode windows.  To add Unicode support to a
    TWinControl descendant, override CreateWindowHandle() and call CreateUnicodeHandle().

  One major reason this works is because the VCL only uses the ANSI version of
    SendMessage() -- SendMessageA().  If you call SendMessageA() on a UNICODE
    window, Windows deals with the ANSI/UNICODE conversion automatically.  So
    for example, if the VCL sends WM_SETTEXT to a window using SendMessageA,
    Windows actually *expects* a PAnsiChar even if the target window is a UNICODE
    window.  So caling SendMessageA with PChars causes no problems.

  A problem in the VCL has to do with the TControl.Perform() method. Perform()
    calls the window procedure directly and assumes an ANSI window.  This is a
    problem if, for example, the VCL calls Perform(WM_SETTEXT, ...) passing in a
    PAnsiChar which eventually gets passed downto DefWindowProcW() which expects a PWideChar.

  This is the reason for SubClassUnicodeControl().  This procedure will subclass the
    Windows WndProc, and the TWinControl.WindowProc pointer.  It will determine if the
    message came from Windows or if the WindowProc was called directly.  It will then
    call SendMessageA() for Windows to perform proper conversion on certain text messages.

  Another problem has to do with TWinControl.DoKeyPress().  It is called from the WM_CHAR
    message.  It casts the WideChar to an AnsiChar, and sends the resulting character to
    DefWindowProc.  In order to avoid this, the DefWindowProc is subclassed as well.  WindowProc
    will make a WM_CHAR message safe for ANSI handling code by converting the char code to
    #FF before passing it on.  It stores the original WideChar in the .Unused field of TWMChar.
    The code #FF is converted back to the WideChar before passing onto DefWindowProc.
}

{
  Things to consider when designing new controls:
    1)  Check that a WideString Hint property is published.
    2)  If descending from TWinControl, override CreateWindowHandle().
    3)  If not descending from TWinControl, handle CM_HINTSHOW message.
    4)  Check to make sure that CN_CHAR, CN_SYSCHAR and CM_DIALOGCHAR are handled properly.
    5)  If descending from TWinControl, verify Unicode chars are preserved after RecreateWnd.
    6)  Consider using storage specifiers for Hint and Caption properties.
    7)  If any class could possibly have published WideString properties,
          override DefineProperties and call TntPersistent_AfterInherited_DefineProperties.
    8)  Check if TTntThemeManager needs to be updated.
    9)  Override GetActionLinkClass() and ActionChange().
    10) If class updates Application.Hint then update TntApplication.Hint instead.
}

interface

{ TODO: Unicode enable .OnKeyPress event }

uses
  Classes, Windows, Messages, Controls, Menus;


{TNT-WARN TCaption}
type TWideCaption = type WideString;

// caption/text management
function TntControl_IsCaptionStored(Control: TControl): Boolean;
function TntControl_GetStoredText(Control: TControl; const Default: WideString): WideString;
procedure TntControl_SetStoredText(Control: TControl; const Value: WideString);
function TntControl_GetText(Control: TControl): WideString;
procedure TntControl_SetText(Control: TControl; const Text: WideString);

// hint management
function TntControl_IsHintStored(Control: TControl): Boolean;
function TntControl_GetHint(Control: TControl): WideString;
procedure TntControl_SetHint(Control: TControl; const Value: WideString);

function WideGetHint(Control: TControl): WideString;
function WideGetShortHint(const Hint: WideString): WideString;
function WideGetLongHint(const Hint: WideString): WideString;
procedure ProcessCMHintShowMsg(var Message: TMessage);

type
  TTntCustomHintWindow = class(THintWindow)
  private
    FActivating: Boolean;
    FBlockPaint: Boolean;
    function GetCaption: TWideCaption;
    procedure SetCaption(const Value: TWideCaption);
    procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
  protected
    procedure CreateWindowHandle(const Params: TCreateParams); override;
{$IFNDEF COMPILER_7_UP}
    procedure CreateParams(var Params: TCreateParams); override;
{$ENDIF}
    procedure Paint; override;
  public
    procedure ActivateHint(Rect: TRect; const AHint: AnsiString); override;
    procedure ActivateHintData(Rect: TRect; const AHint: AnsiString; AData: Pointer); override;
    function CalcHintRect(MaxWidth: Integer; const AHint: AnsiString; AData: Pointer): TRect; override;
    property Caption: TWideCaption read GetCaption write SetCaption;
  end;

  TTntHintWindow = class(TTntCustomHintWindow)
  public
    procedure ActivateHint(Rect: TRect; const AHint: WideString); reintroduce;
    procedure ActivateHintData(Rect: TRect; const AHint: WideString; AData: Pointer); reintroduce;
    function CalcHintRect(MaxWidth: Integer; const AHint: WideString; AData: Pointer): TRect; reintroduce;
  end;

// text/char message
function IsTextMessage(Msg: UINT): Boolean;
procedure MakeWMCharMsgSafeForAnsi(var Message: TMessage);
procedure RestoreWMCharMsg(var Message: TMessage);
function GetWideCharFromWMCharMsg(Message: TWMChar): WideChar;
procedure SetWideCharForWMCharMsg(var Message: TWMChar; Ch: WideChar);

// register/create window
procedure SubClassUnicodeControl(Control: TWinControl; Params_Caption: PAnsiChar; IDEWindow: Boolean = False);
procedure RegisterUnicodeClass(Params: TCreateParams; out WideWinClassName: WideString; IDEWindow: Boolean = False);
procedure CreateUnicodeHandle(Control: TWinControl; const Params: TCreateParams;
                                        const SubClass: WideString; IDEWindow: Boolean = False);
procedure ReCreateUnicodeWnd(Control: TWinControl; Subclass: WideString; IDEWindow: Boolean = False);

type
  IWideCustomListControl = interface
    ['{C1801F41-51E9-4DB5-8DB8-58AC86698C2E}']
    procedure AddItem(const Item: WideString; AObject: TObject);
  end;

procedure WideListControl_AddItem(Control: TCustomListControl; const Item: WideString; AObject: TObject);

var
  _IsShellProgramming: Boolean = False;

var
  TNT_WM_DESTROY: Cardinal;

implementation

uses
  ActnList, Forms, SysUtils, Contnrs, 
  TntGraphics, TntWindows, TntClasses, TntMenus, TntSysUtils;

type
  TAccessControl = class(TControl);
  TAccessWinControl = class(TWinControl);
  TAccessControlActionLink = class(TControlActionLink{TNT-ALLOW TControlActionLink});

//----------------------------------------------- WIDE CAPTION HOLDERS --------

{ TWideControlHelper }

var
  WideControlHelpers: TComponentList = nil;

type
  TWideControlHelper = class(TWideComponentHelper)
  private
    FControl: TControl;
    FWideCaption: WideString;
    FWideHint: WideString;
    procedure SetAnsiText(const Value: AnsiString);
    procedure SetAnsiHint(const Value: AnsiString);
  public
    constructor Create(AOwner: TControl); reintroduce;
    property WideCaption: WideString read FWideCaption;
    property WideHint: WideString read FWideHint;
  end;

constructor TWideControlHelper.Create(AOwner: TControl);
begin
  inherited CreateHelper(AOwner, WideControlHelpers);
  FControl := AOwner;
end;

procedure TWideControlHelper.SetAnsiText(const Value: AnsiString);
begin
  TAccessControl(FControl).Text := Value;
end;

procedure TWideControlHelper.SetAnsiHint(const Value: AnsiString);
begin
  FControl.Hint := Value;
end;

function FindWideControlHelper(Control: TControl; CreateIfNotFound: Boolean = True): TWideControlHelper;
begin
  Result := TWideControlHelper(FindWideComponentHelper(WideControlHelpers, Control));
  if (Result = nil) and CreateIfNotFound then
  	Result := TWideControlHelper.Create(Control);
end;

//----------------------------------------------- GET/SET WINDOW CAPTION/HINT -------------

function TntControl_IsCaptionStored(Control: TControl): Boolean;
begin
  with TAccessControl(Control) do
    Result := (ActionLink = nil) or not TAccessControlActionLink(ActionLink).IsCaptionLinked;
end;

function TntControl_GetStoredText(Control: TControl; const Default: WideString): WideString;
var
  WideControlHelper: TWideControlHelper;
begin
  WideControlHelper := FindWideControlHelper(Control, False);
  if WideControlHelper <> nil then
    Result := WideControlHelper.WideCaption
  else
    Result := Default;
end;

procedure TntControl_SetStoredText(Control: TControl; const Value: WideString);
begin
  FindWideControlHelper(Control).FWideCaption := Value;
  TAccessControl(Control).Text := Value;
end;

function TntControl_GetText(Control: TControl): WideString;
var
  WideControlHelper: TWideControlHelper;
begin
  if (not Win32PlatformIsUnicode)
  or ((Control is TWinControl) and TWinControl(Control).HandleAllocated and (not IsWindowUnicode(TWinControl(Control).Handle))) then
    // Win9x / non-unicode handle
    Result := TAccessControl(Control).Text
  else if (not (Control is TWinControl)) then begin
    // non-windowed TControl
    WideControlHelper := FindWideControlHelper(Control, False);
    if WideControlHelper = nil then
      Result := TAccessControl(Control).Text
    else
      Result := GetSyncedWideString(WideControlHelper.FWideCaption, TAccessControl(Control).Text);
  end else if (not TWinControl(Control).HandleAllocated) then begin
    // NO HANDLE
    Result := TntControl_GetStoredText(Control, TAccessControl(Control).Text)
  end else begin
    // UNICODE & HANDLE
    SetLength(Result, GetWindowTextLengthW(TWinControl(Control).Handle) + 1);
    GetWindowTextW(TWinControl(Control).Handle, PWideChar(Result), Length(Result));
    SetLength(Result, Length(Result) - 1);
  end;
end;

procedure TntControl_SetText(Control: TControl; const Text: WideString);
begin
  if (not Win32PlatformIsUnicode)
  or ((Control is TWinControl) and TWinControl(Control).HandleAllocated and (not IsWindowUnicode(TWinControl(Control).Handle))) then
    // Win9x / non-unicode handle
    TAccessControl(Control).Text := Text
  else if (not (Control is TWinControl)) then begin
    // non-windowed TControl
    with FindWideControlHelper(Control) do
      SetSyncedWideString(Text, FWideCaption, TAccessControl(Control).Text, SetAnsiText)
  end else if (not TWinControl(Control).HandleAllocated) then begin
    // NO HANDLE
    TntControl_SetStoredText(Control, Text);
  end else if TntControl_GetText(Control) <> Text then begin
    // UNICODE & HANDLE
    Tnt_SetWindowTextW(TWinControl(Control).Handle, PWideChar(Text));
    Control.Perform(CM_TEXTCHANGED, 0, 0);
  end;
end;

// hint management -----------------------------------------------------------------------

function TntControl_IsHintStored(Control: TControl): Boolean;
begin
  with TAccessControl(Control) do
    Result := (ActionLink = nil) or not TAccessControlActionLink(ActionLink).IsHintLinked;
end;

function TntControl_GetHint(Control: TControl): WideString;
var
  WideControlHelper: TWideControlHelper;
begin
  if (not Win32PlatformIsUnicode) then
    Result := Control.Hint
  else begin
    WideControlHelper := FindWideControlHelper(Control, False);
    if WideControlHelper <> nil then
      Result := GetSyncedWideString(WideControlHelper.FWideHint, Control.Hint)
    else
      Result := Control.Hint;
  end;
end;

procedure TntControl_SetHint(Control: TControl; const Value: WideString);
begin
  if (not Win32PlatformIsUnicode) then
    Control.Hint := Value
  else
    with FindWideControlHelper(Control) do
      SetSyncedWideString(Value, FWideHint, Control.Hint, SetAnsiHint);
end;

function WideGetHint(Control: TControl): WideString;
begin
  while Control <> nil do
    if TntControl_GetHint(Control) = '' then
      Control := Control.Parent
    else
    begin
      Result := TntControl_GetHint(Control);
      Exit;
    end;
  Result := '';
end;

function WideGetShortHint(const Hint: WideString): WideString;
var
  I: Integer;
begin
  I := Pos('|', Hint);
  if I = 0 then
    Result := Hint else
    Result := Copy(Hint, 1, I - 1);
end;

function WideGetLongHint(const Hint: WideString): WideString;
var
  I: Integer;
begin
  I := Pos('|', Hint);
  if I = 0 then
    Result := Hint else
    Result := Copy(Hint, I + 1, Maxint);
end;

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

var UnicodeCreationControl: TWinControl = nil;

function IsUnicodeCreationControl(Handle: HWND): Boolean;
begin
  Result := (UnicodeCreationControl <> nil)
        and (UnicodeCreationControl.HandleAllocated)
        and (UnicodeCreationControl.Handle = Handle);
end;

function WMNotifyFormatResult(FromHandle: HWND): Integer;
begin
  if Win32PlatformIsUnicode
  and (IsWindowUnicode(FromHandle) or IsUnicodeCreationControl(FromHandle)) then
    Result := NFR_UNICODE
  else
    Result := NFR_ANSI;
end;

function IsTextMessage(Msg: UINT): Boolean;
begin
  // WM_CHAR is omitted because of the special handling it receives
  Result := (Msg = WM_SETTEXT)
         or (Msg = WM_GETTEXT)
         or (Msg = WM_GETTEXTLENGTH);
end;

const
  ANSI_UNICODE_HOLDER = $FF;

procedure MakeWMCharMsgSafeForAnsi(var Message: TMessage);
begin

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲视频在线一区二区| 欧美日韩三级一区二区| 亚洲一区二区三区三| 欧美一个色资源| 91丨九色丨蝌蚪丨老版| 美腿丝袜亚洲一区| 亚洲欧美日韩国产另类专区 | 国产91富婆露脸刺激对白| 一二三区精品福利视频| 精品国产1区2区3区| 色94色欧美sute亚洲13| 成人动漫av在线| 婷婷国产在线综合| 亚洲免费资源在线播放| 久久精品夜色噜噜亚洲a∨| 欧美猛男gaygay网站| 成人免费看视频| 国产综合色在线| 午夜精品久久一牛影视| 中文字幕日韩欧美一区二区三区| 欧美一区二区在线视频| 91免费在线视频观看| 国产一二精品视频| 日韩电影免费在线看| 亚洲欧美区自拍先锋| 欧美经典一区二区| 日韩精品一区二区三区四区视频 | 久久在线免费观看| 91麻豆精品国产91久久久| 色婷婷国产精品综合在线观看| 风间由美性色一区二区三区| 久久国产精品72免费观看| 日韩一区精品视频| 日韩高清不卡在线| 亚洲自拍偷拍av| 一区二区三区四区不卡在线| 中文字幕一区二区三区不卡在线| 久久久精品天堂| 久久网站最新地址| 精品国产伦一区二区三区观看体验| 91精品国产综合久久国产大片| 精品视频在线免费| 欧美日本在线播放| 3d成人h动漫网站入口| 91精品国产福利| 精品日韩在线观看| 亚洲精品一区二区三区精华液 | 中文字幕亚洲一区二区va在线| 国产日韩成人精品| 中文字幕国产精品一区二区| 国产日产欧美一区| 一区二区三区在线视频免费| 玉足女爽爽91| 午夜精品福利在线| 日本va欧美va瓶| 国产资源在线一区| 懂色av一区二区夜夜嗨| 99久久免费精品高清特色大片| 成人黄页在线观看| 91国偷自产一区二区使用方法| 欧美综合天天夜夜久久| 欧美电影一区二区| 精品久久久久久久久久久院品网| 国产亚洲欧美日韩俺去了| 中文欧美字幕免费| 一区二区三区在线免费观看| 亚洲成年人影院| 久久精品国产77777蜜臀| 国产精品1区2区3区在线观看| av亚洲精华国产精华精华| 一本大道久久a久久综合| 欧美老女人在线| 国产亚洲自拍一区| 亚洲另类中文字| 日韩精品亚洲一区| 国产一区二区女| 91免费视频网| 欧美美女激情18p| 国产亚洲美州欧州综合国| 一区在线播放视频| 石原莉奈在线亚洲二区| 国产激情一区二区三区四区| 91欧美一区二区| 欧美一区二区成人6969| 日本一区二区三区久久久久久久久不 | 91精品1区2区| 欧美成人在线直播| 综合色中文字幕| 老司机免费视频一区二区三区| 成人美女视频在线观看18| 欧美日韩精品一区二区三区 | 欧美aaaaaa午夜精品| 丁香婷婷综合色啪| 一本大道av伊人久久综合| 日韩欧美国产一区二区在线播放 | 日本不卡一区二区三区高清视频| 国模冰冰炮一区二区| 在线观看网站黄不卡| 久久男人中文字幕资源站| 亚洲制服丝袜av| 成人深夜福利app| 91精品国产综合久久蜜臀| 欧美国产综合一区二区| 美女视频一区二区三区| 91视频观看视频| 久久久久久久久久久久久久久99| 国产精品人成在线观看免费| 欧美乱妇15p| 国产日韩一级二级三级| 一区二区三区精品久久久| 99久久伊人精品| 国产精品每日更新| 东方欧美亚洲色图在线| 亚洲一区二区在线观看视频| 亚洲午夜视频在线| 麻豆国产欧美一区二区三区| 亚洲人成伊人成综合网小说| 欧美色爱综合网| 亚洲精品免费视频| 欧美日韩中文国产| 青青青伊人色综合久久| 蜜桃一区二区三区四区| 亚洲成年人影院| 亚洲精品中文在线影院| 久久久另类综合| 另类小说视频一区二区| 欧美色网一区二区| 日本vs亚洲vs韩国一区三区二区 | 亚洲精品国产a| 欧美专区日韩专区| 91精品国产综合久久小美女| av影院午夜一区| 久久精品国产亚洲aⅴ| 亚洲欧美日韩一区二区| 欧美大尺度电影在线| 欧美在线三级电影| 精品一区二区日韩| 亚洲成av人影院| 久久久电影一区二区三区| 国产在线日韩欧美| 五月婷婷综合在线| 欧美国产一区在线| 欧美成人伊人久久综合网| 麻豆国产精品官网| 亚洲综合视频在线| 欧美国产视频在线| 久久久www成人免费毛片麻豆 | 91蜜桃免费观看视频| 一区二区三区精品视频| 欧美一激情一区二区三区| 精品一区二区三区在线观看| 欧美激情综合五月色丁香 | 亚洲精品视频在线观看免费| 欧美日韩国产精选| 国产一区二区三区av电影| 香港成人在线视频| 91麻豆123| 99国产精品一区| 激情综合网最新| 国产**成人网毛片九色| 狠狠色综合播放一区二区| 黄色日韩网站视频| 午夜亚洲福利老司机| 亚洲一区二区在线观看视频| 男女男精品网站| 国产91丝袜在线播放0| 岛国一区二区三区| 国产色产综合色产在线视频| 奇米色一区二区三区四区| 日韩情涩欧美日韩视频| 国产福利不卡视频| 亚洲一区二区欧美| 欧美成人性战久久| 99re这里都是精品| 日本一不卡视频| 国产精品久久久久桃色tv| 欧美日本免费一区二区三区| 极品美女销魂一区二区三区免费| 国产精品麻豆一区二区| 7777精品伊人久久久大香线蕉的| 国产剧情一区在线| 亚洲六月丁香色婷婷综合久久| 欧美一二三四在线| 99在线视频精品| 久久99国产精品久久| 依依成人精品视频| 亚洲精品一区二区三区四区高清 | 欧美人与性动xxxx| 国产成人精品免费网站| 日韩专区一卡二卡| 国产精品色婷婷久久58| 欧美一区二区视频观看视频| 成人免费视频免费观看| 青青草国产精品亚洲专区无| 亚洲日穴在线视频| 精品国产一区a| 欧美色精品在线视频| 不卡视频免费播放| 久久国产精品99久久久久久老狼 | 欧美极品另类videosde|