2022年6月3日 星期五

Categories Data Structures

 TArray
TDictionary
TEnumerable
TEnumerator
TList
TObjectDictionary
TObjectList
TObjectQueue
TObjectStack
TQueue
TStack
TThreadedQueue
TThreadList

 https://docwiki.embarcadero.com/Libraries/Sydney/en/System.Generics.Collections

 https://delphisources.ru/pages/faq/master-delphi-7/content/LiB0053.html

 delphi TTreeNode Structures data TDictionary

 https://docwiki.embarcadero.com/Libraries/Sydney/en/System.LibModuleList

  linked list of records

 https://docwiki.embarcadero.com/Libraries/Sydney/en/Vcl.Controls.TDockZone

 https://docwiki.embarcadero.com/Libraries/Sydney/en/Vcl.ActnMan.TActionManager.LinkedActionLists

 delphi TTreeNode Structures data TDictionary

 https://docwiki.embarcadero.com/RADStudio/Sydney/en/About_Data_Types_(Delphi)

 https://devopedia.org/data-structures

 https://en.wikipedia.org/wiki/Linked_list

 

 https://docwiki.embarcadero.com/Libraries/Alexandria/en/System.Classes.TList.Sort

 https://docwiki.embarcadero.com/Libraries/Alexandria/en/System.Classes.TStringList.CustomSort

https://www.geeksforgeeks.org/sorting-algorithms/

https://rosettacode.org/wiki/Sorting_algorithms/Bubble_sort

https://docwiki.embarcadero.com/Libraries/Alexandria/en/System.Classes.TCollection

https://docwiki.embarcadero.com/RADStudio/Alexandria/en/Working_with_Lists

2022年6月1日 星期三

Delphi TButton How to make Delphi TButton control stay pressed?

 https://stackoverflow.com/questions/46934591/how-to-make-delphi-tbutton-control-stay-pressed

   Vcl.Themes,
  Vcl.Styles ;

StyleAPI

StyleElements

FInternalImageList 

TSeStyle

procedure TSysStyleHook.UpdateColors;
begin
  if (OverrideEraseBkgnd) or (OverridePaint) then
    Color := StyleServices.GetStyleColor(scWindow)
  else
    Color := clBtnFace;
  if OverrideFont then
    FontColor := StyleServices.GetSystemColor(clWindowText)
  else
    FontColor := clBlack;
end;

procedure TSysStyleHook.SetStyleElements(Value: TStyleElements);
begin
  if Value <> FStyleElements then
    begin
      FStyleElements := Value;
      OverridePaint := (seClient in FStyleElements);
      // OverrideEraseBkgnd := OverridePaint;
      OverridePaintNC := (seBorder in FStyleElements);
      OverrideFont := (seFont in FStyleElements);
    end;
end;


      TCustomButton = class(TButtonControl)

FImages: TCustomImageList;
    FInternalImageList: TImageList;


procedure TCustomButton.SetImages(const Value: TCustomImageList);


procedure TCustomButton.UpdateImages;
begin
  if CheckWin32Version(5, 1) and (FImageIndex <> -1) then
  begin
    FInternalImageList.Clear;
    // PBS_NORMAL
    FInternalImageList.AddImage(FImages, FImageIndex);
    // PBS_HOT
    if FHotImageIndex <> -1 then
      FInternalImageList.AddImage(FImages, FHotImageIndex)
    else
      FInternalImageList.AddImage(FImages, FImageIndex);
    // PBS_PRESSED
    if FPressedImageIndex <> -1 then
      FInternalImageList.AddImage(FImages, FPressedImageIndex)
    else

TButtonImageList BUTTON_IMAGELIST


https://docs.microsoft.com/zh-tw/windows/win32/api/commctrl/nf-commctrl-imagelist_replace

ImageList_Replace function (commctrl.h)

hbmImage

Type: HBITMAP

A handle to the bitmap that contains the image.

hbmMask

Type: HBITMAP

https://theroadtodelphi.com/category/vcl-styles/

https://delphiaball.co.uk/2014/10/22/adding-vcl-styles-runtime/

https://github.com/RRUZ/vcl-styles-utils

https://stackoverflow.com/questions/14031125/styling-only-one-vcl-component-in-delphi

https://theroadtodelphi.com/2012/02/06/changing-the-color-of-edit-controls-with-vcl-styles-enabled/

https://blogs.embarcadero.com/vcl-per-control-styles-coming-in-rad-studio-10-4/

2022年5月31日 星期二

delphi DataSource TDataSetProvider local data

 MyBaseを試してみる。(フィールド作成編): Delphi-fan

http://hiderin.air-nifty.com/delphi/2011/09/mybase-dcff.html 

http://delphi.ktop.com.tw/board.php?cid=30&fid=66&tid=51084

 


https://blog.karatos.in/a?ID=00200-12c89300-5e82-48ad-ada0-aab6e1319adf

https://stackoverflow.com/questions/67149100/how-to-detect-user-either-in-dbgrid-or-clientdataset-has-deleted-data-in-a-cell

https://www.delphipower.xyz/guide_6/working_with_data_using_a_client_dataset.html


delphi DataSource TDataSetProvider  Advanced Data TableGram ADTG

https://docwiki.embarcadero.com/Libraries/Sydney/en/Data.Win.ADODB.TPersistFormat

https://torry.net/quicksearchd.php?String=dataset&page=6

https://github.com/osmanatam/delphi-foundations

 https://github.com/osmanatam/delphi-foundations

 https://github.com/zhugecaomao/DelphiSourceCodeCollection

FMX Utilities
Tweaks to TClipboard code to compile with newer FMX versions
 
Misc/Generics.Defaults if done with metaclasses
 
XE2 book 
01. Language basics
02. Enums, numbers, dates and times
04. Classes and records
05. String handling
06. Arrays, collections and enumerators
07. Basic IO
08. Streams
Cleaned up source for fuller visual control demo
09. ZIP, XML, Registry and INI files
10. Packages
11. Dynamic typing and expressions
12. RTTI
13. Native APIs
Make comment more precise
14. Dynamic libraries
15. Multithreading
Another little FileSearchThread.pas thing

