sp; FState := bsUp;
// DrawBorder case FState of bsUp: if FMouseInControl then Frame3D(memoryBitmap.canvas, buttonRect, FColorHighlight, FColorShadow, 1) else Frame3D(memoryBitmap.canvas, buttonRect, FBorderColor, FBorderColor, 1); bsDown, bsExclusive: Frame3D(memoryBitmap.canvas, buttonRect, FColorShadow, FColorHighlight, 1); bsDisabled: Frame3D(memoryBitmap.canvas, buttonRect, FBorderColor, FBorderColor, 1); end;
// DrawBackground case FState of bsUp: if FMouseInControl then memoryBitmap.Canvas.Brush.Color := FFocusedColor else memoryBitmap.Canvas.Brush.Color := Self.Color; bsDown: memoryBitmap.Canvas.Brush.Color := FDownColor; bsExclusive: if FMouseInControl then memoryBitmap.Canvas.Brush.Color := FFocusedColor else memoryBitmap.Canvas.Brush.Color := FDownColor; bsDisabled: memoryBitmap.Canvas.Brush.Color := Self.Color; end; memoryBitmap.Canvas.FillRect(buttonRect);
// DrawGlyph if not FGlyph.Empty then begin tempGlyph := TBitmap.Create; case FNumGlyphs of 1: case FState of bsUp: sourceRect := Rect(0, 0, FGlyph.Width, FGlyph.Height); bsDisabled: sourceRect := Rect(0, 0, FGlyph.Width, FGlyph.Height); bsDown: sourceRect := Rect(0, 0, FGlyph.Width, FGlyph.Height); bsExclusive: sourceRect := Rect(0, 0, FGlyph.Width, FGlyph.Height); end; 2: case FState of bsUp: sourceRect := Rect(0, 0, FGlyph.Width div FNumGlyphs, FGlyph.Height); bsDisabled: sourceRect := Rect(FGlyph.Width div FNumGlyphs, 0, FGlyph.Width, FGlyph.Height); bsDown: sourceRect := Rect(0, 0, FGlyph.Width div FNumGlyphs, FGlyph.Height); bsExclusive: sourceRect := Rect(0, 0, FGlyph.Width div FNumGlyphs, FGlyph.Height); end; 3: case FState of bsUp: SourceRect := Rect(0, 0, FGlyph.Width div FNumGlyphs, FGlyph.Height); bsDisabled: SourceRect := Rect(FGlyph.width div FNumGlyphs, 0, (FGlyph.Width div FNumGlyphs) * 2, FGlyph.Height); bsDown: SourceRect := Rect((FGlyph.Width div FNumGlyphs) * 2, 0, FGlyph.Width, FGlyph.Height); bsExclusive: SourceRect := Rect((FGlyph.Width div FNumGlyphs) * 2, 0, FGlyph.Width, FGlyph.Height); end; 4: case FState of bsUp: SourceRect := Rect(0, 0, FGlyph.Width div FNumGlyphs, FGlyph.Height); bsDisabled: SourceRect := Rect(FGlyph.width div FNumGlyphs, 0, (FGlyph.Width div FNumGlyphs) * 2, FGlyph.Height); bsDown: SourceRect := Rect((FGlyph.Width div FNumGlyphs) * 2, 0, (FGlyph.Width div FNumGlyphs) * 3, FGlyph.Height); bsExclusive: SourceRect := Rect((FGlyph.width div FNumGlyphs) * 3, 0, FGlyph.Width, FGlyph.Height); end; end;
destRect := Rect(0, 0, FGlyph.Width div FNumGlyphs, FGlyph.Height); tempGlyph.Width := FGlyph.Width div FNumGlyphs; tempGlyph.Height := FGlyph.Height; tempGlyph.canvas.copyRect(destRect, FGlyph.canvas, sourcerect);
if (FNumGlyphs = 1) and (FState = bsDisabled) then begin tempGlyph := CreateDisabledBitmap(tempGlyph, clBlack, clBtnFace, clBtnHighlight, clBtnShadow, True); FTransColor := tempGlyph.Canvas.Pixels[0, tempGlyph.Height - 1]; end;
FImageList := TImageList.CreateSize(FGlyph.Width div FNumGlyphs, FGlyph.Height); try FImageList.AddMasked(tempGlyph, FTransColor); FImageList.Draw(memoryBitmap.canvas, glyphpos.x, glyphpos.y, 0); finally FImageList.Free; end; tempGlyph.free; end;
// DrawText memoryBitmap.Canvas.Brush.Style := bsClear; if FState = bsDisabled then begin OffsetRect(TextBounds, 1, 1); memoryBitmap.Canvas.Font.Color := clBtnHighlight; DrawText(memoryBitmap.Canvas.Handle, PChar(Caption), Length(Caption), TextBounds, DT_CENTER or DT_VCENTER or DT_SINGLELINE); OffsetRect(TextBounds, -1, -1); memoryBitmap.Canvas.Font.Color := clBtnShadow; DrawText(memoryBitmap.Canvas.Handle, PChar(Caption), Length(Caption), TextBounds, DT_CENTER or DT_VCENTER or DT_SINGLELINE); end else DrawText(memoryBitmap.Canvas.Handle, PChar(Caption), Length(Caption), TextBounds, DT_CENTER or DT_VCENTER or DT_SINGLELINE);
// Copy memoryBitmap to screen canvas.CopyRect(ClientRect, memoryBitmap.canvas, ClientRect); finally memoryBitmap.free; // delete the bitmap end; end;
procedure TFlatSpeedButton.UpdateTracking; var P: TPoint; begin if Enabled then begin GetCursorPos(P); FMouseInControl := not (FindDragTarget(P, True) = Self); if FMouseInControl then MouseLeave else MouseEnter; end; end;
procedure TFlatSpeedButton.Loaded; begin inherited Loaded; Invalidate; end;
procedure TFlatSpeedButton.MouseDown (Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin inherited MouseDown(Button, Shift, X, Y); if (Button = mbLeft) and Enabled then begin if not FDown then begin FState := bsDown; Invalidate; end; FDragging := True; end; end;
procedure TFlatSpeedButton.MouseMove (Shift: TShiftState; X, Y: Integer); var NewState: TButtonState; P: TPoint; begin inherited;
// mouse is in control ? P := ClientToScreen(Point(X, Y)); if (MouseInControl <> Self) and (FindDragTarget(P, True) = Self) then begin if Assigned(MouseInControl) then MouseInControl.MouseLeave; // the application is active ? if (GetActi 上一页 [1] [2] [3] [4] 下一页 没有相关教程
|