Avatar billede martinbk Nybegynder
30. november 2005 - 16:46 Der er 1 løsning

ReversibleFrame, problemer med at tegne i korrekt position

Hejsa jeg har længe siddet og rodet med et lille tegne program som skal tegne nogle komponenter på et panel, jeg vil gerne have min frame tegnet (og flyttet) midt under markøren, dette virker også fint så længe jeg arbejder med abolutte skærmkordinater det går galt i det øjeblik jeg omsætter det til relative kordinater, så tegnes framen et helt andet sted end under min markør, håber nogen kan gennemskue min brøler, og nu 2 km. kode

public class GUIhandler
    {
        float left;    // x-værdi i venstre kant af tegnepanelet
        float top;      // y-værdi i venstre kant af tegnepanelet
        float pixelM; // scaleringsfaktor: Pixel pr. meter
        float rHeight, rWidth;
        bool ReverseVisible = false;
        RectangleF ReverseRect = new RectangleF(0, 0, 0, 0);

        public GUIhandler(float left, float top, float pixelM)
        {
            this.left=left;
            this.top=top;
            this.pixelM=pixelM;
        }

        public Point RealToLocal(PointF p)
        {
            Point pl = new Point();
            pl.X = (int)((p.X - left) * pixelM + 0.5);
            pl.Y = (int)((p.Y - top) * pixelM + 0.5);
            return pl;
        }

        public Rectangle RealToLocal(RectangleF r)
        {
            Rectangle rl = new Rectangle();
            rl.Location = RealToLocal(r.Location);
            rl.Width = (int)(r.Width * pixelM + 0.5);
            rl.Height = (int)(r.Height * pixelM + 0.5);
            return rl;
        }


        public PointF LocalToReal(Point p)
        {
            PointF pr = new PointF();
            pr.X = p.X / pixelM + left;
            pr.Y = p.Y / pixelM + top;
            return pr;
        }

        public RectangleF LocalToReal(Rectangle r)
        {
            RectangleF rr = new RectangleF();
            rr.Location = LocalToReal(r.Location);
            rr.Width = r.Width / pixelM;
            rr.Height = r.Height / pixelM;
            return rr;
        }

        public void ClearReversible()
        {
            if (ReverseVisible)
            {
                ControlPaint.DrawReversibleFrame(RealToLocal(ReverseRect), Color.Cyan, FrameStyle.Dashed);
                ReverseVisible = false;
            }
        }

        public void DrawReversible(float x, float y)
        {
            x = x - rWidth / 2.0F;
            y = y - rHeight / 2.0F;
            ReverseRect = new RectangleF(x, y, rWidth, rHeight);
            ControlPaint.DrawReversibleFrame(RealToLocal(ReverseRect), Color.Cyan, FrameStyle.Dashed);
            ReverseVisible = true;
        }

        public void knapKlik(string type)
        {
            ClearReversible();
            switch (type)
            {
                case "hylde":
                    rHeight = 2.2F;
                    rWidth = 60.0F;
                    break;
            }
        }
}

og den kalende kode:

private void skabsPanel_MouseMove(object sender, MouseEventArgs e)
        {
            Point ps = skabsPanel.PointToScreen(new Point(e.X, e.Y));
            gui.ClearReversible();
            gui.DrawReversible(ps.X,ps.Y);
        }

/Martin
Avatar billede martinbk Nybegynder
26. december 2006 - 20:03 #1
hmm det må vist være lukketid
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester