CheckBox üzerinde X işareti yerine check işareti

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
incal99
Üye
Mesajlar: 23
Kayıt: 20 Eki 2005 02:33

CheckBox üzerinde X işareti yerine check işareti

Mesaj gönderen incal99 »

Herkese İyi AKşamlar.

CheckBox üzerine tıklandığı zaman x işaretinin çıkmasını istiyorum. Delphi üzerinde component resminde x işareti gözükmesine rağmen Form üzerinde checkbox tıklandığında check / işareti çıkıyor.

Chekcboxta tıklandığında x sembolünü nasıl gösterebilirim.


Incal99
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Merhaba..

- Bu işlemi TCheckBox nesnesini manipüle etmeden yapma olanağımız yok malesef.

- Arşivimden bir TCheckBox'u Transparan yapan kodu buldum ve üzerinde küçük bir ekleme ile onay check markını x işaretine dönüştürdüm. Böylece lazım olabilecek başka bir özelliği de kazandırmış olalım. Transparan özelliği...

- Uygulanmış hali de en sondaki FormCreate olayında örnekledim. Mevcut bir CheckBox yok edilmeden önce ölçüleri, konumu ve içeriği alınarak ikizi bu yeni MyCheckBox ile bizim tarzımızda üretiliyor.

Kod: Tümünü seç

// Başlangıç xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
type
  TMyCheckBox = class(TCheckBox)
  protected
    procedure CNDrawItem(var Message: TWMDrawItem);
      message CN_DRAWITEM;
    procedure CMEnabledchanged(var Message: TMessage);
      message CM_ENABLEDCHANGED;
    procedure CreateParams(var Params: TCreateParams); override;
    procedure CreateWnd; override;
    procedure SetChecked(Value: Boolean); override;
    procedure SetButtonStyle;
  public
    constructor Create(AOwner: TComponent); override;
end;
{..}
constructor TMyCheckBox.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  ControlStyle:=ControlStyle - [csDoubleClicks];
end;

