お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"RE:Mouseイベント付きのTrackBar"

この発言は
#00980 凛 さんのMouseイベント付きのTrackBar
に対するコメントです

Minにマイナスをセットしたときの挙動がおかしい等の問題点を修正しました。 unit YTrackBar; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TYTrackBar = class(TCustomControl) private //ゲージ周りのマージン lm,tm,bm,rm:integer; FMax: integer; FMin: integer; FGageColor: TColor; FThumbColor: TColor; FPosition: integer; FTW: integer; FMoving:boolean;//サムがドラッグ中かどうか TC, //サムのセンタ GW, //ゲージの幅 by pixcel preX, //動き始めたときのマウスの位置 prePosition, //動き始めたときのFPosition preTC:integer; //ラバーバンド用 FOnChange: TNotifyEvent; procedure setMax(const Value: integer); procedure setMin(const Value: integer); procedure setGageColor(const Value: TColor); procedure setThumbColor(const Value: TColor); procedure setPosition(const Value: integer); procedure setTW(const Value: integer); function ThumbCenter:integer; { Private 宣言 } protected { Protected 宣言 } procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); OverRide; procedure MouseMove(Shift: TShiftState; X, Y: Integer); OverRide; procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); OverRide; public { Public 宣言 } procedure Paint;OverRide; constructor Create(AOwner:TComponent);overRide; property Moving:boolean read FMoving; published { Published 宣言 } property Max:integer read FMax write setMax; property Min:integer read FMin write setMin; property ThumbColor: TColor read FThumbColor write setThumbColor; property ThumbWidth: integer read FTW write setTW; property GageColor :TColor read FGageColor write setGageColor; property Position:integer read FPosition write setPosition; property OnChange: TNotifyEvent read FOnChange write FOnChange; property OnMouseDown; property OnMouseUp; property OnMouseMove; property OnKeyDown; property OnKeyUp; property OnKeyPress; end; procedure Register; implementation procedure Register; begin RegisterComponents('Samples', [TYTrackBar]); end; const //サムの上下マージン ttm=1; tbm=1; constructor TYTrackBar.Create(AOwner: TComponent); begin inherited Create(AOwner); lm:=5;tm:=8;bm:=10;rm:=6; Width:=160;Height:=30; FThumbColor:=clBtnFace; FGageColor:=clWhite; FMax:=100;FMin:=0;FTW:=10; GW:=Width-lm-rm; FMoving:=False; end; procedure TYTrackBar.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin TC:=ThumbCenter; if (x<=TC+FTW div 2) and (x>=TC-FTW div 2) then begin FMoving :=True; preX:=x; prePosition:=FPosition; preTC:=-1; end else FMoving:=False; inherited; end; procedure TYTrackBar.MouseMove(Shift: TShiftState; X, Y: Integer); begin TC:=ThumbCenter; if moving then begin if preTC<>-1 then preTC:=TC; FPosition:=prePosition+Trunc((X-preX)*(FMax-FMin)/GW); if FPosition<FMin then FPosition:=FMin else if FPosition>FMax then FPosition:=FMax; if prePosition<>FPosition then paint; inherited; if Assigned(FOnChange) then FOnChange(self); end; end; procedure TYTrackBar.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin TC:=ThumbCenter; if moving then begin FMoving:=False; invalidate; end; inherited; end; function TYTrackBar.ThumbCenter:integer; begin result:=Trunc((FPosition-FMin)/(FMax-FMin)*GW)+lm; end; procedure TYTrackBar.Paint; var aRect:TRect; begin //まずはゲージの幅を得ておく GW:=Width-lm-rm; TC:=ThumbCenter; With Canvas do begin //ゲージフラット部 Brush.Color:=FGageColor; FillRect(Rect(lm,tm,Width-rm,Height-bm)); //ゲージ3D黒 Pen.Width:=2; Pen.Color:=clBlack; Pen.Mode:=pmCopy; MoveTo(lm,Height-bm); LineTo(lm,tm); LineTo(width-rm,tm); //ゲージ3D白 Pen.Width:=1; Pen.Color:=clWhite; MoveTo(width-rm+1,tm-1); LineTo(width-rm+1,Height-bm+1); LineTo(rm,Height-bm+1); //サム aRect.Left:=TC-FTW div 2; aRect.Right:=TC+FTW div 2; aRect.Top:=ttm; aRect.Bottom:=Height-tbm; if moving then begin // pmNotでラバーバンド Brush.style:=bsClear; Pen.Mode:=pmNot; //前のを消す if preTC=-1 then preTC:=TC else begin Rectangle(preTC-FTW div 2, aRect.Top,preTC+FTW div 2,aRect.Bottom); end; Rectangle(arect); end else begin Brush.Color:=clBlack; FillRect(aRect); aRect:=Rect(aRect.Left+1,aRect.Top+1, aRect.Right-1,aRect.Bottom-2); Brush.Color:=FThumbColor; FillRect(aRect); Pen.Color:=clWhite; MoveTo(aRect.Left,aRect.Bottom); LineTo(aRect.Left,aRect.Top); LineTo(aRect.Right,aRect.Top); end; end; end; procedure TYTrackBar.setGageColor(const Value: TColor); begin FGageColor := Value; end; procedure TYTrackBar.setMax(const Value: integer); begin if (value<>FMax) and (value>FMin) then begin FMax := Value; invalidate; end; end; procedure TYTrackBar.setMin(const Value: integer); begin if (value<>FMin) and (value<FMax) then begin FMin:=value; invalidate; end; end; procedure TYTrackBar.setPosition(const Value: integer); begin if ( value<>FPosition) then begin if value>FMax then FPosition:=FMax else if value<FMin then FPosition:=FMin else begin FPosition := Value; end; if Assigned(FOnChange) then FOnChange(Self); invalidate; end; end; procedure TYTrackBar.setThumbColor(const Value: TColor); begin FThumbColor := Value; end; procedure TYTrackBar.setTW(const Value: integer); begin if (value<>FTW) and (value>1) then begin FTW := Value; lm:=FTW div 2+1; rm:=lm; invalidate; end; end; end. 2001/07/20(Fri) 09:52am MXB01744 凛  - FDELPHI MES(16):玉石混淆みんなで作るSample蔵【見本蓄積】 01/07/20 - Original document by 凛 氏 ID:(MXB01744)



ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum