[Delphi] TImage.OnClick werkt niet?[/Delphi]

Pagina: 1
Acties:

  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 09-07 16:41

TheLunatic

Ouwe boxen.

Topicstarter
Ik heb een form gemaakt, en de hele achtergrond opgevuld met een plaatje (omdat ik geen windows-layout wil). Nu heb ik ook nog een TImage-Component toegevoegd, die precies mooi samenvalt met de achtergrond enzo, dus het ziet er heel mooi uit, en dat plaatje wil ik gebruiken als knop. Dus als ik er op klik, moet het form sluiten. Maar dat werkt niet ! Wat voor code ik ook in de procedure zet van de OnClick, niets werkt ! Hoe kan dat ?


Opm. 1) Ik gebruik een TImage ipv een TBitBtn omdat een BitButton beweegt op het moment dat je er op klikt, EN omdat een plaatje moeilijk mooi is te positioneren op de button

Opm. 2) Ik gebruik een stuk delphi-code van een ander programma, die er voor zorgt dat alle pixels in het achtergrond plaatje met kleur #FF00FF transparant worden.

Opm. 3) Ook als ik een popmenu wil maken op frmMain of imgPicture (da's die achtergrond) werkt die niet.



Edit: Sorry voor [/delphi] achter de topictitle, da's schijnbaar een automatisme geworden ofzo, die eind-tag |:(

Mother, will they like this song?


Verwijderd

... je kunt ook een plaatje op je form zetten als achtergrond en dan een onclick maken op TForm dat lijkt me simpeler

  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 09-07 16:41

TheLunatic

Ouwe boxen.

Topicstarter
Op maandag 08 april 2002 09:49 schreef Zoepnek het volgende:
... je kunt ook een plaatje op je form zetten als achtergrond en dan een onclick maken op TForm dat lijkt me simpeler
Dat gaat dus niet, omdat het plaatje het hele form overlapt. Dus: De OnClick van frmMain en imgPicture werken niet...

Mother, will they like this song?


Verwijderd

dan moet je op de timage de mouse up/move/down doorgeven aan het form.

  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 09-07 16:41

TheLunatic

Ouwe boxen.

Topicstarter
Op maandag 08 april 2002 10:02 schreef deur het volgende:
dan moet je op de timage de mouse up/move/down doorgeven aan het form.
Kun je mij misschien ook vertellen hoe dat moet ? Ik ben niet zo'n pro op dit gebied...

Mother, will they like this song?


Verwijderd

Misschien kun je beter op het canvas (van het Form) tekenen, dan heb je wel je bg-picture, maar dan kan je wel de events afvangen van je form'pje.

Verwijderd

btw: dat kan je doen door:
Form.Canvas.Draw( x, y, een TBitmap );

  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 09-07 16:41

TheLunatic

Ouwe boxen.

Topicstarter
Ja maar dan heb ik dus geen transparantie in die bitmap:

Afbeeldingslocatie: http://home.wish.net/~kvdzalm/img.jpg


Dat Divx-Magik venster, da's dus m'n proggie. Een form die niet zichtbaar is (frmMain.Border:=bsNone), met daarop een TImage, waarvan alle pixels die #FF00FF als kleur hebben, transparant worden gemaakt (met een voor mij ingewikkeld stuk code van een site gedownload). Het zou al heel wat zijn als ik van die image de OnClick-event kon gebruiken

Mother, will they like this song?


Verwijderd

Op maandag 08 april 2002 10:15 schreef unteraarsch het volgende:
btw: dat kan je doen door:
Form.Canvas.Draw( x, y, een TBitmap );
of:
code:
1
2
3
4
procedure TForm1.FormPaint(Sender: TObject);
begin
bitblt(canvas.handle,0,0,image1.width,image1.height,image1.picture.bitmap.canvas.handle,0,0,srccopy);
end;

Verwijderd

procedure TForm1.Image1Click(Sender: TObject);
begin
Form1.Close;
end;

laat WMNCHitTest de mouse click wel ongemoeid?
lastig he, dat windows proggen...

Verwijderd

doet dit niets bij jou?
code:
1
2
3
4
procedure TForm1.Image1Click(Sender: TObject);
begin
showmessage('Image1Click');
end;

Als dat niet werkt, kijk dan eens bij de onClick van het form.
edit:
had je al gedaan, zag ik.
kijk anders eens of de MouseDown,MouseMove,MouseUp wel werken van form/image


Verwijderd

Ja het zou kunnen dat het object wat die transparantie regelt, de events een beetje vernagt...
Het is lang geleden dat ik met delphi werkte, ik werk nu met CBuilder, die heeft als het goed is dezelfde VCL opbouw.
Bij mij vangt hij (geloof ik, is weer een tijdje terug) wel gewoon events af.

Dus het zal wel aan dat transparantie-object liggen.

  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 09-07 16:41

TheLunatic

Ouwe boxen.

Topicstarter
Dit is de code die ik gebruik voor het transparant maken van de TImage (niet zelf geschreven) :
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
procedure TfrmMain.FormCreate(Sender: TObject);

  procedure GetNextSpan(const row: PByteArray; const SpanLeft: Integer; var SpanRight: Integer; var SpanColor:TColor);
  var
    column    : Integer;
    TempColor : TColor;
  begin
    column := SpanLeft;
    TempColor := MaskColor(row, SpanLeft);
    repeat
    column := column + 1;
    until (TempColor <> MaskColor(row, column)) or (column >= ImageMap.Width);
    SpanRight := column - 1;
    SpanColor := TempColor;
  end;

var
  y    : Integer;
  row    : PByteArray;
  YRgn  : HRGN;
  SpanRgn   : HRGN;
  SpanLeft  : Integer;
  SpanRight : Integer;
  SpanColor : TColor;
begin
  frmMain.Canvas.Brush.Style := bsClear;
  ImageMap := imgPicture.Picture.Bitmap;
  WindowRgn := CreateRectRgn(0, 0, 0, 0);
  for y := 0 to ImageMap.Height - 1 do
  begin
    YRgn := CreateRectRgn(0, y, 0, y);
    row := ImageMap.scanline[y];
    SpanLeft := 0;
    SpanRight := 0;
    repeat
    GetNextSpan(row, SpanLeft, SpanRight, SpanColor);
    if SpanColor <> clFuchsia then
    begin
      SpanRgn := CreateRectRgn(SpanLeft, y, SpanRight + 1, y + 1);
      CombineRgn(YRgn, YRgn, SpanRgn, RGN_OR);
      DeleteObject(SpanRgn);
    end;
    SpanLeft := SpanRight + 1;
    until (SpanRight >= ImageMap.Width);
    CombineRgn(WindowRgn, WindowRgn, YRgn, RGN_OR);
    DeleteObject(YRgn);
  end;
  SetWindowRgn(Handle,WindowRgn,true);
end;

function TfrmMain.MaskColor(row: PByteArray; x: word):TColor;
  var
    r, g, b: byte;
  begin
  if ImageMap = nil then exit;
  if x > ImageMap.Width then exit;

  b := row[x * 3];
  g := row[x * 3 + 1];
  r := row[x * 3 + 2];

  if (r = 255) and (g = 0) and (b = 255) then result := clFuchsia
end;

procedure TfrmMain.WMNCHitTest (var M: TWMNCHitTest);
begin
  inherited;
  if M.Result = htClient then
  M.Result := htCaption;
end;

procedure TfrmMain.FormKeyPress(Sender: TObject; var Key: Char);
begin
  if Key = CHR(27) then Application.Terminate
end;

procedure TfrmMain.FormPaint(Sender: TObject);
begin
  Canvas.Draw(0, 0, ImageMap);
end;

Dus de image op de canvas drawen gaat niet lijkt me, omdat dan de transparantie vervalt (zie screenshot boven).
Op maandag 08 april 2002 10:24 schreef deur het volgende:
doet dit niets bij jou?
code:
1
2
3
4
procedure TForm1.Image1Click(Sender: TObject);
begin
showmessage('Image1Click');
end;

Als dat niet werkt, kijk dan eens bij de onClick van het form.
OnClick-events van Form EN Image werken niet.

Mother, will they like this song?


Verwijderd

het ligt aan die:

procedure TForm1.WmNCHitTest(var Msg: TWMNCHitTest);
begin
DefaultHandler(Msg);
if Msg.Result = HTCLIENT then
Msg.Result := HTCAPTION;
end;

als je die weghaalt doet die het wel goed.

  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 09-07 16:41

TheLunatic

Ouwe boxen.

Topicstarter
Als iemand me even uitlegt wat die WMNCHitTest is en doet :) en hoe het werkt enzo dan wil ik het wel proberen! in de help staat het namelijk niet :|