procedure TMyCheckBox.CNDrawItem(var Message: TWMDrawItem);
var
  XCanvas: TCanvas;
  XCaptionRect, XGlyphRect: TRect;

  procedure xxDrawBitMap(ACanvas: TCanvas);
  const
    xx_h =13; xx_w = 13;
  var
    xxGlyph: TBitmap;
    xxX, xxY, xxStepY, xxStepX: integer;
  begin
    xxGlyph:=TBitmap.Create;
    try
      //xxGlyph.Handle:=LoadBitmap(0, PChar(OBM_CHECKBOXES));
      If State = cbChecked then begin
        xxGlyph.Width  := 10;
        xxGlyph.Height := 10;
        xxGlyph.Canvas.Brush.Color := clYellow;
        xxGlyph.PixelFormat := pf24Bit;
        xxGlyph.Canvas.FillRect( xxGlyph.Canvas.ClipRect );
        xxGlyph.Canvas.Pen.Style  := psSolid;
        xxGlyph.Canvas.Pen.Color  := clBlack;
        xxGlyph.Canvas.Pen.Width  := 2;
        With xxGlyph.Canvas.ClipRect do
          xxGlyph.Canvas.Rectangle( xxGlyph.Canvas.ClipRect );
        xxGlyph.Canvas.Font.Size  := 7;
        xxGlyph.Canvas.Font.Style := [fsBold];
        xxGlyph.Canvas.Brush.Style := bsClear;
        xxGlyph.Canvas.TextOut(2,-2, 'x');
      end else begin
        xxGlyph.Width  := 10;
        xxGlyph.Height := 10;
        xxGlyph.Canvas.Brush.Color := clWhite;
        xxGlyph.PixelFormat := pf24Bit;
        xxGlyph.Canvas.FillRect( xxGlyph.Canvas.ClipRect );
        xxGlyph.Canvas.Pen.Style  := psSolid;
        xxGlyph.Canvas.Pen.Color  := clBlack;
        xxGlyph.Canvas.Pen.Width  := 2;
        xxGlyph.Canvas.Rectangle( xxGlyph.Canvas.ClipRect );
      end;

      xxY:=XGlyphRect.Top + (XGlyphRect.Bottom - XGlyphRect.Top - xx_h) div 2;
      xxX:=2;
      xxStepX:=0; xxStepY:=0;
      { // ben kaldırdım.. Manipüle etmek için...
      if Enabled then begin
        case State of
          cbChecked: xxStepX:=xxStepX + xx_w;
          cbGrayed:  xxStepX:=xxStepX + xx_w*3;
          end;
        end
      else
        if State=cbChecked
          then begin
                 xxStepX:=xxStepX + xx_w*3;
          end
          else xxStepX:=xxStepX + xx_w*2;
      //}
      ACanvas.CopyRect(Rect(xxX, xxY, xxX+xx_w, xxY+xx_h),
                       xxGlyph.Canvas,
                       Rect(xxStepX, xxStepY, xx_w+xxStepX, xx_h+xxStepY));
    finally
      xxGlyph.Free;
    end;
  end;

  procedure xxDrawCaption;
  var
    xXFormat: longint;
  begin
    xXFormat:=DT_VCENTER + DT_SINGLELINE + DT_LEFT;
    xXFormat:=DrawTextBiDiModeFlags(xXFormat);
    DrawText(Message.DrawItemStruct.hDC, PChar(Caption),
             length(Caption), XCaptionRect, xXFormat);
    end;
begin
  XGlyphRect       := Message.DrawItemStruct.rcItem;
  XGlyphRect.Right := 20;
  XCaptionRect     := Message.DrawItemStruct.rcItem;
  XCaptionRect.Left:= XGlyphRect.Right;

  XCanvas := TCanvas.Create;
  try
    XCanvas.Handle:=Message.DrawItemStruct.hDC;
    XCanvas.Brush.Style:=bsClear;
    xxDrawBitMap(XCanvas);
    xxDrawCaption;
  finally
    XCanvas.Free;
  end;
end;

procedure TMyCheckBox.CMEnabledchanged(var Message: TMessage);
begin
  inherited ;
  Invalidate;
end;

procedure TMyCheckBox.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.ExStyle:=Params.ExStyle or WS_EX_Transparent;
end;

procedure TMyCheckBox.CreateWnd;
begin
  inherited CreateWnd;
  SetButtonStyle;
end;

procedure TMyCheckBox.SetChecked(Value: Boolean);
begin
  inherited SetChecked(Value);
  Invalidate;
end;

procedure TMyCheckBox.SetButtonStyle;
const
  BS_MASK = $000F;
var
  Style: Word;
begin
  if HandleAllocated then begin
    Style:=BS_CHECKBOX or BS_OWNERDRAW;
    if GetWindowLong(Handle, GWL_STYLE) and BS_MASK <> Style
      then SendMessage(Handle, BM_SETSTYLE, Style, 1);
  end;
end;

// Bitiş xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

procedure TForm1.FormCreate(Sender: TObject);
Var
  x, y, w, h : Integer;
  t : String;
begin
  x := CheckBox1.Left;
  y := CheckBox1.Top;
  w := CheckBox1.Width;
  h := CheckBox1.Height;
  t := CheckBox1.Caption;
  CheckBox1.Free;
  CheckBox1 := TMyCheckBox.Create(Self);
  CheckBox1.Parent := Self;
  CheckBox1.Left     :=x;
  CheckBox1.Top      :=y;
  CheckBox1.Width    :=w;
  CheckBox1.Height   :=h;
  CheckBox1.Caption  :=t;
end;
- Tavsiye etmem ama sana zor geliyorsa üzerinde oynama yapmak yerine üçüncü parti hazırlanmış bileşenler de kullanabilirsin.

- Diğer yandan daha etkileyici sonuç verecek çözümler önerebilirim. Mesela checkbox yerine basit bir TLabel veya daha güzeli TImage nesnesi kullanmak gibi. Ben sıkça bu şekilde kullanıyorum.

- Çok sayıda farklı işaret resmi ImageList içine depo ediyorum.

- Bir Image nesnesinin TAG değeri 1 ise checked, 0 ise checked değil kabul ediyor ve işlemlerimde kullanıyorum.

- Image nesnesine OnClick yapıldığında Tag değerini değiştiriyorum, 0 ise 1 veya tersi yapıyorum. Resimler de buna göre güncellenince kullanıcı bir checkbox basmış gibi hissediyor.

- Hatta biraz daha ileri gidip, mouse image üzerin gelince check kutusu zoom yapıyor, basınca işaret biniyor vb. güzellikler de yapabilirsin.

- Cevap uzadı da uzadı seçim senin. Çalışmalarında başarılar...
Resim
Resim ....Resim
incal99
Üye
Mesajlar: 23
Kayıt: 20 Eki 2005 02:33

Mesaj gönderen incal99 »

Mrmarman,

Çok teşekkürler,

Sayende Delphi vizyonum birhayli genişledi.

İyi çalışmalar.

Incal99
Cevapla