Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C#] Dragable Win App

Pagina: 1
Acties:

  • davhor
  • Registratie: Mei 2003
  • Laatst online: 15:36

davhor

www.fon.com

Topicstarter
Veel zoeken en proberen, maar kom toch niet bij de oplossing op een denk ik simpel probleem.

Ik ben een Windows App aan het maken zonder blauwe balk erboven (transparante applicatie met een flashobject erin). Nu wil ik dat ik het venster overal op mijn scherm naartoe kan slepen. Normaal kan je dit door op de blauwe balk te klikken en te slepen. Ik wil dit dus door middel van ergens willekeurig in de applicatie te klikken en dan slepen.

Iemand een voorstel waar ik moet kijken. Zowel Google, Tweakers en MSDN kan ik het juiste antwoord niet vinden.

FON - WiFi for Everyone | Flickr


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Hint: Ik neem aan dat je dan niet op het canvas van je App, maar op het canvas van je Flash klikt?

[ Voor 4% gewijzigd door RobIII op 07-12-2005 15:51 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Hoe ik het in andere applicaties doe :

In de events van je form ;
OnMouseDown event :
zet een flag dat je aan het draggen bent, en sla de X (Xoud) en Y (Youd) positie van de muis t.o.v het scherm zelf op.

OnMouseMove event :
Indien flag staat, dan zet positie van het scherm op X(nu) - Xoud, Y(nu)-Youd.

OnMouseUp event :
Set flag uit

In het OnMousemove event moet je eventueel nog afvangen dat ie niet wordt aangeroepen terwijl je in je eigen code zit ( nog een flag ). De wijzigingen van positie ZOU namelijk ook wel eens een OnMouseMove kunnen triggeren

  • davhor
  • Registratie: Mei 2003
  • Laatst online: 15:36

davhor

www.fon.com

Topicstarter
RobIII schreef op woensdag 07 december 2005 @ 15:50:
Hint: Ik neem aan dat je dan niet op het canvas van je App, maar op het canvas van je Flash klikt?
Klopt. Maar het is niet de bedoeling dat ik de flashapplicatie ga moven, het moet echt de hele win applicatie zijn. Het moet een desktop tool worden welke een kleine ruimte op de desktop in beslag neemt. Icons e.d. moeten wel clickable zijn. Dus ik kan niet het canvas van de winapp op 100% zetten, zodat ik de drag in flash doe.
Verwijderd schreef op woensdag 07 december 2005 @ 15:58:
Hoe ik het in andere applicaties doe :

In de events van je form ;
OnMouseDown event :
zet een flag dat je aan het draggen bent, en sla de X (Xoud) en Y (Youd) positie van de muis t.o.v het scherm zelf op.

OnMouseMove event :
Indien flag staat, dan zet positie van het scherm op X(nu) - Xoud, Y(nu)-Youd.

OnMouseUp event :
Set flag uit

In het OnMousemove event moet je eventueel nog afvangen dat ie niet wordt aangeroepen terwijl je in je eigen code zit ( nog een flag ). De wijzigingen van positie ZOU namelijk ook wel eens een OnMouseMove kunnen triggeren
Ik heb ook met dit idee rongelopen, maar kwam er niet helemaal uit (en dus alweer verwijderd). Ga me hier nogmaals in verdiepen.

FON - WiFi for Everyone | Flickr


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
davhor schreef op woensdag 07 december 2005 @ 16:08:
Klopt. Maar het is niet de bedoeling dat ik de flashapplicatie ga moven, het moet echt de hele win applicatie zijn
Dat begrijp ik, maar ik neem aan dat als je "klikt in je app" de flash stiekem de focus krijgt en die dus op zijn beurt de mouse_moves en mouse_downs enzo gaat vangen. Ik denk dat je die events niet eens in je app krijgt? Je zult ze dus naar "boven" moeten "bubblen" (dus de flash die events laten doorgeven aan z'n parent, in dit geval dus je form).

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

"Vroeger" deed ik dat met de functies: SetCapture en ReleaseCapture.
Deze moest je dan de HWND van je window geven.

Weet geen C#/.Net-commando's hiervoor, maar het zijn gewoon API-calls.

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

je kunt elk component/control overlopen en de event-handlers van mouse down/move/up naar 1 functie laten verwijzen binnen je Form.
(vergeet niet dat je bovenop die event handler ook nog andere kunt toevoegen aan je control om andere acties op te vangen)

evt kun je ook nog de ControlAdded ControlRemoved events opvangen om de event handler te installeren/verwijderen als je nadien dynamisch controls toevoegt verwijdert.

let op dat je dit laatste niet kunt doen om de event handlers te installeren tijdens opbouw van je Form (in InitializeComponent) door de SuspendLayout en ResumeLayout

ASSUME makes an ASS out of U and ME


Verwijderd

HIGHGuY schreef op donderdag 08 december 2005 @ 09:28:
je kunt elk component/control overlopen en de event-handlers van mouse down/move/up naar 1 functie laten verwijzen binnen je Form.
Gebruik gewoon die eventhandlers om een andere event aan te roepen, toch?
Als je van Form overload (wat je doet, neem ik aan) dan krijg je dus iets dergelijks:

C#:
1
2
3
4
private void flash1_MouseDown(object sender, EventArgs e)
{
    this.OnMouseDown(...);
}


en dan vang je zelf dat event af:

C#:
1
2
3
4
this.MouseDown += new EventHandler(delegate(object sender, EventArgs e)
{
    // bladiebla
});

  • davhor
  • Registratie: Mei 2003
  • Laatst online: 15:36

davhor

www.fon.com

Topicstarter
Ik heb het met een gewoon form inmiddels voor elkaar, door onderstaande functie:
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
private bool mouse_is_down=false; 
        private Point mouse_pos; 
        private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            mouse_is_down=true;
            mouse_pos.X = e.X;
            mouse_pos.Y = e.Y;          
        }

        
        private void Form1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            if ( mouse_is_down )
            {
                Point current_pos = Control.MousePosition;
                current_pos.X = current_pos.X - mouse_pos.X; 
                current_pos.Y = current_pos.Y - mouse_pos.Y;
                this.Location = current_pos;
            } 
        }

        private void Form1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            mouse_is_down=false; 
        }