delphi image TResourceStream standard Microsoft SDK resource compiler

  standard Microsoft SDK resource compiler

 https://github.com/graphics32/GR32PNG

 RC.EXE, the Microsoft SDK Resource Compiler

https://forum.lazarus.freepascal.org/index.php?topic=12312.0
https://www.wireshark.org/docs/wsdg_html_chunked/ChToolsMSChain.html

https://support.microsoft.com/en-us/topic/an-updated-resource-compiler-for-the-windows-sdk-for-windows-server-2008-and-for-the-net-framework-3-5-is-now-available-a716ac6a-19a7-5b45-b5df-55980cd4cdb4
https://archicadapi.graphisoft.com/documentation/graphisoft-resource-compiler-4
https://docs.microsoft.com/zh-tw/windows/win32/menurc/resource-compiler
https://en.wikibooks.org/wiki/Windows_Programming/Resource_Scripts

Var

   jpg: TJPEGImage;
 resStream: TResourceStream;

begin
  jpg := TJPEGImage.Create;
  resStream := TResourceStream.Create(HInstance, 'testJpg', 'jpgtype');
  jpg.LoadFromStream(resStream);
  Image1.Picture.Assign(jpg);
  jpg.Free;
  resStream.Free;
end;

//RC: testBmp bitmap res\test.bmp
Image1.Picture.Bitmap.LoadFromResourceName(HInstance, 'res\test.bmp');
//RC: testBmp bmptype res\test.bmp
var
  resStream: TResourceStream;
begin
  resStream := TResourceStream.Create(HInstance, 'testBmp', 'bmptype');
  Image1.Picture.Bitmap.LoadFromStream(resStream);
  resStream.Free;
end;

http://melander.dk/reseditor/

https://wiki.freepascal.org/Lazarus_Resources

https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src/menurc/resource-compiler.md
 Microsoft platform SDK Resource Compiler
https://docwiki.embarcadero.com/RADStudio/Sydney/en/RC.EXE,_the_Microsoft_SDK_Resource_Compiler

 https://delphi.cjcsoft.net/viewthread.php?tid=43646
Title: Extracting Resource Data from an Exe
Question: Article 832 mentions how one can put Files into an Exe. This shows you how you can get it out
Answer:
I've written a simple function that does this for you, just cut and paste (some detail is below)

procedure ExtractToFile(Instance:THandle; ResID:Integer; ResType, FileName:String);
var
  ResStream: TResourceStream;
  FileStream: TFileStream;
begin
  try
    ResStream := TResourceStream.CreateFromID(Instance, ResID, pChar(ResType));
    try
      //if FileExists(FileName) then
        //DeleteFile(pChar(FileName));
      FileStream := TFileStream.Create(FileName, fmCreate);
      try
        FileStream.CopyFrom(ResStream, 0);
      finally
        FileStream.Free;
      end;
    finally
      ResStream.Free;
    end;
  except
    on E:Exception do
    begin
      DeleteFile(FileName);
      raise;
    end;
  end;
end;

https://docwiki.embarcadero.com/Libraries/Sydney/en/System.Classes.TResourceStream

https://github.com/osmanatam/delphi-foundations/tree/ea2c878f01107146674bd92ea518908d8f3e185d/XE2%20book/08.%20Streams/TResourceStream

2022年5月29日 星期日

Spiral transform image algorithm rotatey region around

 [ GDI+ サンプル ] [ G080_RotateTransform による画像とオブジェクトの回転 ] - Mr.XRAY

https://stackoverflow.com/questions/65163260/image-transformation-python

 https://medium.com/analytics-vidhya/opencv-perspective-transformation-9edffefb2143

 https://en.wikipedia.org/wiki/Archimedean_spiral#General_Archimedean_spiral

 https://docs.opencv.org/3.4/da/d54/group__imgproc__transform.html#gab75ef31ce5cdfb5c44b6da5f3b908ea4

 The Rick Sammon Swirl Effect

https://www.geeks3d.com/20110428/shader-library-swirl-post-processing-filter-in-glsl/

delphi form Transparent blur Msimg32.dll AlphaBlend

 https://stackoverflow.com/questions/5964701/how-to-draw-a-translucent-image-on-a-form

transparent background http://delphiexamples.com/forms/transpform.html

 https://sourceforge.net/projects/widget32/

https://parnassus.co/transparent-graphics-with-pure-gdi-part-2-and-introducing-the-ttransparentcanvas-class/

 Form com área transparente no Lazarus/Windows 

http://fanzinepas.blogspot.com/2012/06/form-com-area-transparente-no.html

THandle CreateRectRgn CreateRectRgn SetWindowRgn Winuser.h

https://www.codeguru.com/cplusplus/transparent-listbox/

https://stackoverflow.com/questions/48511634/partially-transparent-window-opengl-win32

 

winapi Transparent form layer GetMonitorInfo

https://www.experts-exchange.com/articles/1783/Win32-Semi-Transparent-Window.html

Layered Windows

https://docs.microsoft.com/en-us/previous-versions/ms997507(v=msdn.10)?redirectedfrom=MSDN

https://www.codeproject.com/Articles/1822/Per-Pixel-Alpha-Blend-in-C

 http://suyamasoft.blue.coocan.jp/ExcelVBA/Sample/SetLayeredWindowAttributes/index.html

http://suyamasoft.blue.coocan.jp/ExcelVBA/Sample/SetLayeredWindowAttributes/index.html

https://docs.microsoft.com/en-us/windows/win32/winauto/magapi/magapi-intro

Žarko Gajić gZoom – Delphi Implementation of the Missing Mode in Windows Magnifier

https://zarko-gajic.iz.hr/gzoom-delphi-implementation-of-the-missing-mode-in-windows-magnifier/


https://www.codeproject.com/Articles/5051/Various-methods-for-capturing-the-screen

https://www.codeproject.com/Articles/607288/Screenshot-using-the-Magnification-library

2022年5月28日 星期六

swig parsing llvm parsing Delphi2Cpp conversion C++ translating Pascal Delphi

https://github.com/FMXExpress/swig-delphi
https://blog.mbedded.ninja/programming/languages/python/python-swig-bindings-from-cplusplus/
https://code.google.com/archive/p/swig-gsoc/wikis/ProjectIdeas.wiki
https://en.delphipraxis.net/topic/940-delphi-compiler-need-to-be-opensourced/?page=4
https://swig-devel.narkive.com/qhi42Zwz/delphi-module
https://www.swig.org/
https://www.swig.org/Doc1.3/Extending.html
https://stackoverflow.com/questions/38884979/parsing-a-header-file-using-swig
https://stackoverflow.com/questions/10373935/pascal-to-c-converter
https://sites.google.com/a/chromium.org/dev/blink/webidl

https://en.wikipedia.org/wiki/Comparison_of_parser_generators
https://en.wikipedia.org/wiki/Source-to-source_compiler
https://en.wikipedia.org/wiki/Language_binding
https://wiki.freepascal.org/C_to_Pascal
https://wiki.lazarus.freepascal.org/User:Roozbeh
https://discourse.panda3d.org/t/help-with-swig/570

    Developer Tools Code Code Convertors
https://torry.net/pages.php?id=1518

llvm parsing  pascal

https://intel.github.io/llvm-docs/clang_doxygen/ParseExprCXX_8cpp_source.html
https://forum.lazarus.freepascal.org/index.php?topic=43007.15
https://github.com/mladedav/mila-compiler
https://github.com/FrozenGene/LLVMPascalCompiler

https://aclanthology.org/people/p/pascal-denis/
http://www.eteks.com/jeks/en/doc/com/eteks/parser/PascalSyntax.html
https://www.freepascal.org/docs-html/user/userse62.html
https://en.wikipedia.org/wiki/Comparison_of_Pascal_and_C

https://www.codeproject.com/Articles/371453/Visual-AST-for-ANTLR-Generated-Parser-Output
https://github.com/RomanYankovsky/DelphiAST

https://www.texttransformer.com/Delphi2Cpp_en.html
http://ivan.vecerina.com/code/delphi2cpp/

https://www.codeproject.com/Articles/10115/Crafting-an-interpreter-Part-1-Parsing-and-Grammar
https://www.codeproject.com/Articles/10142/Crafting-an-interpreter-Part-2-The-Calc0-Toy-Langu
https://www.codeproject.com/Articles/10421/Crafting-an-interpreter-Part-3-Parse-Trees-and-Syn

2022年5月27日 星期五

How can I change the background color of a button WinAPI C++

 Rectangles, Regions, and Clipping rectangular region CreateRoundRectRgn

 

https://miffyzzang.tistory.com/378
CreateWindow("button","",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_BITMAP | BS_OWNERDRAW,   100,100,70,30,hWnd,(HMENU)IDC_BUTTON, hInst,NULL);

Creating Owner-Drawn Controls - Windows Programming

BS_OWNERDRAW   SetButtonStyle SetWindowRgn

https://stackoverflow.com/questions/18745447/how-can-i-change-the-background-color-of-a-button-winapi-c

https://www.pablosoftwaresolutions.com/html/cimagebutton.html

#pragma comment( \
    linker, \
    "/manifestdependency:\"type='win32' \
    name='Microsoft.Windows.Common-Controls' \
    version='6.0.0.0' \
    processorArchitecture='*' \
    publicKeyToken='6595b64144ccf1df' \
    language='*'\"")
https://www.pablosoftwaresolutions.com/html/ccolorbutton.html

https://stackoverflow.com/questions/17678261/how-to-change-color-of-a-button-while-keeping-buttons-functions-in-win32
https://stackoverflow.com/questions/8695185/why-my-edit-control-looks-odd-in-my-win32-c-application-using-no-mfc

https://stackoverflow.com/questions/18745447/how-can-i-change-the-background-color-of-a-button-winapi-c




PraButtonStyle Button with very attractive layout, standard bootstrap to Delphi VCL

 https://github.com/pauloalvis/Delphi-PraButtonStyle

RkSmartButton rkGlassButton

 https://rmklever.com/?tag=rkglassbutton


Klever on Delphi
My take at Delphi, tips and tricks and how tos
Skip to content

    HomeAbout Contact Downloads

Tag Archives: rkGlassButton    
Glassbutton updated to v2.4
3 Comments    

This is a long forgotten update to my rkGlassButton component. Some bugs have been corrected and it now work more as expected.

The first ting first. The autosize property is working like it should.
Secondly the down property also work when duostyle is active.
Last but not forgotten OnClick now work as expected.

Please report any bugs you find to me.

Hope this helps a little

Download rkGlassButton v2.4
This entry was posted in Component, GUI and tagged Component, GUI, rkGlassButton on August 19, 2014.







Klever on Delphi
My take at Delphi, tips and tricks and how tos
Skip to content

    HomeAbout Contact Downloads

A smarter button
8 Comments    

There is a lot of buttons out there I know but I have yet to find a button like this where you can have more than one button in “one button” (see screen shot). Especially at no cost.
RkSmartButton on display.

RkSmartButton on display.

I belive this is all you need to get started using rkSmartButton. I have tried to make it easy to use but there are a few things worth noticing… to show a popupmenu on any of the buttons you must set a flag in ButtonsPopup property which will look, something like this: 0010 “0” means do not show “1” means show. In this case only third button will get the popup. I also use this technic for enabling buttons and keeping hold of which one is down. No popup will be shown if CheckButtons is set. Popupmenu is shown after the button is pressed and hold down for the time given in PopupDelay property (like in Chrome). To get images on button add an imagelist and set the indexes in the ImageIndexes property. Use format like this: 0,1,2,7,4. To know which button was pressed use SelectedIndex property. Button number one gets the index of 0.

Thats it, hope you like it.

Next up is an update of SmartPathBar.

Download: Project with source

TColorButton - button with Color properties unit ColorButton;

 

unit ColorButton;
 
{
Article:
 
TColorButton - button with Color properties
 
http://delphi.about.com/library/weekly/aa061104a.htm
 
Full source code of the TColorButton Delphi component,
an extension to the standard TButton control,
with font color, background color and mouse over color properties.
 
}
 
