⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sskinprovider.pas

📁 AlphaControls是一个Delphi标准控件的集合
💻 PAS
📖 第 1 页 / 共 5 页
字号:
                               CaptionHeight +
                               LinesCount * MenuHeight * integer(MenuPresent) +
                               Form.BorderWidth + 1
                );
              end;
            end
            else begin
              DropSysMenu(Form.Left + BorderWidth, Form.Top + BorderHeight + HeightOf(IconRect));
            end;
          end
          else begin
            if IsIconic(Form.Handle) then begin
              Message.Result := 1;
              Form.Perform(WM_SYSCOMMAND, $F012, 0);
              SendMessage(Form.Handle, WM_NCLBUTTONUP, 0, 0);
            end
            else begin
              SetHotHT(0);
              if (Form.WindowState <> WSMAXIMIZED) or (CursorToPoint(0, TWMNCLButtonDown(Message).YCursor).y > BorderHeight + CaptionHeight) then begin
                Message.Result := CallWindowProc(pointer(OldInstance), Form.Handle, Message.Msg, Message.wParam, Message.lParam);
              end;
            end;
          end
        end;
      end;
      WM_NCRBUTTONDOWN : begin
        Message.Result := 1;
        if not (TWMNCLButtonUp(Message).HitTest in [HTCAPTION, HTSYSMENU]) then begin
          Message.Result := CallWindowProc(pointer(OldInstance), Form.Handle, Message.Msg, Message.wParam, Message.lParam);
        end;
      end;
      WM_NCRBUTTONUP : begin
        case TWMNCLButtonUp(Message).HitTest of
          HTCAPTION, HTSYSMENU : begin
            SetHotHT(0);
            DropSysMenu(TWMNCLButtonUp(Message).XCursor, TWMNCLButtonUp(Message).YCursor);
          end
        end;
        Message.Result := 1;
      end;
      WM_NCLBUTTONUP, WM_LBUTTONUP: begin
        Message.Result := 1;
        case TWMNCHitMessage(Message).HitTest of
          HTCLOSE : begin
            ButtonClose.State := 0;
            SendMessage(Form.Handle, WM_SYSCOMMAND, SC_CLOSE, 0);
          end;
          HTMAXBUTTON : begin
            if Form.WindowState = WSMAXIMIZED then begin
              SendMessage(Form.Handle, WM_SYSCOMMAND, SC_RESTORE, 0);
            end
            else begin
              SendMessage(Form.Handle, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
            end;

            SetHotHT(0);
            SystemMenu.UpdateItems;
          end;
          HTMINBUTTON : begin
            SetHotHT(0);
            Form.WindowState := wsMinimized;
{            if (Application.MainForm = Form) or (fsModal in Form.FormState) then begin
            end else begin
              Form.WindowState := wsMinimized;
            end;}
            SystemMenu.UpdateItems;
//            if Form.FormStyle = fsMDIChild then begin
              BGChanged := True;
              SendMessage(Form.Handle, WM_PAINT, 0, 0);
              SendMessage(Form.Handle, WM_NCPAINT, 0, 0);
              BGChanged := True;
//            end;
          end;
          HTHELP : begin
            SendMessage(Form.Handle, WM_SYSCOMMAND, SC_CONTEXTHELP, 0);
            SetHotHT(0);
            SystemMenu.UpdateItems;
          end;
          // MDI child buttons
          HTCHILDCLOSE : begin
            SendMessage(Form.ActiveMDIChild.Handle, WM_SYSCOMMAND, SC_CLOSE, 0);
          end;
          HTCHILDMAX : begin
            SendMessage(Form.ActiveMDIChild.Handle, WM_SYSCOMMAND, SC_RESTORE, 0);
            SetHotHT(0);
          end;
          HTCHILDMIN : begin
            SendMessage(Form.ActiveMDIChild.Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0);
            SetHotHT(0);
          end
          else begin
            if IsIconic(Form.Handle) then begin
              if Assigned(MDISkinProvider) then begin
                DropSysMenu(Mouse.CursorPos.x, Mouse.CursorPos.y);
              end;
            end
            else begin
              Message.Result := CallWindowProc(pointer(OldInstance), Form.Handle, Message.Msg, Message.wParam, Message.lParam);
            end;
          end
        end;
      end;
      SM_GETCACHE : begin
        if (csLoading in ComponentState) then Exit; //Tries to copy of cache in loading??
        GlobalCacheInfo.Bmp := FsStyle.FCacheBmp;
        GlobalCacheInfo.X := OffsetX;// + TForm(Form).BorderWidth;
        GlobalCacheInfo.Y := OffsetY + 1;// + TForm(Form).BorderWidth;
        GlobalCacheInfo.Ready := True;
      end;
      WM_NCPAINT : begin
        if not Form.Visible or (csLoading in ComponentState) then Exit;
        if RgnChanged and (Form.BorderStyle <> bsNone) then begin
          SetLength(ArOR, 0);
          i := GetSkinIndex(FormTitle);
          i := GetMaskIndex(i, FormTitle, BordersMask);
          if i > -1 then begin
            if IsIconic(Form.Handle) then begin
              AddRgn(ArOR, ma[i].Bmp, IconicWidth);
            end
            else begin
              AddRgn(ArOR, ma[i].Bmp, Form.Width);
            end;
          end;
          RgnChanged := False;
        end;

        if not RgnChanging then begin
          UpdateRgn;
        end;
        DC := GetWindowDC(Form.Handle);
        SavedDC := SaveDC(DC);
        try
          PaintCaption(DC);
        finally
          RestoreDC(DC, SavedDC);
          ReleaseDC(Form.Handle, DC);
        end;
        RgnChanging := False;
        Message.Result := 1;
      end;
      WM_PAINT : begin
        Form.ControlState := Form.ControlState + [csCustomPaint];
        if Form.Visible then OurPaintHandler(TWMPaint(Message)); //!!!1
        Message.Result := 1;
        Form.ControlState := Form.ControlState - [csCustomPaint];
      end;
      WM_CREATE : begin
        Message.Result := CallWindowProc(pointer(OldInstance), Form.Handle, Message.Msg, Message.wParam, Message.lParam);
        if Assigned(Form.Menu) then begin
          for i := 0 to Form.Menu.Items.Count - 1 do begin
            SkinManager.SkinableMenus.InitItem(Form.Menu.Items[i], sSkinData.Active);
          end;
        end;
      end;
      SM_REFRESH : begin
        if (csLoading in ComponentState) then Exit;
        Form.Repaint;
        SendMessage(Form.ClientHandle, WM_SIZE, 0, 0);
        SendMessage(Form.ClientHandle, WM_NCPAINT, 0, 0);
        if Form.Menu <> nil then begin
//          UpdateMenu;!!!
        end;        
      end;
      WM_NCACTIVATE : begin
        Message.Result := CallWindowProc(pointer(OldInstance), Form.Handle, Message.Msg, Message.wParam, Message.lParam);
        if csCreating in Form.ControlState then  Exit;
        SendMessage(Form.Handle, WM_NCPAINT, 0, 0); // Quick caption repaint for reduction of blinking
        if not Activated then begin // Patch by Kim
          Activated := True;
          RefreshScrolls;
        end;

        if (Form.BorderStyle <> bsNone) then begin
          if MDIButtonsNeeded then begin
            if (TWMActivate(Message).Active <> WA_INACTIVE) or (Form.ActiveMDIChild.Active) then begin
              FormActive := (TWMActivate(Message).Active <> WA_INACTIVE) or (Form.ActiveMDIChild.Active);
              BGChanged := True;
            end;
          end
          else begin
            if FormActive <> (TWMActivate(Message).Active <> WA_INACTIVE) then begin
              FormActive := TWMActivate(Message).Active <> WA_INACTIVE;
              BGChanged := True;
            end;
          end;
        end;

        if Form.FormStyle = fsMDIChild then begin// !!!!System calling enables blinking
//          Message.Result := CallWindowProc(pointer(OldInstance), Form.Handle, Message.Msg, Message.wParam, Message.lParam);
          for i := 0 to TsSkinProvider(MDISkinProvider).Form.MDIChildCount - 1 do begin
            if (TsSkinProvider(MDISkinProvider).Form.MDIChildren[i] <> Form) and (TsSkinProvider(MDISkinProvider).Form.MDIChildren[i].Visible) then begin
              SendMessage(TsSkinProvider(MDISkinProvider).Form.MDIChildren[i].Handle, WM_NCPAINT, 0, 0);
            end;
          end;
          TsSkinProvider(MDISkinProvider).BGChanged := True;
          SendMessage(Form.Handle, WM_NCPAINT, 0, 0);
        end;

        if (Form.BorderStyle <> bsNone) {and not (Form.WindowState <> wsMinimized)} then begin
          SendMessage(Form.Handle, WM_NCPAINT, 0, 0);
          m := MakeMessage(SM_SETBGCHANGED, 0, 1, 0);
          BroadCasts(Form, m);
          SkinManager.SkinableMenus.InitItems(sSkinData.Active);
        end;
        if Form.FormStyle = fsMDIForm then begin
          TsMDIForm(MDIForm).RefreshScrolls;
        end
        else begin
          RefreshScrolls;
        end;
        if not MenusInitialized then begin
          UpdateMenu;
          MenusInitialized := True;
        end;
      end;
      WM_ACTIVATE : begin
//        Message.Result := CallWindowProc(pointer(OldInstance), Form.Handle, Message.Msg, Message.wParam, Message.lParam);
        if csCreating in Form.ControlState then  Exit;
        if not Activated then begin // Patch by Kim
          Activated := True;
          RefreshScrolls;
        end;

        BGChanged := True;
{
        if (Form.BorderStyle <> bsNone) then begin
          if MDIButtonsNeeded then begin
            if (TWMActivate(Message).Active <> WA_INACTIVE) or (Form.ActiveMDIChild.Active) then begin
              FormActive := (TWMActivate(Message).Active <> WA_INACTIVE) or (Form.ActiveMDIChild.Active);
              BGChanged := True;
            end;
          end
          else begin
            if FormActive <> (TWMActivate(Message).Active <> WA_INACTIVE) then begin
              FormActive := TWMActivate(Message).Active <> WA_INACTIVE;
              BGChanged := True;
            end;
          end;
        end;
}
        if Form.FormStyle = fsMDIChild then begin// !!System calling enables blinking
//          Message.Result := CallWindowProc(pointer(OldInstance), Form.Handle, Message.Msg, Message.wParam, Message.lParam);
          for i := 0 to TsSkinProvider(MDISkinProvider).Form.MDIChildCount - 1 do begin
            if (TsSkinProvider(MDISkinProvider).Form.MDIChildren[i] <> Form) and (TsSkinProvider(MDISkinProvider).Form.MDIChildren[i].Visible) then begin
              SendMessage(TsSkinProvider(MDISkinProvider).Form.MDIChildren[i].Handle, WM_NCPAINT, 0, 0);
            end;
          end;
          TsSkinProvider(MDISkinProvider).BGChanged := True;
          SendMessage(Form.Handle, WM_NCPAINT, 0, 0);
        end;

        if (Form.BorderStyle <> bsNone) {and not (Form.WindowState <> wsMinimized)} then begin
          SendMessage(Form.Handle, WM_NCPAINT, 0, 0);
          m := MakeMessage(SM_SETBGCHANGED, 0, 1, 0);
          BroadCasts(Form, m);
          SkinManager.SkinableMenus.InitItems(sSkinData.Active);
        end;
        if Form.FormStyle = fsMDIForm then begin
          TsMDIForm(MDIForm).RefreshScrolls;
        end
        else begin
          RefreshScrolls;
        end;
//        UpdateMenu;!!!
      end;
      WM_NCLBUTTONDBLCLK : begin
        Message.Result := 1;
        case TWMNCHitMessage(Message).HitTest of
          HTSYSMENU : begin Form.Close; end;
          HTCAPTION : begin
            if (SystemMenu.EnabledMax) or (SystemMenu.EnabledRestore) then begin
              if (Form.WindowState = WSMAXIMIZED) then begin
                Form.WindowState := WSNormal;
              end
              else begin
                SendMessage(Form.Handle, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
              end;
              SystemMenu.UpdateItems;
            end;
          end;
        end;
      end;
      WM_MEASUREITEM : begin
        if (Form.FormStyle = fsMDIForm) and not (csDesigning in ComponentState) and (MDISkinProvider = Self) then begin
          MDISkinProvider := Self;
        end;
        if not (Form.FormStyle = fsMDIChild) and Assigned(Form.Menu) and Assigned(SkinManager) and (PMeasureItemStruct(Message.LParam)^.CtlType = ODT_MENU) then begin
          mi := Form.Menu.FindItem(PMeasureItemStruct(Message.LParam)^.itemID, fkCommand);
          if mi <> nil then begin
            SkinManager.SkinableMenus.InitItem(mi, True);
          end;
        end;
        Message.Result := CallWindowProc(pointer(OldInstance), Form.Handle, Message.Msg, Message.wParam, Message.lParam);
      end;
      SM_GETPROVIDER : begin Message.Result := integer(Self); end;
      WM_SYSCOMMAND : begin
        if Form.FormStyle = fsMDIChild then begin
          UpdateClient := (Form.WindowState = wsMaximized) and (Message.WParam <> SC_MAXIMIZE);
          Message.Result := CallWindowProc(pointer(OldInstance), Form.Handle, Message.Msg, Message.wParam, Message.lParam);
          case Message.WParam of
            SC_CLOSE, SC_MAXIMIZE, SC_RESTORE, SC_MINIMIZE : begin
              Application.ProcessMessages;
              TsMDIForm(TsSkinProvider(MDISkinProvider).MDIForm).UpdateMDIIconItem;
              TsSkinProvider(MDISkinProvider).BGChanged := True;
              SendMessage(TsSkinProvider(MDISkinProvider).Form.Handle, WM_NCPAINT, 0, 0);

              if UpdateClient then begin
                R := Rect(0, 0,
                        TsMDIForm(TsSkinProvider(MDISkinProvider).MDIForm).Width,
                        TsMDIForm(TsSkinProvider(MDISkinProvider).MDIForm).Height
                );
                InvalidateRect(TsSkinProvider(MDISkinProvider).Form.ClientHandle, @R, True);
              end;
              TsMDIForm(TsSkinProvider(MDISkinProvider).MDIForm).RefreshScrolls;
            end;
          end;
        end
        else Message.Result := CallWindowProc(pointer(OldInstance), Form.Handle, Message.Msg, Message.wParam, Message.lParam);
      end;
      WM_WINDOWPOSCHANGING : begin
        Message.Result := CallWindowProc(pointer(OldInstance), Form.Handle, Message.Msg, Message.wParam, Message.lParam);
        RangeY := Range(sbVertical);
        RangeX := Range(sbHorizontal);
      end;
      WM_ERASEBKGND : begin
        Message.Result := 1;
      end;
//      CM_TEXTCHANGED, WM_SETTEXT : alert;
      WM_EXITSIZEMOVE, WM_WINDOWPOSCHANGED : begin
        Message.Result := CallWindowProc(pointer(OldInstance), Form.Handle, Message.Msg, Message.wParam, Message.lParam);
        if FormChanged then begin
          if not (csCreating in Form.ControlState) then BGChanged := True;
          SendMessage(Form.Handle, WM_PAINT, 0, 0);
          SendMessage(Form.Handle, WM_NCPAINT, 0, 0);
          for i := 0 to Form.ControlCount - 1 do begin
            if (Form.Controls[i] is TWinControl) then begin
              SendMessage(TWinControl(Form.Controls[i]).Handle, SM_REPAINTSMOOTH, 0, 0); // Repaints of transparent controls | 2.01.04 Serge
            end;
          end;
        end;
      end;
      // Caption changing
      WM_SETCURSOR : begin

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -