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

📄 sframeadapter.pas

📁 Alpha Controls.v5.46b Source
💻 PAS
📖 第 1 页 / 共 2 页
字号:
  end
  else begin
    if Message.Msg = SM_ALPHACMD then case Message.WParamHi of
      AC_SETTRANSBGCHANGED : if BgIsTransparent(SkinData) then FCOmmonData.BGChanged := True;
{      AC_URGENTPAINT : begin
        FCommonData.UrgentPainting := boolean(Message.wParam);
        if FCommonData.UrgentPainting then PrepareCache;
        CommonWndProc(Message, FCommonData);
        Exit;
      end;                   }
      AC_CHILDCHANGED : begin
        if (SkinData.SkinIndex < 0) or not Assigned(SkinData.SkinManager)
          then Message.LParam := 0
          else Message.LParam := integer((SkinData.SkinManager.gd[SkinData.SkinIndex].GradientPercent + SkinData.SkinManager.gd[SkinData.SkinIndex].ImagePercent > 0) or SkinData.RepaintIfMoved);
        Message.Result := Message.LParam;
        Exit;
      end;
      AC_PREPARING : begin
        Message.LParam := integer(FCommonData.BGChanged or FCommonData.Updating);
        Exit
      end;
      AC_UPDATING : begin
        FCommonData.Updating := Message.WParamLo = 1;
        for i := 0 to Frame.ControlCount - 1 do Frame.Controls[i].Perform(Message.Msg, Message.WParam, Message.LParam);
        Exit;
      end;
      AC_GETCACHE : begin
        GlobalCacheInfo := MakeCacheInfo(FCommonData.FCacheBmp);
        Exit;
      end;
      AC_ENDPARENTUPDATE : if IsNT or (not IsNT and FCommonData.Updating) {for win9x} then begin
//      AC_ENDPARENTUPDATE : if FCommonData.Updating then begin // 5.40
        FCommonData.Updating := False;
//        RedrawWindow(Frame.Handle, nil, 0, RDW_INVALIDATE or RDW_UPDATENOW or RDW_ERASE);
        RedrawWindow(Frame.Handle, nil, 0, RDW_INTERNALPAINT or RDW_ALLCHILDREN or RDW_INVALIDATE or RDW_ERASE or RDW_FRAME or RDW_UPDATENOW);
        Exit;
      end else Exit;
      AC_GETCONTROLCOLOR : begin
        if SkinData.Skinned then begin //???? Not all controls may be Hot ???? but... in thinking
          case SkinData.SkinManager.gd[SkinData.Skinindex].Transparency of
            0 : ParentCenterColor := SkinData.SkinManager.gd[SkinData.Skinindex].Color;
            100 : begin if Frame.Parent <> nil
              then begin
                SendMessage(Frame.Parent.Handle, SM_ALPHACMD, MakeWParam(0, AC_GETCONTROLCOLOR), 0);
                if ParentCenterColor = clFuchsia {if AlphaMessage not supported} then ParentCenterColor := TsHackedControl(Frame.Parent).Color
              end
              else ParentCenterColor := ColorToRGB(Frame.Color);
            end
            else begin
              if Frame.Parent <> nil
                then SendMessage(Frame.Parent.Handle, SM_ALPHACMD, MakeWParam(0, AC_GETCONTROLCOLOR), 0)
                else ParentCenterColor := ColorToRGB(Frame.Color);
              // Mixing of colors
              C1.C := ParentCenterColor;
              C2.C := SkinData.SkinManager.gd[SkinData.Skinindex].Color;
              C1.R := IntToByte(((C1.R - C2.R) * SkinData.SkinManager.gd[SkinData.Skinindex].Transparency + C2.R shl 8) shr 8);
              C1.G := IntToByte(((C1.G - C2.G) * SkinData.SkinManager.gd[SkinData.Skinindex].Transparency + C2.G shl 8) shr 8);
              C1.B := IntToByte(((C1.B - C2.B) * SkinData.SkinManager.gd[SkinData.Skinindex].Transparency + C2.B shl 8) shr 8);
              ParentCenterColor := C1.C;
            end
          end;
        end
        else if Assigned(Frame) then ParentCenterColor := ColorToRGB(TsHackedControl(Frame).Color);
      end
    end
    else case Message.Msg of
      CM_MOUSEENTER : if not (csDesigning in ComponentState) then begin
        OldWndProc(Message);
        for i := 0 to Frame.ControlCount - 1 do begin
          if (Frame.Controls[i] is TsSpeedButton) and (Frame.Controls[i] <> Pointer(Message.LParam)) and TsSpeedButton(Frame.Controls[i]).SkinData.FMouseAbove then begin
            Frame.Controls[i].Perform(CM_MOUSELEAVE, 0, 0) // !!!!
          end;
        end;
        if DefaultManager <> nil then DefaultManager.ActiveControl := Frame.Handle;
      end;
      CM_VISIBLECHANGED : begin
        FCommonData.BGChanged := True;
        OldWndProc(Message);
        if Assigned(SkinData.SkinManager) then SendMessage(Frame.Handle, SM_ALPHACMD, MakeWParam(0, AC_REFRESH), LongWord(SkinData.SkinManager));
//        Frame.Repaint;
//        FCommonData.BGChanged := False;
      end;
      WM_SIZE, WM_MOVE : begin
        FCommonData.BGChanged := FCommonData.BGChanged or (Message.Msg = WM_SIZE) or FCommonData.RepaintIfMoved;
        if FCommonData.BGChanged then begin
          m := MakeMessage(SM_ALPHACMD, MakeWParam(1, AC_SETBGCHANGED), 0, 0);
          Frame.BroadCast(m);
        end;
        OldWndProc(Message);
//        Frame.Repaint;
//        if not FCommonData.Updating then FCommonData.BGChanged := False;
      end;
      WM_PARENTNOTIFY : if ((Message.WParam and $FFFF = WM_CREATE) or (Message.WParam and $FFFF = WM_DESTROY)) and not (csLoading in ComponentState) and not (csCreating in Frame.ControlState) then begin
        OldWndProc(Message);
        UpdateScrolls(ListSW, False);
        if Message.WParamLo = WM_CREATE then AddToAdapter(Frame);
      end
      else OldWndProc(Message);
      CM_SHOWINGCHANGED : begin
        OldWndProc(Message);
        RefreshScrolls(SkinData, ListSW);
        AddToAdapter(Frame);
      end;
      WM_PAINT : begin
        if (csDesigning in Frame.ComponentState) or (Frame.Parent = nil) or (csDestroying in ComponentState)
          then OldWndProc(Message)
          else OurPaintHandler(TWMPaint(Message));
      end;
      WM_PRINT : if FCommonData.Skinned then begin
        FCommonData.Updating := False;
        if ControlIsReady(Frame) then begin
          OurPaintHandler(TWMPaint(Message), False);
          Ac_NCPaint(ListSW, Frame.Handle, Message.wParam, Message.lParam, -1, TWMPaint(Message).DC);
        end;
      end
      else OldWndProc(Message);
      WM_NCPAINT, WM_ERASEBKGND : if csDesigning in Frame.ComponentState then OldWndProc(Message) else begin
        FCommonData.Updating := FCommonData.Updating;
        Message.Result := 1;
      end;
      else OldWndProc(Message);
    end;
  end;
end;

procedure TsFrameAdapter.OurPaintHandler(Msg: TWMPaint; DefaultDrawing : boolean = True);
var
  Changed : boolean;
  DC, SavedDC : hdc;
  PS : TPaintStruct;
begin
  BeginPaint(Frame.Handle, PS);
  if not DefaultDrawing then DC := Msg.DC else DC := GetDC(Frame.Handle);
  SavedDC := SaveDC(DC);
  try
    FCommonData.Updating := FCommonData.Updating;
    if not FCommonData.Updating then begin
      FCommonData.BGChanged := FCommonData.BGChanged or FCommonData.HalfVisible; // v4.54
      if SkinData.RepaintIfMoved and (Frame.Parent <> nil) then begin
        FCommonData.HalfVisible := not (PtInRect(Frame.Parent.ClientRect, Point(Frame.Left + 1, Frame.Top + 1)));
        FCommonData.HalfVisible := FCommonData.HalfVisible or not PtInRect(Frame.Parent.ClientRect, Point(Frame.Left + Frame.Width - 1, Frame.Top + Frame.Height - 1));
      end
      else FCommonData.HalfVisible := False;
      Changed := FCommonData.BGChanged;
      if Changed and not FCommonData.UrgentPainting then PrepareCache;

      CopyWinControlCache(Frame, FCommonData, Rect(0, 0, 0, 0), Rect(0, 0, Frame.Width, Frame.Height), DC, True);

      sVCLUtils.PaintControls(DC, Frame, Changed, Point(0, 0));
//      if DefaultDrawing then v5.45
      SetParentUpdated(Frame);
    end;
  finally
    RestoreDC(DC, SavedDC);
    if DefaultDrawing then ReleaseDC(Frame.Handle, DC);
    EndPaint(Frame.Handle, PS);
  end;
end;

procedure TsFrameAdapter.PrepareCache;
begin
  SkinData.InitCacheBmp;
  SkinData.FCacheBmp.Width := Frame.Width;
  SkinData.FCacheBmp.Height := Frame.Height;

  SkinData.FCacheBMP.Canvas.Font.Assign(Frame.Font);

  SendMessage(Frame.Parent.Handle, SM_ALPHACMD, MakeWParam(0, AC_GETCACHE), 0);

  PaintItem(SkinData, GlobalCacheInfo, False, 0, Rect(0, 0, Frame.Width, Frame.Height),
            Point(Frame.Left, Frame.Top), SkinData.FCacheBMP, False);
  SkinData.BGChanged := False;
end;

end.

⌨️ 快捷键说明

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