interface
 
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, StdCtrls, Buttons, ExtCtrls;
 
type
  TColorButton = class(TButton)
  private
    FBackBeforeHoverColor: TColor;
  private
    FCanvas: TCanvas;
    IsFocused: Boolean;
    FBackColor: TColor;
    FForeColor: TColor;
    FHoverColor: TColor;
    procedure SetBackColor(const Value: TColor);
    procedure SetForeColor(const Value: TColor);
    procedure SetHoverColor(const Value: TColor);
 
    property BackBeforeHoverColor : TColor read FBackBeforeHoverColor write FBackBeforeHoverColor;
  protected
    procedure CreateParams(var Params: TCreateParams); override;
    procedure WndProc(var Message : TMessage); override;
 
    procedure SetButtonStyle(Value: Boolean); override;
    procedure DrawButton(Rect: TRect; State: UINT);
 
    procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
    procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;
    procedure CNMeasureItem(var Message: TWMMeasureItem); message CN_MEASUREITEM;
    procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
 
  published
    property BackColor: TColor read FBackColor write SetBackColor default clBtnFace;
    property ForeColor: TColor read FForeColor write SetForeColor default clBtnText;
    property HoverColor: TColor read FHoverColor write SetHoverColor default clBtnFace;
  end;
 
procedure Register;
 
implementation
 
 
constructor TColorButton.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FCanvas := TCanvas.Create;
  BackColor := clBtnFace;
  ForeColor := clBtnText;
  HoverColor := clBtnFace;
end; (*Create*)
 
destructor TColorButton.Destroy;
begin
  FCanvas.Free;
  inherited Destroy;
end; (*Destroy*)
 
procedure TColorButton.WndProc(var Message : TMessage);
begin
  if (Message.Msg = CM_MOUSELEAVE) then
  begin
    BackColor := BackBeforeHoverColor;
    invalidate;
  end;
  if (Message.Msg = CM_MOUSEENTER) then
  begin
    BackBeforeHoverColor := BackColor;
    BackColor := HoverColor;
    invalidate;
  end;
 
  inherited;
end; (*WndProc*)
 
procedure TColorButton.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  with Params do Style := Style or BS_OWNERDRAW;
end; (*CreateParams*)
 
 
 
procedure TColorButton.SetButtonStyle(Value: Boolean);
begin
  if Value <> IsFocused then
  begin
    IsFocused := Value;
    Invalidate;
  end;
end; (*SetButtonStyle*)
 
procedure TColorButton.CNMeasureItem(var Message: TWMMeasureItem);
begin
  with Message.MeasureItemStruct^ do
  begin
    itemWidth  := Width;
    itemHeight := Height; 
  end; 
end; (*CNMeasureItem*)
 
procedure TColorButton.CNDrawItem(var Message: TWMDrawItem);
var 
  SaveIndex: Integer;
begin
  with Message.DrawItemStruct^ do 
  begin 
    SaveIndex := SaveDC(hDC); 
    FCanvas.Lock;
    try 
      FCanvas.Handle := hDC; 
      FCanvas.Font := Font; 
      FCanvas.Brush := Brush;
      DrawButton(rcItem, itemState);
    finally
      FCanvas.Handle := 0;
      FCanvas.Unlock;
      RestoreDC(hDC, SaveIndex); 
    end;
  end; 
  Message.Result := 1;
end; (*CNDrawItem*)
 
procedure TColorButton.CMEnabledChanged(var Message: TMessage);
begin
  inherited; 
  Invalidate;
end; (*CMEnabledChanged*)
 
procedure TColorButton.CMFontChanged(var Message: TMessage);
begin
  inherited;
  Invalidate;
end; (*CMFontChanged*)
 
 
procedure TColorButton.SetBackColor(const Value: TColor);
begin
  if FBackColor <> Value then begin
    FBackColor:= Value;
    Invalidate;
  end;
end; (*SetButtonColor*)
 
procedure TColorButton.SetForeColor(const Value: TColor);
begin
  if FForeColor <> Value then begin
    FForeColor:= Value;
    Invalidate;
  end;
end; (*SetForeColor*)
 
procedure TColorButton.SetHoverColor(const Value: TColor);
begin
  if FHoverColor <> Value then begin
    FHoverColor:= Value;
    Invalidate;
  end;
end; (*SetHoverColor*)
 
procedure TColorButton.DrawButton(Rect: TRect; State: UINT);
var
  Flags, OldMode: Longint;
  IsDown, IsDefault, IsDisabled: Boolean;
  OldColor: TColor;
  OrgRect: TRect;
begin
  OrgRect := Rect;
  Flags := DFCS_BUTTONPUSH or DFCS_ADJUSTRECT;
  IsDown := State and ODS_SELECTED <> 0;
  IsDefault := State and ODS_FOCUS <> 0;
  IsDisabled := State and ODS_DISABLED <> 0;
 
  if IsDown then Flags := Flags or DFCS_PUSHED;
  if IsDisabled then Flags := Flags or DFCS_INACTIVE;
 
  if IsFocused or IsDefault then 
  begin 
    FCanvas.Pen.Color := clWindowFrame;
    FCanvas.Pen.Width := 1; 
    FCanvas.Brush.Style := bsClear; 
    FCanvas.Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom); 
    InflateRect(Rect, - 1, - 1); 
  end;
 
  if IsDown then 
  begin
    FCanvas.Pen.Color := clBtnShadow;
    FCanvas.Pen.Width := 1;
    FCanvas.Brush.Color := clBtnFace; 
    FCanvas.Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom); 
    InflateRect(Rect, - 1, - 1); 
  end 
  else
    DrawFrameControl(FCanvas.Handle, Rect, DFC_BUTTON, Flags); 
 
  if IsDown then OffsetRect(Rect, 1, 1); 
 
  OldColor := FCanvas.Brush.Color;
  FCanvas.Brush.Color := BackColor;
  FCanvas.FillRect(Rect); 
  FCanvas.Brush.Color := OldColor;
  OldMode := SetBkMode(FCanvas.Handle, TRANSPARENT); 
  FCanvas.Font.Color := ForeColor;
  if IsDisabled then
    DrawState(FCanvas.Handle, FCanvas.Brush.Handle, nil, Integer(Caption), 0,
    ((Rect.Right - Rect.Left) - FCanvas.TextWidth(Caption)) div 2,
    ((Rect.Bottom - Rect.Top) - FCanvas.TextHeight(Caption)) div 2,
      0, 0, DST_TEXT or DSS_DISABLED)
  else
    DrawText(FCanvas.Handle, PChar(Caption), - 1, Rect,
      DT_SINGLELINE or DT_CENTER or DT_VCENTER); 
  SetBkMode(FCanvas.Handle, OldMode);
 
  if IsFocused and IsDefault then
  begin
    Rect := OrgRect;
    InflateRect(Rect, - 4, - 4);
    FCanvas.Pen.Color := clWindowFrame;
    FCanvas.Brush.Color := clBtnFace;
    DrawFocusRect(FCanvas.Handle, Rect);
  end;
