Delphi7简单DirectUI界面源码

来源:互联网 发布:linux基础入门教程 编辑:程序博客网 时间:2024/05/21 18:41

界面效果


unit CometSkin;interfaceuses    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,    Dialogs, ShellApi, AxCtrls, ActiveX, GDIPUTIL, GDIPAPI, GDIPOBJ;const    SCM_NULL = 0;    SCM_MINIMIZE = -1; {标题栏_最小化按钮}    SCM_MAXIMIZE = -2; {标题栏_最大化按钮}    SCM_RESTORE = -3; {标题栏_还原按钮}    SCM_CLOSE = -4; {标题栏_关闭按钮}    SCM_MAINMENU = -5; {标题栏_主菜单按钮}    //未公开消息    WM_NCUAHDRAWCAPTION = $00AE;    WM_NCUAHDRAWFRAME = $00AF;    //自定义消息    WM_SkinControl_Click = WM_APP + 100; {控件被点击}    WM_SkinControl_SYSClick = WM_APP + 101; {控件被点击}type    SkinControlType = (SCT_NULL, SCT_SYSBUTTON, SCT_MODULEBUTTON);    PSkinControl = ^TSkinControl;    TSkinControl = packed record        SCType: SkinControlType;        CtlID: Integer;        x, y, Width, Height: Integer;        Rect: TRect;        Caption: string;        WCaption: WideString;        wstrLength: Integer;        Image: TGPImage;        bImage: Boolean;        bHover, bPressed, bDisable, bCheck: Boolean;    end;    SkinControlArray = array of TSkinControl;    TSkinForm = class(TForm)    public       //设置窗口背景颜色        procedure SetBkColor(bkColor: Tcolor; bReDraw: Boolean = True);            overload;        procedure SetBkColor(r, g, b: Byte; bReDraw: Boolean = True); overload;        //设置窗口背景图片        procedure SetBkImage(ResName, ResType: string; NineX, NineY, NineWidth,            NineHeight: Integer);       //重绘整个窗口        procedure ReDrawWindow();        //添加模块按钮 (控件ID,按钮标题,资源图片名称,资源类型)        procedure AddModuleButton(CtlID: Integer; Caption, ResName, ResType:            string);        //选中某个模块        procedure SetModuleCheck(CtlID: Integer);    private    { Private declarations }        procedure WMCreate(var Message: TWMCreate); message WM_CREATE;        procedure WMNCCalcSize(var Message: TWMNCCalcSize); message            WM_NCCALCSIZE;        procedure WMMouseMove(var Message: TWMMouse); message WM_MOUSEMOVE;        procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;        procedure WMLButtonDown(var Message: TWMMouse); message WM_LBUTTONDOWN;        procedure WMLButtonUp(var Message: TWMMouse); message WM_LBUTTONUP;        procedure WMControlClick(var msg: TMessage); message            WM_SkinControl_SYSClick;        procedure WMPaint(var Message: TWMPaint); message WM_PAINT;        procedure WMNCPaint(var Message: TWMNCPaint); message WM_NCPAINT;        procedure WMNCActivate(var Message: TWMNCActivate); message            WM_NCACTIVATE;        procedure WMNCUAHDrawCaption(var msg: TMessage); message            WM_NCUAHDRAWCAPTION;        procedure WMNCUAHDrawFrame(var msg: TMessage); message            WM_NCUAHDRAWFRAME;        procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message            WM_ERASEBKGND;        {        procedure WMCtlColor(var Message: TWMCtlColor); message WM_CTLCOLOR;        procedure WMCtlColorBtn(var Message: TWMCtlColorBtn); message            WM_CTLCOLORBTN;        procedure WMCtlColorDlg(var Message: TWMCtlColorDlg); message            WM_CTLCOLORDLG;        procedure WMCtlColorEdit(var Message: TWMCtlColorEdit); message            WM_CTLCOLOREDIT;        procedure WMCtlColorListbox(var Message: TWMCtlColorListbox); message            WM_CTLCOLORLISTBOX;        procedure WMCtlColorMsgbox(var Message: TWMCtlColorMsgbox); message            WM_CTLCOLORMSGBOX;        procedure WMCtlColorScrollbar(var Message: TWMCtlColorScrollbar); message            WM_CTLCOLORSCROLLBAR;        procedure WMCtlColorStatic(var Message: TWMCtlColorStatic); message            WM_CTLCOLORSTATIC;  }        procedure WMSize(var Message: TWMSize); message WM_SIZE;        procedure WMGetMinMaxInfo(var msg: TWMGetMinMaxInfo); message            WM_GETMINMAXINFO;        procedure WMActivate(var Message: TWMActivate); message WM_ACTIVATE;        function CopySkin(hWndDC: HDC): Boolean;        function DrawWindow(): Boolean;        function DrawBackground(): Boolean;        function DrawControls(): Boolean;        function DrawControl(const graphics: TGPGraphics; nIndex: Integer):            Boolean;        procedure DrawControlEx(nIndex: Integer);        function DrawControl_SysBtn(const graphics: TGPGraphics; const Control:            TSkinControl): Boolean;        function DrawControl_Module(const graphics: TGPGraphics; const Control:            TSkinControl): Boolean;        function CreateControl(SCType: SkinControlType; x, y, Width, Height:            Integer; CtlID: Integer = 0): Integer;        procedure MoveControl(nIndex, x, y: Integer; Width: Integer = -1;            Height: Integer = -1);        procedure SetControlImage(nIndex: Integer; ResName, ResType: string);        procedure SetControlText(nIndex: Integer; strText: string);        function GetSysButton(CtlID: Integer): Integer;        procedure SetHoverControl(nIndex: Integer = -1);        procedure SetPressedControl(nIndex: Integer = -1);        function GetHoverIndex(pt: TPoint): Integer;        procedure DisableSysTheme();        procedure DrawNineRect(const graphics: TGPGraphics); overload;        procedure DrawNineRect(const graphics: TGPGraphics; const image:            TGPImage; DestRect, SrcRect, NineRect: TRect); overload;        procedure DrawNineRect(const graphics: TGPGraphics; const image:            TGPImage; x, y, w, h, srcx, srcy, srcw, srch: Integer); overload;        function CreateRoundPath(x, y, w, h, cornerRadius: Single):            TGPGraphicsPath;    protected    {私有成员变量}        m_hWnd: HWND;        m_hCacheDC, m_hBackDC: HDC;        m_hCacheBitmap, m_hOldCacheBitmap: HBITMAP;        m_hBackBitmap, m_hOldBackBitmap: HBITMAP;        m_nWidth, m_nHeight: integer;        m_bkColor, m_BorderColor1, m_BorderColor2: TGPColor;        m_bkImage: TGPImage;        m_bkNineRect: TGPRect;        m_bkIsImage: Boolean;        m_hIcon: HICON;        m_hFont, m_hBoldFont: HFONT;        m_bIsZoomed: Boolean;        m_ControlArray: SkinControlArray;        m_ControlCount: Integer;        m_ControlSysCount: Integer;        m_HoverIndex, m_PressedIndex: Integer;        m_bTracking: Boolean;        m_ModuleLeft: Integer;        m_ModuleFont: TGPFont;        m_ModuleFormat: TGPStringFormat;        m_ModuleBrush: TGPSolidBrush;        procedure CreateParams(var Params: TCreateParams); override;    public    { Public declarations }    end;implementationprocedure TSkinForm.CreateParams(var Params: TCreateParams);begin    inherited;    Params.Style := Params.Style or WS_CLIPCHILDREN or WS_CLIPSIBLINGS;    //params.Style := params.Style and (not WS_CAPTION);    params.ExStyle := params.ExStyle and (not WS_EX_DLGMODALFRAME);    params.ExStyle := params.ExStyle and (not WS_EX_WINDOWEDGE);    params.ExStyle := params.ExStyle and (not WS_EX_CLIENTEDGE);    Params.WindowClass.Style := CS_VREDRAW or CS_HREDRAW or CS_OWNDC;    //Params.WinClassName := 'CometSkinForm';end;procedure TSkinForm.WMCreate(var Message: TWMCreate);var    buf: array[0..MAX_PATH] of Char;    FileInfo: SHFILEINFO;    lf: TLogFontA;    plf: PLogFontA;    dc: HDC;begin    m_hWnd := Handle;    m_bkColor := MakeColor(50, 150, 190);    m_bkIsImage := False;    m_BorderColor1 := MakeColor(150, 0, 0, 0);    m_BorderColor2 := MakeColor(150, 255, 255, 255);    m_hFont := GetStockObject(DEFAULT_GUI_FONT);    GetObject(m_hFont, SizeOf(lf), @lf);    lf.lfWeight := FW_BOLD;    m_hBoldFont := CreateFontIndirect(lf);    m_hIcon := SendMessage(m_hWnd, WM_GETICON, ICON_SMALL, 0);    if m_hIcon = 0 then    begin        GetModuleFileName(0, buf, Length(buf));        SHGetFileInfo(buf, 0, FileInfo, SizeOf(FileInfo), SHGFI_SMALLICON or            SHGFI_ICON);        m_hIcon := FileInfo.hIcon;    end;     //-----------------------    dc := GetDC(0);    plf := @lf;    m_ModuleFont := TGPFont.Create(dc, plf);    ReleaseDC(0, dc);    m_ModuleFormat := TGPStringFormat.Create();    m_ModuleFormat.SetAlignment(StringAlignmentCenter);    m_ModuleFormat.SetLineAlignment(StringAlignmentCenter);    m_ModuleBrush := TGPSolidBrush.Create(MakeColor(255, 255, 255));    //-----------------------    m_bTracking := False;    m_HoverIndex := -1;    m_PressedIndex := -1;    m_ControlCount := 0;    m_ModuleLeft := 7;    CreateControl(SCT_SYSBUTTON, 300, 5, 30, 19, SCM_MAINMENU);    CreateControl(SCT_SYSBUTTON, 300, 5, 30, 19, SCM_MINIMIZE);    CreateControl(SCT_SYSBUTTON, 350, 5, 30, 19, SCM_MAXIMIZE);    CreateControl(SCT_SYSBUTTON, 400, 5, 39, 19, SCM_CLOSE);    m_ControlSysCount := m_ControlCount;    //-----------------------    inherited;    DisableSysTheme();    SetWindowPos(m_hWnd, 0, 0, 0, 0, 0, SWP_FRAMECHANGED or SWP_NOOWNERZORDER or        SWP_NOMOVE or SWP_NOSIZE);end;procedure TSkinForm.WMNCCalcSize(var Message: TWMNCCalcSize);begin  //inherited;  //修改非客户区(标题栏、窗口边框)尺寸    if Message.CalcValidRects then    begin        Message.CalcSize_Params^.rgrc[2] := Message.CalcSize_Params^.rgrc[1];        Message.CalcSize_Params^.rgrc[1] := Message.CalcSize_Params^.rgrc[0];    end    else    begin    end;    Message.Result := 1;end;procedure TSkinForm.WMSize(var Message: TWMSize);begin    if m_hCacheDC <> 0 then    begin        SelectObject(m_hCacheDC, m_hOldCacheBitmap);        SelectObject(m_hBackDC, m_hOldBackBitmap);        DeleteDC(m_hCacheDC);        DeleteDC(m_hBackDC);        DeleteObject(m_hCacheBitmap);        DeleteObject(m_hBackBitmap);        m_hCacheDC := 0;        m_hBackDC := 0;        m_hCacheBitmap := 0;        m_hBackBitmap := 0;    end;    inherited;end;procedure TSkinForm.WMGetMinMaxInfo(var msg: TWMGetMinMaxInfo);var    MyScreen: TScreen;    Monitor: TMonitor;    rc: TRect;begin    if IsZoomed(m_hWnd) then    begin        MyScreen := TScreen.Create(nil);        Monitor := MyScreen.MonitorFromWindow(m_hWnd);        rc := Monitor.WorkareaRect;        msg.MinMaxInfo.ptMaxPosition.X := rc.Left;        msg.MinMaxInfo.ptMaxPosition.Y := rc.Top;        msg.MinMaxInfo.ptMaxSize.X := rc.right - rc.left;        msg.MinMaxInfo.ptMaxSize.Y := rc.bottom - rc.top;  //SetWindowPos(m_hWnd,0,rc.Left,rc.Top,rc.right-rc.left,rc.bottom-rc.top,SWP_NOZORDER);        msg.Result := 0;        inherited;    end    else    begin        inherited;    end;end;procedure TSkinForm.WMActivate(var Message: TWMActivate);var    rc: TRect;    w, h: integer;begin    Windows.GetClientRect(m_hWnd, rc);    inherited;    w := rc.Right - rc.Left;    h := rc.Bottom - rc.Top;    //SetWindowPos(m_hWnd,0,0,0,w+1,h+1,SWP_FRAMECHANGED or SWP_NOREDRAW Or SWP_NOOWNERZORDER Or SWP_NOMOVE);    //SetWindowPos(m_hWnd,0,0,0,w,h,SWP_FRAMECHANGED or SWP_DRAWFRAME Or SWP_NOOWNERZORDER Or SWP_NOMOVE);    //InvalidateRect(m_hWnd, nil, False);end;procedure TSkinForm.WMMouseMove(var Message: TWMMouse);var    e: TTrackMouseEvent;    nIndex: Integer;    pt: TPoint;begin    inherited;    if m_bTracking = False then    begin        m_bTracking := True;        E.cbSize := SIZEof(TTrackMouseEvent);        E.dwFlags := TME_LEAVE;        E.dwHoverTime := 10;        E.hwndTrack := m_hWnd;        trackmouseevent(e);    end;    pt.x := Message.XPos;    pt.y := Message.YPos;    nIndex := GetHoverIndex(pt);    SetHoverControl(nIndex);end;procedure TSkinForm.CMMouseLeave(var Message: TMessage);begin    inherited;    m_bTracking := False;    SetPressedControl(-1);    SetHoverControl(-1);end;procedure TSkinForm.WMLButtonDown(var Message: TWMMouse);var    nIndex: Integer;    pt: TPoint;begin    inherited;    pt.x := Message.XPos;    pt.y := Message.YPos;    nIndex := GetHoverIndex(pt);    SetPressedControl(nIndex);    if nIndex = -1 then    begin        ReleaseCapture();        PostMessage(m_hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0);    end;end;procedure TSkinForm.WMLButtonUp(var Message: TWMMouse);var    nIndex, nOldIndex: Integer;    pt: TPoint;    Control: TSkinControl;begin    inherited;    pt.x := Message.XPos;    pt.y := Message.YPos;    nIndex := GetHoverIndex(pt);    nOldIndex := m_PressedIndex;    SetPressedControl(-1);    if (nIndex >= 0) and (nIndex < m_ControlCount) then    begin        ReleaseCapture();        Application.ProcessMessages;        Control := m_ControlArray[nIndex];        Windows.PostMessage(m_hWnd, WM_SkinControl_SYSClick, Control.CtlID,            nIndex);    end;end;procedure TSkinForm.WMControlClick(var msg: TMessage);var    nIndex: Integer;    CtlID: Integer;    Control: TSkinControl;    bMsg: Boolean;begin    nIndex := msg.LParam;    CtlID := msg.WParam;    bMsg := False;    if (nIndex >= 0) and (nIndex < m_ControlCount) then    begin        Control := m_ControlArray[nIndex];        if Control.SCType = SCT_SYSBUTTON then        begin            if (CtlID = SCM_MAXIMIZE) and IsZoomed(m_hWnd) then            begin                CtlID := SCM_RESTORE;            end;            case CtlID of                SCM_MINIMIZE:                    PostMessage(m_hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);                SCM_MAXIMIZE:                    PostMessage(m_hWnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0);                SCM_RESTORE:                    PostMessage(m_hWnd, WM_SYSCOMMAND, SC_RESTORE, 0);                SCM_CLOSE:                    PostMessage(m_hWnd, WM_SYSCOMMAND, SC_CLOSE, 0);                SCM_MAINMENU:                    bMsg := True;            end;        end        else        begin            bMsg := True;        end;        if bMsg then        begin            Windows.PostMessage(m_hWnd, WM_SkinControl_Click, CtlID, nIndex);        end;    end;end;procedure TSkinForm.WMPaint(var Message: TWMPaint);var    ps: PAINTSTRUCT;    dc: HDC;begin    dc := BeginPaint(handle, ps);    CopySkin(dc);    EndPaint(handle, ps);    Message.Result := 0;end;procedure TSkinForm.WMEraseBkgnd(var Message: TWMEraseBkgnd);begin    CopySkin(Message.DC);    Message.Result := 1;end;procedure TSkinForm.WMNCPaint(var Message: TWMNCPaint);var    dc: HDC;begin    dc := GetWindowDC(m_hWnd);  //CopySkin(dc);    ReleaseDC(m_hWnd, dc);    Message.Result := 0;end;procedure TSkinForm.WMNCActivate(var Message: TWMNCActivate);begin    //在这里不能调用默认的处理因为当窗口是非激活状态时会画出默认的Title    //inherited;    Message.Result := 1;end;procedure TSkinForm.WMNCUAHDrawCaption(var msg: TMessage);begin    //这两条消息是在xp sp2后加的.xp在以前有个bug在某些时候Titlebar会画错.    //在这里不能调用默认处理,直接自绘nc区.;end;procedure TSkinForm.WMNCUAHDrawFrame(var msg: TMessage);begin    //这两条消息是在xp sp2后加的.xp在以前有个bug在某些时候Titlebar会画错.    //在这里不能调用默认处理,直接自绘nc区.;end;{procedure TSkinForm.WMCtlColor(var Message: TWMCtlColor);begin    inherited;end;procedure TSkinForm.WMCtlColorBtn(var Message: TWMCtlColorBtn);begin    inherited;end;procedure TSkinForm.WMCtlColorDlg(var Message: TWMCtlColorDlg);begin    inherited;end;procedure TSkinForm.WMCtlColorEdit(var Message: TWMCtlColorEdit);begin    inherited;end;procedure TSkinForm.WMCtlColorListbox(var Message: TWMCtlColorListbox);begin    inherited;end;procedure TSkinForm.WMCtlColorMsgbox(var Message: TWMCtlColorMsgbox);begin    inherited;end;procedure TSkinForm.WMCtlColorScrollbar(var Message: TWMCtlColorScrollbar);begin    inherited;end;procedure TSkinForm.WMCtlColorStatic(var Message: TWMCtlColorStatic);var    pt: TPoint;    rtControl: TRect;begin    if m_hBackDC <> 0 then    begin        inherited;       //pt.X:=0;       //pt.Y:=0;       //MapWindowPoints(Message.ChildWnd,m_hWnd,pt,1);       //Windows.GetClientRect(Message.ChildWnd,rtControl);       //BitBlt(Message.ChildDC, 0, 0,rtControl.Right-rtControl.Left, rtControl.Bottom-rtControl.Top, m_hCacheDC,pt.X, pt.Y, SRCCOPY);       //SetTextColor(Message.ChildDC,$FFFFFF) ;       //Message.Result:=GetStockObject(NULL_BRUSH);    end    else    begin        inherited;    end;end; }function TSkinForm.CopySkin(hWndDC: HDC): Boolean;begin    if m_hCacheDC = 0 then    begin        DrawWindow();    end;    BitBlt(hWndDC, 0, 0, m_nWidth, m_nHeight, m_hCacheDC, 0, 0, SRCCOPY);end;function TSkinForm.DrawWindow(): Boolean;var    hSrcDC: HDC;    rc: TRect;    nWidth, nHeight: integer;    Rgn: HRGN;begin    m_bIsZoomed := Windows.IsZoomed(m_hWnd);    Windows.GetClientRect(m_hWnd, rc);    nWidth := rc.Right - rc.Left;    nHeight := rc.Bottom - rc.Top;    m_nWidth := nWidth;    m_nHeight := nHeight;    hSrcDC := GetDC(m_hWnd);    m_hCacheDC := CreateCompatibleDC(hSrcDC);    m_hBackDC := CreateCompatibleDC(hSrcDC);    m_hCacheBitmap := CreateCompatibleBitmap(hSrcDC, nWidth, nHeight);    m_hBackBitmap := CreateCompatibleBitmap(hSrcDC, nWidth, nHeight);    m_hOldCacheBitmap := SelectObject(m_hCacheDC, m_hCacheBitmap);    m_hOldBackBitmap := SelectObject(m_hBackDC, m_hBackBitmap);    //--------------------------------------------    SetBkMode(m_hCacheDC, TRANSPARENT);    SetBkMode(m_hBackDC, TRANSPARENT);    //--------------------------------------------    ReleaseDC(m_hWnd, hSrcDC);    DrawBackground();    DrawControls();    //--------------------------------------------    if m_bIsZoomed then    begin        Rgn := CreateRectRgn(0, 0, m_nWidth, m_nHeight);    end    else    begin        Rgn := CreateRoundRectRgn(0, 0, m_nWidth + 1, m_nHeight + 1, 4, 4);    end;    SetWindowRgn(m_hWnd, Rgn, False);    DeleteObject(Rgn);    result := True;end;function TSkinForm.DrawBackground(): Boolean;var    g: TGPGraphics;    b: TGPSolidBrush;    Pen1, Pen2: TGPPen;    path1, path2: TGPGraphicsPath;    x, y, w, h, cornerRadius, len: Integer;    buf: array[0..MAX_PATH] of Char;    hOldFont: HFONT;    rc: TRect;    rcF, SrcF: TGPRectF;    w1, w2, w3: Single;begin  //----------------    g := TGPGraphics.Create(m_hBackDC);    b := TGPSolidBrush.Create(m_bkColor);    g.FillRectangle(b, 0, 0, m_nWidth, m_nHeight);    b.Free;   //----------------    if m_bkIsImage then    begin        w := m_bkImage.GetWidth();        h := m_bkImage.GetHeight();    end    else    begin        w := 0;        h := 0;    end;    if (w > 0) and (h > 0) then    begin        if (m_nWidth <= w) and (m_nHeight <= h) then        begin            rcF := MakeRect(0.0, 0.0, m_nWidth, m_nHeight);            SrcF := MakeRect(w - m_nWidth, 0.0, m_nWidth, m_nHeight);            g.DrawImage(m_bkImage, rcF, SrcF.X, SrcF.Y, SrcF.Width, SrcF.Height,                UnitPixel);        end        else if (m_bkNineRect.Width > 0) and (m_bkNineRect.Height > 0) then        begin        //按九宫图绘制            DrawNineRect(g);        end;    end;  //----------------    Pen1 := TGPPen.Create(m_BorderColor1);    Pen2 := TGPPen.Create(m_BorderColor2);    if m_bIsZoomed then    begin        g.DrawRectangle(Pen1, 0, 0, m_nWidth - 1, m_nHeight - 1);        g.DrawRectangle(Pen2, 1, 1, m_nWidth - 3, m_nHeight - 3);    end    else    begin        x := 0;        Y := 0;        w := m_nWidth - 1;        h := m_nHeight - 1;        cornerRadius := 3;        path1 := TGPGraphicsPath.Create();        path1.AddArc(x, y, cornerRadius * 2, cornerRadius * 2, 180, 90); //左上        path1.AddArc(x + w - cornerRadius * 2, y, cornerRadius * 2, cornerRadius            * 2, 270, 90); //右上        path1.AddArc(x + w - cornerRadius * 2, y + h - cornerRadius * 2,            cornerRadius * 2, cornerRadius * 2, 0, 90); //右下        path1.AddArc(x, y + h - cornerRadius * 2, cornerRadius * 2, cornerRadius            * 2, 90, 90); //左下        path1.CloseFigure();        g.DrawPath(Pen1, path1);        path1.Free;        x := 1;        Y := 1;        w := m_nWidth - 3;        h := m_nHeight - 3;        cornerRadius := 3;        path2 := TGPGraphicsPath.Create();        path2.AddArc(x, y, cornerRadius * 2, cornerRadius * 2, 180, 90); //左上        path2.AddArc(x + w - cornerRadius * 2, y, cornerRadius * 2, cornerRadius            * 2, 270, 90); //右上        path2.AddArc(x + w - cornerRadius * 2, y + h - cornerRadius * 2,            cornerRadius * 2, cornerRadius * 2, 0, 90); //右下        path2.AddArc(x, y + h - cornerRadius * 2, cornerRadius * 2, cornerRadius            * 2, 90, 90); //左下        path2.CloseFigure();        g.DrawPath(Pen2, path2);        path2.Free;    end;    Pen1.Free;    Pen2.Free;  //----------------  //绘制图标    x := 5;    y := 5;    w := 16;    h := 16;    if m_hIcon <> 0 then    begin        DrawIconEx(m_hBackDC, x, y, m_hIcon, w, h, 0, 0, DI_NORMAL);        x := x + 20;    end;  //----------------  //绘制标题    rc.Left := x;    rc.Top := y;    rc.Right := m_nWidth - 100;    rc.Bottom := y + h;    GetWindowText(m_hWnd, buf, MAX_PATH);    hOldFont := SelectObject(m_hBackDC, m_hBoldFont);    SetTextColor(m_hBackDC, $333333);    DrawText(m_hBackDC, buf, -1, rc, DT_SINGLELINE or DT_VCENTER);    OffsetRect(rc, -1, -1);    SetTextColor(m_hBackDC, $FFFFFF);    DrawText(m_hBackDC, buf, -1, rc, DT_SINGLELINE or DT_VCENTER);    SelectObject(m_hBackDC, hOldFont);  //----------------    g.Free;    result := True;end;function TSkinForm.DrawControls(): Boolean;var    i, x, y, nIndex: Integer;    g: TGPGraphics;begin    BitBlt(m_hCacheDC, 0, 0, m_nWidth, m_nHeight, m_hBackDC, 0, 0, SRCCOPY);    g := TGPGraphics.Create(m_hCacheDC);    //g.SetSmoothingMode(SmoothingModeAntiAlias);    g.SetInterpolationMode(InterpolationModeHighQualityBicubic);    //----------------    x := m_nWidth - 2;    y := 2;    nIndex := GetSysButton(SCM_CLOSE);    if nIndex > -1 then    begin        x := x - m_ControlArray[nIndex].Width;        MoveControl(nIndex, x, y);    end;    nIndex := GetSysButton(SCM_MAXIMIZE);    if nIndex > -1 then    begin        x := x - m_ControlArray[nIndex].Width;        MoveControl(nIndex, x, y);    end;    nIndex := GetSysButton(SCM_MINIMIZE);    if nIndex > -1 then    begin        x := x - m_ControlArray[nIndex].Width;        MoveControl(nIndex, x, y);    end;    nIndex := GetSysButton(SCM_MAINMENU);    if nIndex > -1 then    begin        x := x - m_ControlArray[nIndex].Width;        MoveControl(nIndex, x, y);    end;    //----------------    for i := 0 to m_ControlCount - 1 do    begin        DrawControl(g, i);    end;   //----------------    g.Free;    result := True;end;function TSkinForm.DrawControl(const graphics: TGPGraphics; nIndex: Integer):    Boolean;var    Control: TSkinControl;begin    Control := m_ControlArray[nIndex];    case Control.SCType of        SCT_SYSBUTTON:            DrawControl_SysBtn(graphics, Control);        SCT_MODULEBUTTON:            DrawControl_Module(graphics, Control);    end;    result := True;end;//画出顶部模块按钮function TSkinForm.DrawControl_Module(const graphics: TGPGraphics; const    Control: TSkinControl): Boolean;var    x, y, w, h: Single;    cornerRadius: Integer;    rc: TGPRectF;    c1, c2, c3, c4: TGPColor;    Pen1, Pen2, Pen3: TGPPen;    Brush: TGPSolidBrush;    path1, path2, path3: TGPGraphicsPath;    SmoothingMode: TSmoothingMode;begin  //画出背景 ========================    if Control.bCheck or Control.bPressed or Control.bHover then    begin        if Control.bCheck or Control.bPressed = True then        begin            c1 := MakeColor(20, 0, 0, 0);            c2 := MakeColor(60, 0, 0, 0);            c3 := MakeColor(120, 255, 255, 255);            c4 := MakeColor(70, 255, 255, 255);        end        else        begin            c1 := MakeColor(15, 0, 0, 0);            c2 := MakeColor(40, 0, 0, 0);            c3 := MakeColor(90, 255, 255, 255);            c4 := MakeColor(50, 255, 255, 255);        end;        Pen1 := TGPPen.Create(c1);        Pen2 := TGPPen.Create(c2);        Pen3 := TGPPen.Create(c3);        Brush := TGPSolidBrush.Create(c4);        x := Control.x;        y := Control.y;        w := Control.Width - 2;        h := Control.Height - 2;        path1 := CreateRoundPath(x, y, w, h, 5);        path2 := CreateRoundPath(x + 1, y + 1, w - 2, h - 2, 5);        path3 := CreateRoundPath(x + 2, y + 2, w - 4, h - 4, 5);        SmoothingMode := graphics.GetSmoothingMode();        graphics.SetSmoothingMode(SmoothingModeAntiAlias);        graphics.DrawPath(Pen1, path1);        graphics.DrawPath(Pen2, path2);        graphics.FillPath(Brush, path3);        graphics.DrawPath(Pen3, path3);        graphics.SetSmoothingMode(SmoothingMode);        Pen1.Free;        Pen2.Free;        Pen3.Free;        Brush.Free;        path1.Free;        path2.Free;        path3.Free;    end;    //画出图标 ========================    if Control.bImage then    begin        w := Control.Image.GetWidth();        h := Control.Image.GetHeight();        rc.Width := w;        rc.Height := h;        if rc.Width > 48 then            rc.Width := 48;        if rc.Height > 48 then            rc.Height := 48;        rc.X := Control.x + (Control.Width - rc.Width) / 2;        rc.y := Control.y + (Control.Height - rc.Height - 20) / 2;        graphics.DrawImage(Control.Image, rc, 0, 0, w, h, UnitPixel);    end;    //画出文字 ========================    if Control.wstrLength > 0 then    begin        Brush := TGPSolidBrush.Create(MakeColor(60, 0, 0, 0));        rc := MakeRect(Control.x + 1, Control.y + 1 + Control.Height - 20,            Control.Width - 1, 18.0);        graphics.DrawString(Control.WCaption, -1, m_ModuleFont, rc,            m_ModuleFormat, Brush);        rc.x := rc.x - 1;        rc.y := rc.y - 1;        graphics.DrawString(Control.WCaption, -1, m_ModuleFont, rc,            m_ModuleFormat, m_ModuleBrush);        Brush.Free;    end;    //--------------------------    result := True;end;//画出系统按钮(最小化、最大化...)function TSkinForm.DrawControl_SysBtn(const graphics: TGPGraphics; const    Control: TSkinControl): Boolean;var    path1, IconPath, IconPath2: TGPGraphicsPath;    IconBrush: TGPSolidBrush;    IconPen: TGPPen;    LineBrush1, LineBrush2: TGPLinearGradientBrush;    x, y, w, h: Single;    i, CtlID: Integer;    rc: TGPRectF;    c1, c2: TGPColor;begin    CtlID := Control.CtlID;    if (CtlID = SCM_MAXIMIZE) and m_bIsZoomed then    begin        CtlID := SCM_RESTORE;    end;  //画出背景 ========================    if Control.bPressed or Control.bHover then    begin        x := Control.x + 1;        y := Control.y;        w := Control.Width - 1;        h := Control.Height;        if Control.CtlID = SCM_CLOSE then        begin            if Control.bPressed = True then            begin                c1 := MakeColor(180, 128, 0, 0);                c2 := MakeColor(0, 0, 0, 0);            end            else            begin                c1 := MakeColor(180, 255, 0, 0);                c2 := MakeColor(0, 0, 0, 0);            end;        end        else        begin            w := w - 2;            if Control.bPressed = True then            begin                c1 := MakeColor(90, 0, 0, 0);                c2 := MakeColor(0, 0, 0, 0);            end            else            begin                c1 := MakeColor(60, 255, 255, 255);                c2 := MakeColor(0, 255, 255, 255);            end;        end;        rc := MakeRect(x, y, 1, h);        LineBrush1 := TGPLinearGradientBrush.Create(rc, c1, c2,            LinearGradientModeVertical);        rc := MakeRect(x, y, w, h);        graphics.FillRectangle(LineBrush1, rc);        rc.X := rc.X - 1;        LineBrush2 := TGPLinearGradientBrush.Create(rc, c1, c2,            LinearGradientModeVertical);        graphics.FillRectangle(LineBrush2, rc);        LineBrush1.Free();        LineBrush2.Free();    end;  //画出图标 ========================    w := 11;    h := 9;    x := Control.x + ((Control.Width - w) / 2) - 1;    y := Control.y + ((Control.Height - h) / 2) - 1;    IconPath := TGPGraphicsPath.Create();    IconPath.SetFillMode(FillModeWinding);    case CtlID of        SCM_MINIMIZE:            begin                rc.x := integer(Trunc(x));                rc.Y := integer(Trunc(y)) + integer(Trunc(h)) - 2;                rc.Width := integer(Trunc(w));                rc.Height := 2;                IconPath.AddRectangle(rc);            end;        SCM_MAXIMIZE:            begin                h := 8;                y := y + 1;                rc.x := integer(Trunc(x));                rc.Y := integer(Trunc(y));                rc.Width := integer(Trunc(w));                rc.Height := 2;                IconPath.AddRectangle(rc);                rc.Y := integer(Trunc(y)) + integer(Trunc(h)) - 1;                rc.Height := 1;                IconPath.AddRectangle(rc);                rc.Y := integer(Trunc(y));                rc.Width := 1;                rc.Height := integer(Trunc(h));                IconPath.AddRectangle(rc);                rc.x := integer(Trunc(x)) + integer(Trunc(w)) - 1;                IconPath.AddRectangle(rc);            end;        SCM_RESTORE:            begin                w := 12;                h := 8;                y := y + 1;                x := x - 1;                rc := MakeRect(x + 2, y + 0.0, 10, 1);                IconPath.AddRectangle(rc);                rc := MakeRect(x + 2, y + 0.0, 1, 2);                IconPath.AddRectangle(rc);                rc := MakeRect(x + 11, y + 0.0, 1, 6);                IconPath.AddRectangle(rc);                rc := MakeRect(x + 9, y + 6, 3, 1);                IconPath.AddRectangle(rc);                rc := MakeRect(x, y + 2, 10, 2);                IconPath.AddRectangle(rc);                rc := MakeRect(x, y + 2, 1, 6);                IconPath.AddRectangle(rc);                rc := MakeRect(x + 9, y + 2, 1, 6);                IconPath.AddRectangle(rc);                rc := MakeRect(x, y + 7, 10, 1);                IconPath.AddRectangle(rc);            end;        SCM_CLOSE:            begin                for i := 0 to 8 do                begin                    rc.x := integer(Trunc(x)) + i;                    rc.Y := integer(Trunc(y)) + i;                    rc.Width := 3;                    rc.Height := 1;                    IconPath.AddRectangle(rc);                    rc.x := integer(Trunc(x)) + integer(Trunc(w)) - i - 3;                    IconPath.AddRectangle(rc);                end;            end;        SCM_MAINMENU:            begin                rc.x := integer(Trunc(x));                rc.Y := integer(Trunc(y));                rc.Width := integer(Trunc(w));                rc.Height := 2;                IconPath.AddRectangle(rc);                rc.Y := integer(Trunc(y)) + integer(Trunc(h)) - 1;                rc.Height := 1;                IconPath.AddRectangle(rc);                rc.Y := integer(Trunc(y));                rc.Width := 1;                rc.Height := integer(Trunc(h));                IconPath.AddRectangle(rc);                rc.x := integer(Trunc(x)) + integer(Trunc(w)) - 1;                IconPath.AddRectangle(rc);                rc.Width := 1;                rc.Height := 1;                rc.Y := integer(Trunc(y)) + integer(Trunc(h)) - 3;                rc.X := integer(Trunc(x)) + ((w - rc.Width) / 2);                IconPath.AddRectangle(rc);                rc.Width := 3;                rc.Y := rc.Y - rc.Height;                rc.X := integer(Trunc(x)) + ((w - rc.Width) / 2);                IconPath.AddRectangle(rc);                rc.Width := 5;                rc.Y := rc.Y - rc.Height;                rc.X := integer(Trunc(x)) + ((w - rc.Width) / 2);                IconPath.AddRectangle(rc);            end;    end;    IconPath.CloseAllFigures();    IconPath2 := TGPGraphicsPath.Create(IconPath);    IconBrush := TGPSolidBrush.Create(MakeColor(255, 255, 255));    IconPen := TGPPen.Create(MakeColor(50, 0, 0, 0));    IconPath.Widen(IconPen);    graphics.DrawPath(IconPen, IconPath);    IconPath.Widen(IconPen);    graphics.DrawPath(IconPen, IconPath);    graphics.FillPath(IconBrush, IconPath2);    IconPath.Free;    IconPath2.Free;    IconPen.Free;    IconBrush.Free;    //画出分割线 ========================    if Control.CtlID <> SCM_CLOSE then    begin        x := Control.x + Control.Width - 1;        y := Control.y;        rc := MakeRect(x, y, 1, Control.Height);        c1 := MakeColor(120, 255, 255, 255);        c2 := MakeColor(0, 255, 255, 255);        LineBrush1 := TGPLinearGradientBrush.Create(rc, c1, c2,            LinearGradientModeVertical);        graphics.FillRectangle(LineBrush1, rc);        rc.X := rc.X - 1;        c1 := MakeColor(90, 0, 0, 0);        c2 := MakeColor(0, 0, 0, 0);        LineBrush2 := TGPLinearGradientBrush.Create(rc, c1, c2,            LinearGradientModeVertical);        graphics.FillRectangle(LineBrush2, rc);        LineBrush1.Free();        LineBrush2.Free();    end;    //--------------------------    result := True;end;function TSkinForm.CreateControl(SCType: SkinControlType; x, y, Width, Height:    Integer; CtlID: Integer = 0): Integer;var    nIndex: Integer;begin    SetLength(m_ControlArray, m_ControlCount + 1);    nIndex := m_ControlCount;    m_ControlCount := Length(m_ControlArray);    m_ControlArray[nIndex].SCType := SCType;    m_ControlArray[nIndex].CtlID := CtlID;    m_ControlArray[nIndex].bHover := False;    m_ControlArray[nIndex].bPressed := False;    m_ControlArray[nIndex].bDisable := False;    m_ControlArray[nIndex].bCheck := False;    m_ControlArray[nIndex].bImage := False;    MoveControl(nIndex, x, y, Width, Height);    result := nIndex;end;procedure TSkinForm.MoveControl(nIndex, x, y: Integer; Width: Integer = -1;    Height: Integer = -1);begin    m_ControlArray[nIndex].x := x;    m_ControlArray[nIndex].y := y;    if Width > -1 then        m_ControlArray[nIndex].Width := Width;    if Height > -1 then        m_ControlArray[nIndex].Height := Height;    m_ControlArray[nIndex].Rect.Left := x;    m_ControlArray[nIndex].Rect.Top := y;    m_ControlArray[nIndex].Rect.Right := x + m_ControlArray[nIndex].Width;    m_ControlArray[nIndex].Rect.Bottom := y + m_ControlArray[nIndex].Height;end;function TSkinForm.GetSysButton(CtlID: Integer): Integer;var    nIndex, i: Integer;begin    nIndex := -1;    for i := 0 to m_ControlSysCount - 1 do    begin        if m_ControlArray[i].CtlID = CtlID then        begin            nIndex := i;            break;        end;    end;    result := nIndex;end;procedure TSkinForm.SetBkColor(bkColor: Tcolor; bReDraw: Boolean = True);begin    m_bkColor := ColorRefToARGB(bkColor);    if bReDraw then        ReDrawWindow();end;procedure TSkinForm.SetBkColor(r, g, b: Byte; bReDraw: Boolean = True);begin    m_bkColor := MakeColor(r, g, b);    if bReDraw then        ReDrawWindow();end;//设置窗口背景图片procedure TSkinForm.SetBkImage(ResName, ResType: string; NineX, NineY,    NineWidth, NineHeight: Integer);var    hMod: HMODULE;    HRes: HRSRC;    sResName: string;    sResType: string;    Len: DWORD;    lpRsrc: PByte;    m_hMem: HGLOBAL;    pMem: PByte;    pstm: IStream;begin    m_bkNineRect := MakeRect(NineX, NineY, NineWidth, NineHeight);    if m_bkIsImage then    begin        m_bkImage.destroy();        m_bkImage.Free();        m_bkIsImage := False;    end;    hMod := GetModuleHandle(nil);    sResName := ResName;    sResType := ResType;    HRes := FindResource(HInstance, PChar(sResName), PChar(sResType));    if HRes <> 0 then    begin        Len := SizeofResource(HInstance, HRes);        lpRsrc := PByte(LoadResource(HInstance, HRes));        try            if lpRsrc <> nil then            begin                m_hMem := GlobalAlloc(GMEM_FIXED, Len);                pMem := Pbyte(GlobalLock(m_hMem));                CopyMemory(pMem, lpRsrc, Len);                CreateStreamOnHGlobal(m_hMem, False, pstm);                m_bkImage := TGPImage.Create(pstm);                m_bkIsImage := True;                GlobalUnlock(m_hMem);                pstm := nil;                FreeResource(Dword(lpRsrc));            end;        except        end;    end;    ReDrawWindow();end;procedure TSkinForm.ReDrawWindow();begin    if (IsWindowVisible(m_hWnd)) and (IsIconic(m_hWnd) = False) then    begin        DrawWindow();        InvalidateRect(m_hWnd, nil, False);    end;end;procedure TSkinForm.DrawControlEx(nIndex: Integer);var    Control: TSkinControl;    g: TGPGraphics;    dc: HDC;begin    if (nIndex >= 0) and (nIndex < m_ControlCount) then    begin        Control := m_ControlArray[nIndex];        BitBlt(m_hCacheDC, Control.x, Control.y, Control.Width, Control.Height,            m_hBackDC, Control.x, Control.y, SRCCOPY);        g := TGPGraphics.Create(m_hCacheDC);        g.SetInterpolationMode(InterpolationModeHighQualityBicubic);    //--------------        DrawControl(g, nIndex);    //--------------        dc := GetDC(m_hWnd);        BitBlt(dc, Control.x, Control.y, Control.Width, Control.Height,            m_hCacheDC, Control.x, Control.y, SRCCOPY);        ReleaseDC(m_hWnd, dc);    end;end;procedure TSkinForm.SetHoverControl(nIndex: Integer = -1);var    nOldIndex: Integer;begin    if m_HoverIndex <> nIndex then    begin        nOldIndex := m_HoverIndex;        m_HoverIndex := nIndex;        if (nOldIndex > -1) and (nOldIndex < m_ControlCount) then        begin            m_ControlArray[nOldIndex].bHover := False;            DrawControlEx(nOldIndex);        end;        if (nIndex >= 0) and (nIndex < m_ControlCount) then        begin            m_ControlArray[nIndex].bHover := True;            DrawControlEx(nIndex);        end;    end;end;procedure TSkinForm.SetPressedControl(nIndex: Integer = -1);var    nOldIndex: Integer;begin    if m_PressedIndex <> nIndex then    begin        nOldIndex := m_PressedIndex;        m_PressedIndex := nIndex;        if (nOldIndex >= 0) and (nOldIndex < m_ControlCount) then        begin            m_ControlArray[nOldIndex].bPressed := False;            DrawControlEx(nOldIndex);        end;        if (nIndex >= 0) and (nIndex < m_ControlCount) then        begin            m_ControlArray[nIndex].bPressed := True;            DrawControlEx(nIndex);        end;    end;end;function TSkinForm.GetHoverIndex(pt: TPoint): Integer;var    nIndex, i: Integer;begin    nIndex := -1;    for i := 0 to m_ControlCount - 1 do    begin        if PtInRect(m_ControlArray[i].Rect, pt) then        begin            nIndex := i;            break;        end;    end;    result := nIndex;end;procedure TSkinForm.DisableSysTheme();var    Module: HMODULE;    dwAttr: DWORD;    lpSetWindowTheme: function(hWnd: HWND; a, b: Integer): Integer; StdCall;    lpDwmSetWindowAttribute: function(hWnd: HWND; dwAttribute: DWORD;        pvAttribute: LPDWORD; cbAttribute: DWORD): Integer; StdCall;begin    //防止xp 、vista、win7 用主题绘制窗口nc区    //vista、win7厚边框问题解决办法    Module := GetModuleHandle('UxTheme.dll');    if Module = 0 then        Module := LoadLibrary('UxTheme.dll');    if Module <> 0 then    begin        @lpSetWindowTheme := GetProcAddress(Module, 'SetWindowTheme');        lpSetWindowTheme(m_hWnd, 0, 0);    end;    Module := GetModuleHandle('dwmapi.dll');    if Module = 0 then        Module := LoadLibrary('dwmapi.dll');    if Module <> 0 then    begin        dwAttr := 1;        @lpDwmSetWindowAttribute := GetProcAddress(Module,            'DwmSetWindowAttribute');        lpDwmSetWindowAttribute(m_hWnd, 2, @dwAttr, 4);    end;end;procedure TSkinForm.DrawNineRect(const graphics: TGPGraphics);var    DestRect, SrcRect, NineRect: TRect;begin    DestRect.Left := 0;    DestRect.Top := 0;    DestRect.Right := m_nWidth;    DestRect.Bottom := m_nHeight;    SrcRect.Left := 0;    SrcRect.Top := 0;    SrcRect.Right := m_bkImage.GetWidth();    SrcRect.Bottom := m_bkImage.GetHeight();    NineRect.Left := m_bkNineRect.X;    NineRect.Top := m_bkNineRect.Y;    NineRect.Right := m_bkNineRect.X + m_bkNineRect.Width;    NineRect.Bottom := m_bkNineRect.y + m_bkNineRect.Height;    DrawNineRect(graphics, m_bkImage, DestRect, SrcRect, NineRect);end;procedure TSkinForm.DrawNineRect(const graphics: TGPGraphics; const image:    TGPImage; DestRect, SrcRect, NineRect: TRect);var    x, y, nWidth, nHeight: Integer;    xSrc, ySrc, nSrcWidth, nSrcHeight: Integer;    nDestWidth, nDestHeight: Integer;begin  //g.DrawImage(m_bkImage,rcF,SrcF.X,SrcF.Y,SrcF.Width,SrcF.Height,UnitPixel);    nDestWidth := DestRect.right - DestRect.left;    nDestHeight := DestRect.bottom - DestRect.top;    nDestWidth := DestRect.right - DestRect.left;    nDestHeight := DestRect.bottom - DestRect.top; // 左上-------------------------------------;    x := DestRect.left;    y := DestRect.top;    nWidth := NineRect.left - SrcRect.left;    nHeight := NineRect.top - SrcRect.top;    xSrc := SrcRect.left;    ySrc := SrcRect.top;    DrawNineRect(graphics, image, x, y, nWidth, nHeight, xSrc, ySrc, nWidth,        nHeight); // 上-------------------------------------;    x := DestRect.left + NineRect.left - SrcRect.left;    nWidth := nDestWidth - nWidth - (SrcRect.right - NineRect.right);    xSrc := NineRect.left;    nSrcWidth := NineRect.right - NineRect.left;    nSrcHeight := NineRect.top - SrcRect.top;    DrawNineRect(graphics, image, x, y, nWidth, nHeight, xSrc, ySrc, nSrcWidth,        nSrcHeight); // 右上-------------------------------------;    x := DestRect.right - (SrcRect.right - NineRect.right);    nWidth := SrcRect.right - NineRect.right;    xSrc := NineRect.right;    DrawNineRect(graphics, image, x, y, nWidth, nHeight, xSrc, ySrc, nWidth,        nHeight); // 左-------------------------------------;    x := DestRect.left;    y := DestRect.top + NineRect.top - SrcRect.top;    nWidth := NineRect.left - SrcRect.left;    nHeight := DestRect.top + nDestHeight - y - (SrcRect.bottom -        NineRect.bottom);    xSrc := SrcRect.left;    ySrc := NineRect.top;    nSrcWidth := NineRect.left - SrcRect.left;    nSrcHeight := NineRect.bottom - NineRect.top;    DrawNineRect(graphics, image, x, y, nWidth, nHeight, xSrc, ySrc, nSrcWidth,        nSrcHeight); // 中-------------------------------------;    x := DestRect.left + NineRect.left - SrcRect.left;    nWidth := nDestWidth - nWidth - (SrcRect.right - NineRect.right);    xSrc := NineRect.left;    nSrcWidth := NineRect.right - NineRect.left;    DrawNineRect(graphics, image, x, y, nWidth, nHeight, xSrc, ySrc, nSrcWidth,        nSrcHeight); // 右-------------------------------------;    x := DestRect.right - (SrcRect.right - NineRect.right);    nWidth := SrcRect.right - NineRect.right;    xSrc := NineRect.right;    nSrcWidth := SrcRect.right - NineRect.right;    DrawNineRect(graphics, image, x, y, nWidth, nHeight, xSrc, ySrc, nSrcWidth,        nSrcHeight); // 左下-------------------------------------;    x := DestRect.left;    y := DestRect.top + nDestHeight - (SrcRect.bottom - NineRect.bottom);    nWidth := NineRect.left - SrcRect.left;    nHeight := SrcRect.bottom - NineRect.bottom;    xSrc := SrcRect.left;    ySrc := NineRect.bottom;    DrawNineRect(graphics, image, x, y, nWidth, nHeight, xSrc, ySrc, nWidth,        nHeight); // 下-------------------------------------;    x := DestRect.left + NineRect.left - SrcRect.left;    nWidth := nDestWidth - nWidth - (SrcRect.right - NineRect.right);    xSrc := NineRect.left;    nSrcWidth := NineRect.right - NineRect.left;    nSrcHeight := SrcRect.bottom - NineRect.bottom;    DrawNineRect(graphics, image, x, y, nWidth, nHeight, xSrc, ySrc, nSrcWidth,        nSrcHeight); // 右下-------------------------------------;    x := DestRect.right - (SrcRect.right - NineRect.right);    nWidth := SrcRect.right - NineRect.right;    xSrc := NineRect.right;    DrawNineRect(graphics, image, x, y, nWidth, nHeight, xSrc, ySrc, nWidth,        nHeight);end;procedure TSkinForm.DrawNineRect(const graphics: TGPGraphics; const image:    TGPImage; x, y, w, h, srcx, srcy, srcw, srch: Integer);var    RcF, SrcF: TGPRectF;begin    RcF.X := x;    RcF.Y := y;    RcF.Width := w;    RcF.Height := h;    SrcF.X := Srcx;    SrcF.Y := Srcy;    SrcF.Width := Srcw;    SrcF.Height := Srch;    graphics.DrawImage(image, rcF, SrcF.X, SrcF.Y, SrcF.Width, SrcF.Height,        UnitPixel);end;procedure TSkinForm.AddModuleButton(CtlID: Integer; Caption, ResName, ResType:    string);var    nIndex: Integer;begin    nIndex := CreateControl(SCT_MODULEBUTTON, m_ModuleLeft, 24, 72, 76, CtlID);    m_ModuleLeft := m_ModuleLeft + m_ControlArray[nIndex].Width + 5;    SetControlText(nIndex, Caption);    SetControlImage(nIndex, ResName, ResType);end;procedure TSkinForm.SetModuleCheck(CtlID: Integer);var    i: Integer;begin    for i := 0 to m_ControlCount - 1 do    begin        if m_ControlArray[i].SCType = SCT_MODULEBUTTON then        begin            if m_ControlArray[i].CtlID = CtlID then            begin                m_ControlArray[i].bCheck := True;                DrawControlEx(i);            end            else if m_ControlArray[i].bCheck then            begin                m_ControlArray[i].bCheck := False;                DrawControlEx(i);            end;        end;    end;end;procedure TSkinForm.SetControlText(nIndex: Integer; strText: string);var    nLen: integer;begin    if (nIndex < 0) or (nIndex >= m_ControlCount) then        exit;    m_ControlArray[nIndex].Caption := strText;     //----------------------    if strText = '' then    begin        m_ControlArray[nIndex].WCaption := '';        m_ControlArray[nIndex].wstrLength := 0;    end    else    begin        nLen := MultiByteToWideChar(936, 1, PChar(@strText[1]), -1, nil, 0);        SetLength(m_ControlArray[nIndex].WCaption, nLen - 1);        if nLen > 1 then            MultiByteToWideChar(936, 1, PChar(@strText[1]), -1,                PWideChar(@m_ControlArray[nIndex].WCaption[1]), nLen - 1);        m_ControlArray[nIndex].wstrLength := nLen;    end;end;procedure TSkinForm.SetControlImage(nIndex: Integer; ResName, ResType: string);var    hMod: HMODULE;    HRes: HRSRC;    sResName: string;    sResType: string;    Len: DWORD;    lpRsrc: PByte;    m_hMem: HGLOBAL;    pMem: PByte;    pstm: IStream;begin    if (nIndex < 0) or (nIndex >= m_ControlCount) then        exit;    if m_ControlArray[nIndex].bImage then    begin        m_ControlArray[nIndex].Image.destroy();        m_ControlArray[nIndex].Image.Free();        m_ControlArray[nIndex].bImage := False;    end;    hMod := GetModuleHandle(nil);    sResName := ResName;    sResType := ResType;    HRes := FindResource(HInstance, PChar(sResName), PChar(sResType));    if HRes <> 0 then    begin        Len := SizeofResource(HInstance, HRes);        lpRsrc := PByte(LoadResource(HInstance, HRes));        try            if lpRsrc <> nil then            begin                m_hMem := GlobalAlloc(GMEM_FIXED, Len);                pMem := Pbyte(GlobalLock(m_hMem));                CopyMemory(pMem, lpRsrc, Len);                CreateStreamOnHGlobal(m_hMem, False, pstm);                m_ControlArray[nIndex].Image := TGPImage.Create(pstm);                m_ControlArray[nIndex].bImage := True;                GlobalUnlock(m_hMem);                pstm := nil;                FreeResource(Dword(lpRsrc));            end;        except        end;    end;end;function TSkinForm.CreateRoundPath(x, y, w, h, cornerRadius: Single):    TGPGraphicsPath;var    path1: TGPGraphicsPath;begin    path1 := TGPGraphicsPath.Create();    path1.AddArc(x, y, cornerRadius * 2, cornerRadius * 2, 180, 90); //左上    path1.AddArc(x + w - cornerRadius * 2, y, cornerRadius * 2, cornerRadius        * 2, 270, 90); //右上    path1.AddArc(x + w - cornerRadius * 2, y + h - cornerRadius * 2,        cornerRadius * 2, cornerRadius * 2, 0, 90); //右下    path1.AddArc(x, y + h - cornerRadius * 2, cornerRadius * 2, cornerRadius        * 2, 90, 90); //左下    path1.CloseFigure();    result := path1;end;end.


0 0