HIGHGuY schreef op donderdag 08 december 2005 @ 09:28:
je kunt elk component/control overlopen en de event-handlers van mouse down/move/up naar 1 functie laten verwijzen binnen je Form.
(vergeet niet dat je bovenop die event handler ook nog andere kunt toevoegen aan je control om andere acties op te vangen)
Vertaal ik dit verhaal voor het flashobject. Dus door de volgende regels toe te voegen aan het InitialiseComponent van het object:
code:
1
2
3
this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseDown);
            this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseUp);
            this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseMove);

dan gebeurt er niks. Volgens mij kan een flashobject ook niet de MouseUp, MouseDown en MouseMove. De enige officiële acties die ik op kan vangen volgens het properties window zijn:
Afbeeldingslocatie: http://www.davhor.nl/actions.jpg
Of zou het zo moeten zijn dat ik deze wel kan overlopen.

FON - WiFi for Everyone | Flickr


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 06-10 13:51

pjvandesande

GC.Collect(head);

Dat kan makkelijker natuurlijk, je hoeft zelf geen flag bij te houden, de buttons die gepressed zijn krijg je al van je MouseEventArgs aangeleverd:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private Point mouse_pos; 
private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
    mouse_pos.X = e.X;
    mouse_pos.Y = e.Y;             
}


private void Form1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
    if ( (e.Button & MouseButtons.Left) > 0 )
    {
        this.Location.X = current_pos.X - Control.MousePosition.X;
        this.Location.Y = current_pos.Y - Control.MousePosition.Y;
    } 
}

[ Voor 9% gewijzigd door pjvandesande op 08-12-2005 10:13 ]


Verwijderd

questa schreef op donderdag 08 december 2005 @ 10:06:
Dat kan makkelijker natuurlijk, je hoeft zelf geen flag bij te houden, de buttons die gepressed zijn krijg je al van je MouseEventArgs aangeleverd:
Da's waarschijnlijk mijn fout. Het voorbeeld dat ik gaf kwam uit een Delphi applicatie van mij, en daar heb je geen buttonstate in de OnMouseMove

  • davhor
  • Registratie: Mei 2003
  • Laatst online: 15:36

davhor

www.fon.com

Topicstarter
Na veel experimenteren ben ik tot de conclusie gekomen dat het niet mogelijk is om met de MouseDown functie op de flashmovie een actie te laten uitvoeren in C#.

Nu zat ik te denken om over de flashmovie eventueel een panel of iets dergelijks te plaatsen, waardoor de actie wel afgevangen wordt in de C# applicatie. Dit werkt, behalve dat ik dan mijn flashapplicatie niet meer zie. Ook al kies ik als backgroundcolor voor het panel "transparent", dan wordt de hele applicatie die daaronderzit (en dus ook de flash) transparant.

Iemand nog ideeën of hints?

FON - WiFi for Everyone | Flickr


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

zoek eens op de class AxHost

daarmee moet je't wel kunnen laten werken.

ASSUME makes an ASS out of U and ME


  • davhor
  • Registratie: Mei 2003
  • Laatst online: 15:36

davhor

www.fon.com

Topicstarter
Ok dan, we zijn eruit. De event handler fscommand moet je gebruiken om variabelen door te passen vanuit flash naar C#.

Wil je van C# naar flash een variabele doorpassen dan doe je dat door middel van SetVariable.

Het was eigenlijk eenvoudiger dan ik dacht.

Wat mij betreft mag er een slotje op! Bedankt voor alle hulp!

FON - WiFi for Everyone | Flickr

Pagina: 1