end; (*DrawButton*)
 
procedure Register;
begin
  RegisterComponents('delphi.about.com', [TColorButton]);
end;
 
end.

unit ColorButton;

 https://delphisources.ru/pages/faq/base/change_button_color.html

Изменить цвет TButton


{
  You cannot change the color of a standard TButton,
  since the windows button control always paints itself with the
  button color defined in the control panel.
  But you can derive derive a new component from TButton and handle
  the and drawing behaviour there.
}


unit ColorButton;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, ExtCtrls;

type
  TDrawButtonEvent = procedure(Control: TWinControl;
    Rect: TRect; State: TOwnerDrawState) of object;

  TColorButton = class(TButton)
  private
    FCanvas: TCanvas;
    IsFocused: Boolean;
    FOnDrawButton: TDrawButtonEvent;
  protected
    procedure CreateParams(var Params: TCreateParams); override;
    procedure SetButtonStyle(ADefault: Boolean); override;
    procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
    procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;
    procedure CNMeasureItem(var Message: TWMMeasureItem); message CN_MEASUREITEM;
    procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
    procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message WM_LBUTTONDBLCLK;
    procedure DrawButton(Rect: TRect; State: UINT);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    property Canvas: TCanvas read FCanvas;
  published
    property OnDrawButton: TDrawButtonEvent read FOnDrawButton write FOnDrawButton;
    property Color;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TColorButton]);
end;

constructor TColorButton.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FCanvas := TCanvas.Create;
end;

destructor TColorButton.Destroy;
begin
  inherited Destroy;
  FCanvas.Free;
end;

procedure TColorButton.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  with Params do Style := Style or BS_OWNERDRAW;
end;

procedure TColorButton.SetButtonStyle(ADefault: Boolean);
begin
  if ADefault <> IsFocused then
  begin
    IsFocused := ADefault;
    Refresh;
  end;
end;

procedure TColorButton.CNMeasureItem(var Message: TWMMeasureItem);
begin
  with Message.MeasureItemStruct^ do
  begin
    itemWidth  := Width;
    itemHeight := Height;
  end;
end;

procedure TColorButton.CNDrawItem(var Message: TWMDrawItem);
var
  SaveIndex: Integer;
begin
  with Message.DrawItemStruct^ do
  begin
    SaveIndex := SaveDC(hDC);
    FCanvas.Lock;
    try
      FCanvas.Handle := hDC;
      FCanvas.Font := Font;
      FCanvas.Brush := Brush;
      DrawButton(rcItem, itemState);
    finally
      FCanvas.Handle := 0;
      FCanvas.Unlock;
      RestoreDC(hDC, SaveIndex);
    end;
  end;
  Message.Result := 1;
end;

procedure TColorButton.CMEnabledChanged(var Message: TMessage);
begin
  inherited;
  Invalidate;
end;

procedure TColorButton.CMFontChanged(var Message: TMessage);
begin
  inherited;
  Invalidate;
end;

procedure TColorButton.WMLButtonDblClk(var Message: TWMLButtonDblClk);
begin
  Perform(WM_LBUTTONDOWN, Message.Keys, Longint(Message.Pos));
end;

procedure TColorButton.DrawButton(Rect: TRect; State: UINT);
var
  Flags, OldMode: Longint;
  IsDown, IsDefault, IsDisabled: Boolean;
  OldColor: TColor;
  OrgRect: TRect;
begin
  OrgRect := Rect;
  Flags := DFCS_BUTTONPUSH or DFCS_ADJUSTRECT;
  IsDown := State and ODS_SELECTED <> 0;
  IsDefault := State and ODS_FOCUS <> 0;
  IsDisabled := State and ODS_DISABLED <> 0;

  if IsDown then Flags := Flags or DFCS_PUSHED;
  if IsDisabled then Flags := Flags or DFCS_INACTIVE;

  if IsFocused or IsDefault then
  begin
    FCanvas.Pen.Color := clWindowFrame;
    FCanvas.Pen.Width := 1;
    FCanvas.Brush.Style := bsClear;
    FCanvas.Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);
    InflateRect(Rect, - 1, - 1);
  end;

  if IsDown then
  begin
    FCanvas.Pen.Color := clBtnShadow;
    FCanvas.Pen.Width := 1;
    FCanvas.Brush.Color := clBtnFace;
    FCanvas.Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);
    InflateRect(Rect, - 1, - 1);
  end
  else
    DrawFrameControl(FCanvas.Handle, Rect, DFC_BUTTON, Flags);

  if IsDown then OffsetRect(Rect, 1, 1);

  OldColor := FCanvas.Brush.Color;
  FCanvas.Brush.Color := Color;
  FCanvas.FillRect(Rect);
  FCanvas.Brush.Color := OldColor;
  OldMode := SetBkMode(FCanvas.Handle, TRANSPARENT);
  FCanvas.Font.Color := clBtnText;
  if IsDisabled then
    DrawState(FCanvas.Handle, FCanvas.Brush.Handle, nil, Integer(Caption), 0,
    ((Rect.Right - Rect.Left) - FCanvas.TextWidth(Caption)) div 2,
    ((Rect.Bottom - Rect.Top) - FCanvas.TextHeight(Caption)) div 2,
      0, 0, DST_TEXT or DSS_DISABLED)
  else
    DrawText(FCanvas.Handle, PChar(Caption), - 1, Rect,
      DT_SINGLELINE or DT_CENTER or DT_VCENTER);
  SetBkMode(FCanvas.Handle, OldMode);

  if Assigned(FOnDrawButton) then
    FOnDrawButton(Self, Rect, TOwnerDrawState(LongRec(State).Lo));

  if IsFocused and IsDefault then
  begin
    Rect := OrgRect;
    InflateRect(Rect, - 4, - 4);
    FCanvas.Pen.Color := clWindowFrame;
    FCanvas.Brush.Color := clBtnFace;
    DrawFocusRect(FCanvas.Handle, Rect);
  end;