^^^^^^^^^^^^^^^^^^
Dat hierboven was best dom van mij :) Ik heb het weggehaald, en het werkt !!

Mother, will they like this song?


Verwijderd

dat zorgt ervoor dat je het hele form kan slepen.
zie bv. http://www.delphipages.com/tips/thread.cfm?ID=29

Verwijderd

staat trouwens wel in de help (win32sdk) onder: WM_NCHITTEST

  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 09-07 16:41

TheLunatic

Ouwe boxen.

Topicstarter
Okay, dat werkt !! Maar nu kan ik dus mijn form niet meer slepen :D hoe gaan we dat aanpakken ? Kan ik dan gewoon even puzzelen met onclick enzo, en dan de muisbeweging catchen? Of is het niet zo makkelijk als ik nu zeg?

Mother, will they like this song?


Verwijderd

tuurlijk moet lukken...
alles wat je zelf maakt, werkt altijd beter..
gewoon x en y afvangen en ff rekeken

Verwijderd

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var form_dragging:boolean=false;
    MouseDownPos:tpoint;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 form_dragging:=true;
 MouseDownPos.x:=x;
 MouseDownPos.y:=y;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if form_dragging then
begin
 form1.left:=form1.left-MouseDownPos.x+x;
 form1.top:=form1.top-MouseDownPos.y+y;
end;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 form_dragging:=false;
end;

  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 09-07 16:41

TheLunatic

Ouwe boxen.

Topicstarter
Way cool dude ! Thanks, da's echt gaaf nu werkt het zoals het moet :)


en ik maar denken dat OnMouseUp diende voor als de muis omhoog bewoog :)

Mother, will they like this song?

Pagina: 1