end;
end.

how-to-change-the-color-of-tbutton BS_OWNERDRAW SetWindowLong WM_DRAWITEM BS_OWNERDRAW color properties TColorButton

 
Buttons and Similar Controls
https://docwiki.embarcadero.com/RADStudio/Sydney/en/Buttons_and_Similar_Controls
https://blogs.embarcadero.com/creating-a-custom-button-style-with-rad-studio-10-seattle/

https://docs.microsoft.com/en-us/windows/win32/controls/button-styles
https://stackoverflow.com/questions/23082687/how-to-change-the-color-of-tbutton
BS_OWNERDRAW SetWindowLong WM_DRAWITEM
BS_OWNERDRAW to expose working color properties: TColorButton
TColorButton = class(TButton) private ...
procedure DrawItem(const DrawItemStruct: TDrawItemStruct); ...
with Params do Style := Style or BS_OWNERDRAW;
https://stackoverflow.com/questions/55731281/delphi-button-transitions-using-vcl
https://stackoverflow.com/questions/9758016/how-do-i-custom-draw-of-tedit-control-text

https://lazarus-ccr.sourceforge.io/docs/lcl/dialogs/tcolorbutton.html

https://community.embarcadero.com/es/blogs/entry/creating-a-custom-button-style-with-rad-studio-10-seattle
https://torry.net/quicksearchd.php?String=button+color&Title=Yes

http://www.lohninger.com/onoffbut.html SDL Component Suite - OnOffBut

http://www.festra.com/cb/mtut24.htm
A button doesn't have a Color property.
But we can simulate a colored button by using a TPanel component.

https://www.swissdelphicenter.ch/en/showcode.php?id=1100

unit ColorButton;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, ExtCtrls;

type
  TDrawButtonEvent = procedure(Control: TWinControl;
    Rect: TRect; State: TOwnerDrawState) of object;

  TColorButton = class(TButton)
  private
    FCanvas: TCanvas;
    IsFocused: Boolean;
    FOnDrawButton: TDrawButtonEvent;
  protected
    procedure CreateParams(var Params: TCreateParams); override;
    procedure SetButtonStyle(ADefault: Boolean); override;
    procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
    procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;
    procedure CNMeasureItem(var Message: TWMMeasureItem); message CN_MEASUREITEM;
    procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
    procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message WM_LBUTTONDBLCLK;
    procedure DrawButton(Rect: TRect; State: UINT);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    property Canvas: TCanvas read FCanvas;
  published
    property OnDrawButton: TDrawButtonEvent read FOnDrawButton write FOnDrawButton;
    property Color;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TColorButton]);
end;

constructor TColorButton.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FCanvas := TCanvas.Create;
end;

destructor TColorButton.Destroy;
begin
  inherited Destroy;
  FCanvas.Free;
end;

procedure TColorButton.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  with Params do Style := Style or BS_OWNERDRAW;
end;

procedure TColorButton.SetButtonStyle(ADefault: Boolean);
begin
  if ADefault <> IsFocused then
  begin
    IsFocused := ADefault;
    Refresh;
  end;
end;

procedure TColorButton.CNMeasureItem(var Message: TWMMeasureItem);
begin
  with Message.MeasureItemStruct^ do
  begin
    itemWidth  := Width;
    itemHeight := Height;
  end;
end;

procedure TColorButton.CNDrawItem(var Message: TWMDrawItem);
var
  SaveIndex: Integer;
begin
  with Message.DrawItemStruct^ do
  begin
    SaveIndex := SaveDC(hDC);
    FCanvas.Lock;
    try
      FCanvas.Handle := hDC;
      FCanvas.Font := Font;
      FCanvas.Brush := Brush;
      DrawButton(rcItem, itemState);
    finally
      FCanvas.Handle := 0;
      FCanvas.Unlock;
      RestoreDC(hDC, SaveIndex);
    end;
  end;
  Message.Result := 1;
end;

procedure TColorButton.CMEnabledChanged(var Message: TMessage);
begin
  inherited;
  Invalidate;
end;

procedure TColorButton.CMFontChanged(var Message: TMessage);
begin
  inherited;
  Invalidate;
end;

procedure TColorButton.WMLButtonDblClk(var Message: TWMLButtonDblClk);
begin
  Perform(WM_LBUTTONDOWN, Message.Keys, Longint(Message.Pos));
end;

procedure TColorButton.DrawButton(Rect: TRect; State: UINT);
var
  Flags, OldMode: Longint;
  IsDown, IsDefault, IsDisabled: Boolean;
  OldColor: TColor;
  OrgRect: TRect;
begin
  OrgRect := Rect;
  Flags := DFCS_BUTTONPUSH or DFCS_ADJUSTRECT;
  IsDown := State and ODS_SELECTED <> 0;
  IsDefault := State and ODS_FOCUS <> 0;
  IsDisabled := State and ODS_DISABLED <> 0;

  if IsDown then Flags := Flags or DFCS_PUSHED;
  if IsDisabled then Flags := Flags or DFCS_INACTIVE;

  if IsFocused or IsDefault then
  begin
    FCanvas.Pen.Color := clWindowFrame;
    FCanvas.Pen.Width := 1;
    FCanvas.Brush.Style := bsClear;
    FCanvas.Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);
    InflateRect(Rect, - 1, - 1);
  end;

  if IsDown then
  begin
    FCanvas.Pen.Color := clBtnShadow;
    FCanvas.Pen.Width := 1;
    FCanvas.Brush.Color := clBtnFace;
    FCanvas.Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);
    InflateRect(Rect, - 1, - 1);
  end
  else
    DrawFrameControl(FCanvas.Handle, Rect, DFC_BUTTON, Flags);

  if IsDown then OffsetRect(Rect, 1, 1);

  OldColor := FCanvas.Brush.Color;
  FCanvas.Brush.Color := Color;
  FCanvas.FillRect(Rect);
  FCanvas.Brush.Color := OldColor;
  OldMode := SetBkMode(FCanvas.Handle, TRANSPARENT);
  FCanvas.Font.Color := clBtnText;
  if IsDisabled then
    DrawState(FCanvas.Handle, FCanvas.Brush.Handle, nil, Integer(Caption), 0,
    ((Rect.Right - Rect.Left) - FCanvas.TextWidth(Caption)) div 2,
    ((Rect.Bottom - Rect.Top) - FCanvas.TextHeight(Caption)) div 2,
      0, 0, DST_TEXT or DSS_DISABLED)
  else
    DrawText(FCanvas.Handle, PChar(Caption), - 1, Rect,
      DT_SINGLELINE or DT_CENTER or DT_VCENTER);
  SetBkMode(FCanvas.Handle, OldMode);

  if Assigned(FOnDrawButton) then
    FOnDrawButton(Self, Rect, TOwnerDrawState(LongRec(State).Lo));

  if IsFocused and IsDefault then
  begin
    Rect := OrgRect;
    InflateRect(Rect, - 4, - 4);
    FCanvas.Pen.Color := clWindowFrame;
    FCanvas.Brush.Color := clBtnFace;
    DrawFocusRect(FCanvas.Handle, Rect);
  end;
end;

end.


Adding a component to the Titlebar using CustomTitleBar
https://forum.lazarus.freepascal.org/index.php?topic=49456.0
https://wiki.freepascal.org/BGRAControls
https://lazarus-ccr.sourceforge.io/docs/lcl/dialogs/tcolorbutton.html
https://docwiki.embarcadero.com/Libraries/Alexandria/en/FMX.Colors.TColorButton
CustomTitleBar.Control = TitleBarPanel1
https://stackoverflow.com/questions/70437417/adding-a-component-to-the-titlebar-using-customtitlebar
https://stackoverflow.com/questions/5634743/non-client-painting-on-aero-glass-window
 
How can I put a custom button on the title bar? [duplicate]
JVCL Help:.pas - Project JEDI Wiki
https://wiki.delphi-jedi.org/wiki/JEDI_Visual_Component_Library
https://docs.microsoft.com/zh-tw/windows/win32/dwm/customframe?redirectedfrom=MSDN














2022年5月26日 星期四

...show controls with rounded corners?

 https://www.swissdelphicenter.ch/en/showcode.php?id=921

 www.teamb.com

 Autor: P. Below
Homepage: http://www.teamb.com
[ Print tip ]         

Tip Rating (38):     
     




procedure MakeRounded(Control: TWinControl);
var
  R: TRect;
  Rgn: HRGN;
begin
  with Control do
  begin
    R := ClientRect;
    rgn := CreateRoundRectRgn(R.Left, R.Top, R.Right, R.Bottom, 20, 20);
    Perform(EM_GETRECT, 0, lParam(@r));
    InflateRect(r, - 5, - 5);
    Perform(EM_SETRECTNP, 0, lParam(@r));
    SetWindowRgn(Handle, rgn, True);
    Invalidate;
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  // TMemo:
  Memo1.BorderStyle := bsNone;
  MakeRounded(Memo1);
  // TEdit:
  Edit2.BorderStyle := bsNone;
  MakeRounded(Edit2);
  // TPanel:
  MakeRounded(Panel1);
  // TStaticText:
  MakeRounded(StaticText1);
  // TForm
  Form1.BorderStyle := bsNone;
  MakeRounded(Form1);
end;


Vcl.ExtCtrls.TShape corner size of RoundRect


FMX.StdCtrls.TCornerButton


https://stackoverflow.com/questions/11675374/how-to-make-tframe-with-rounded-corners

  TCustomRoundShape = class(TGraphicControl)



procedure TForm1.FormPaint(Sender: TObject);
const
  n = 50;
var
  Rgn: HRGN;
  x1,y1,x2,y2: Integer;
begin
  x1 := n;
  y1 := n div 2;
  x2 := ClientWidth - n;
  y2 := ClientHeight - n;
 
  Rgn := CreateRoundRectRgn(x1, y1, x2, y2, n, n);
 
  Canvas.Brush.Color := clSilver;
  Canvas.Brush.Style := bsCross;
  FillRgn(Canvas.Handle, Rgn, Canvas.Brush.Handle);
 
  Canvas.Brush.Color := clRed;
  Canvas.Brush.Style := bsSolid;
  FrameRgn(Canvas.Handle, Rgn, Canvas.Brush.Handle, 2, 2);

  DeleteObject(Rgn);
end;

 https://stackoverflow.com/questions/11675374/how-to-make-tframe-with-rounded-corners
https://stackoverflow.com/questions/5755719/rounded-and-titled-tpanel-in-delphi-7
https://stackoverflow.com/questions/32987649/how-to-create-a-user-control-with-rounded-corners

...create a form with rounded corners?
Autor: Horst Kniebusch
Homepage: http://members.tripod.de/Kniebusch
[ Print tip ]          

Tip Rating (38):      
     




{
  Die CreateRoundRectRgn lässt eine Form mit abgerundeten Ecken erscheinen.

  The CreateRoundRectRgn function creates a rectangular
  region with rounded corners
}

procedure TForm1.FormCreate(Sender: TObject);
var
  rgn: HRGN;
begin
  Form1.Borderstyle := bsNone;
  rgn := CreateRoundRectRgn(0,// x-coordinate of the region's upper-left corner
    0,            // y-coordinate of the region's upper-left corner
    ClientWidth,  // x-coordinate of the region's lower-right corner
    ClientHeight, // y-coordinate of the region's lower-right corner
    40,           // height of ellipse for rounded corners
    40);          // width of ellipse for rounded corners
  SetWindowRgn(Handle, rgn, True);
end


{ The CreatePolygonRgn function creates a polygonal region. }


procedure TForm1.FormCreate(Sender: TObject);
const
  C = 20;
var
  Points: array [0..7] of TPoint;
  h, w: Integer;
begin
  h := Form1.Height;
  w := Form1.Width;
  Points[0].X := C;     Points[0].Y := 0;
  Points[1].X := 0;     Points[1].Y := C;
  Points[2].X := 0;     Points[2].Y := h - c;
  Points[3].X := C;     Points[3].Y := h;

  Points[4].X := w - c; Points[4].Y := h;
  Points[5].X := w;     Points[5].Y := h - c;

  Points[6].X := w;     Points[6].Y := C;
  Points[7].X := w - C; Points[7].Y := 0;

  SetWindowRgn(Form1.Handle, CreatePolygonRgn(Points, 8, WINDING), True);
end;
 

Receive Windows Messages In Your Custom Delphi Class NonWindowed Control AllocateHWnd(WndMethod); TMsgReceiver RegisterWindowMessage TApplicationEvent

 https://zarko-gajic.iz.hr/receive-windows-messages-in-your-custom-delphi-class-nonwindowed-control-object/

Embed the Chromium web browser in your Delphi projects

 https://github.com/salvadordf/CEF4Delphi

https://github.com/salvadordf/WebView4Delphi 

https://landof.dev/awesome/pascal/

https://github.com/Fr0sT-Brutal/awesome-pascal

2022年5月25日 星期三

Using Delphi’s Expressions Engine EXPR math parser library parsing evaluating expressions

https://blogs.embarcadero.com/using-delphis-expressions-engine/

https://github.com/torvalds/linux/blob/master/scripts/kconfig/expr.c 

https://beltoforion.de/en/muparser/

C++ Mathematical Expression Library (ExprTk) - By Arash

C library for parsing and evaluating simple expressions.

 evaluating  expressions

 https://stackoverflow.com/questions/1326258/mathematical-expression-parser-in-delphi

 https://github.com/Crownie88/Delphi-mathematic-expression-parser/blob/master/MathExpParser.pas

2022年5月24日 星期二

一起結束

 https://codeoncode.blogspot.com/2016/12/create-job-object-and-terminate-child.html

Create a Job object And terminate Child Process

JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE flag
How to gracefully handle when main.exe terminated, child.exe terminated also?
You need to use jobs. Main executable should create a job object, then you'll need to set JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE flag to your job object.
 

unit JobsApi;
interface
uses
  Windows;
type
  TJobObjectInfoClass   =   Cardinal;

  PJobObjectAssociateCompletionPort   =   ^TJobObjectAssociateCompletionPort;
  TJobObjectAssociateCompletionPort   =   Record
      CompletionKey     :   Pointer;
      CompletionPort   :   THandle;
  End;
  {$EXTERNALSYM JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION}
  JOB_OBJECT_LIMIT_BREAKAWAY_OK = $00000800;
  {$EXTERNALSYM JOB_OBJECT_LIMIT_BREAKAWAY_OK}
  JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK = $00001000;
  {$EXTERNALSYM JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK}
  JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE = $00002000;
  {$EXTERNALSYM JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE}

Function QueryInformationJobObject(hJob : THandle;
                        JobObjectInformationClass : TJobObjectInfoClass;
                        lpJobObjectInformation : Pointer;
                        cbJobObjectInformationLength : DWORD;
                        lpReturnLength : PDWORD) : Bool; StdCall;
                        External Kernel32 Name 'QueryInformationJobObject';

Function SetInformationJobObject(hJob : THandle;
                        JobObjectInformationClass : TJobObjectInfoClass;
                        lpJobObjectInformation : Pointer;
                        cbJobObjectInformationLength : DWORD): BOOL; StdCall;
                        External Kernel32 Name 'SetInformationJobObject';

 

 

 QueryInformationJobObject function (jobapi2.h)

https://docs.microsoft.com/en-us/windows/win32/api/jobapi2/nf-jobapi2-queryinformationjobobject 



https://www.google.com/search?q=github+Helper.System.JobObject.Header.pas

https://gist.github.com/JensMertelmeyer/5e23a5dccb59b2902f37c69e7f7fa4cd

 @JensMertelmeyer
JensMertelmeyer/Helper.System.JobObject.Header.pas

CreateJobObjectW. KERNEL32.CreateMutexW. KERNEL32.CreateProcessW. KERNEL32.CreateThread. KERNEL32.DelayLoadFailureHook.

提升權限

 OpenProcessToken GetCurrentProcessID   TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY

 CreateProcessAsUser

SystemHandleInformation = 16;
ProcessBasicInformation = 0;
STATUS_SUCCESS = cardinal($00000000);
SE_DEBUG_PRIVILEGE =20;
STATUS_ACCESS_DENIED = cardinal($C0000022);
STATUS_INFO_LENGTH_MISMATCH = cardinal($C0000004);
SEVERITY_ERROR = cardinal($C0000000);
TH32CS_SNAPPROCESS = $00000002;  
JOB_OBJECT_ALL_ACCESS = $1f001f;

printf("SeCreateSymbolicLinkPrivilege = %ld, %ld\n", seCreateSymbolicLinkPrivilege.HighPart, seCreateSymbolicLinkPrivilege.LowPart);

      if (!GetTokenInformation(hProcess, TokenPrivileges, NULL, 0, &length))
      {
        if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
        {
          TOKEN_PRIVILEGES* privileges = (TOKEN_PRIVILEGES*)malloc(length);
          if (GetTokenInformation(hProcess, TokenPrivileges, privileges, length, &length))
          {
            BOOL found = FALSE;
            DWORD count = privileges->PrivilegeCount;

            printf("User has %ld privileges\n", count);

            if (count > 0)
            {
              LUID_AND_ATTRIBUTES* privs = privileges->Privileges;
              while (count-- > 0 && !luid_eq(privs->Luid, seCreateSymbolicLinkPrivilege))
                privs++;
              found = (count > 0);