[ Bokacio @ 24.04.2010. 02:16 ] @
Pozdrav,

Silom prilika moram da koristim WinAPI funkciju CreatePolygonRgn

Uspeo sam sledece:

Code:
[DllImport("gdi32.dll")]
public static extern IntPtr CreatePolygonRgn(POINT[] lppt, int cPoints, int fnPolyFillMode);

public enum PolyFillMode
{
    ALTERNATE = 0x00000001,
    WINDING = 0x00000002
}

POINT[] Points = { };

Points[0].x = -1;
Points[0].y = 5;

Points[1].x = 4;
Points[1].y = -1;

Points[2].x = 9;
Points[2].y = 5;

Points[3].x = 6;
Points[3].y = 5;

Points[4].x = 6;
Points[4].y = 9;

Points[5].x = 3;
Points[5].y = 9;

Points[6].x = 3;
Points[6].y = 4;

Points[7].x = 0;
Points[7].y = 5;

CreatePolygonRgn(Points, 8, PolyFillMode.WINDING); // <-------- ne radi

I poslednji red odbija da se kompajlira i javlja gresku:
The name 'Points' does not exist in the current context

Sta je potrebno jos da uradim. Kako da prosledim ovaj gore navedeni niz kao parametar CreatePolygonRgn?

Pretrazio sam net i sve sto sam nasao su mahom primeri u VB-u.

Hvala na odgovorima.
[ ravni @ 24.04.2010. 10:33 ] @
greska koju dobijas znaci da nisi deklarisao promenljivu Points.
proveri da li ti je Points vidljiv unutar metoda gde prozivas metod CreatePolygonRgn
[ Bokacio @ 24.04.2010. 16:20 ] @
Hvala,

Ja sam stavio deklaraciju unutar case-a. Nisam znao da ona tada nije vidljiva van njega (?).

Zelim da napravim prozorcic u obliku strelice, ali mi sledeci kod ne radi, tj. prozor se uopste ne pojavljuje:

Code:

        protected virtual void SetWindowShape()
        {
            POINT[] Points = { };
            Points = new POINT[8];
            switch (Kind)
            {
                case ArrowKind.Up:
                    Points[0].x = -1;
                    Points[0].y = 5;

                    Points[1].x = 4;
                    Points[1].y = -1;

                    Points[1].x = 9;
                    Points[1].y = 5;

                    Points[1].x = 6;
                    Points[1].y = 5;

                    Points[1].x = 6;
                    Points[1].y = 9;

                    Points[1].x = 3;
                    Points[1].y = 9;

                    Points[1].x = 3;
                    Points[1].y = 4;

                    Points[1].x = 0;
                    Points[1].y = 5;
                    break;
            }          
            Windows.SetWindowRgn(Handle, Windows.CreatePolygonRgn(Points, 8, 1), false);
        }


Da li neko zna gde sam pogresio?

Hvala na pomoci.
[ deerbeer @ 24.04.2010. 16:42 ] @
http://msdn.microsoft.com/en-us/library/aa930600.aspx
Stavi zadnji parametar od SetWindowRgn na True
Ako i to ne uspe vidi da li ti metoda vraca true ...
Obrati paznju i na ovo :
Citat:

If you call SetWindowRgn on a window, you cannot later move or resize the window.

If you do, you are left with lost regions on the screen that never repaint and never go away. To resolve this, call SetWindowRgn(NULL) before calling SetWindowPos, and then call SetWindowRgn again with the new region.


[ Bokacio @ 24.04.2010. 16:48 ] @
Nazalost ne radi ni kada ga stavim na true.

Da li je moguce da sam jos nesto pogresio?

Hvala
[ deerbeer @ 24.04.2010. 16:59 ] @
Prvo moras da proveris prvo rezultat CreatePolyRgn , pa ako prodje onda rezultat SetWindowRgn .
Ako neka ne vrati dobar rezultat uradi po jedan GetLastError() posle svakog poziva .
Ako je sve ok , onda mozda nisi dobro setovao kordinate ..
Citat:
msdn
The coordinates of a window's window region are relative to the upper-left corner of the window, not the client area of the window.

[ Bokacio @ 24.04.2010. 17:22 ] @
Moze li mali code hint kako to uraditi.

Nov sam u c# pa mi je problem to napisati iako sam sa ovom funkcijom vec radio u Delphiju (gde ovaj kod savrseno radi)

Trazio sam po netu i skoro da nema primera sa CreatePolygonRgn funkcijom u c#-u.

PS. Posto pravim kontrolu, probao sam isti kod na praznoj formi i ne radi (forma se ne pojavi). Ako moze neko da mi posalje kod koji pravi formu od 3 linije i to bi jako pomoglo.

Hvala na svemu

[Ovu poruku je menjao Bokacio dana 24.04.2010. u 18:35 GMT+1]
[ Bokacio @ 25.04.2010. 00:35 ] @
Mali update:

Uspeo sam da iscrtam trougao "od" forme, i uspeo da napravim to i od kontrole, ali je problem sto nece da prikaze kontrolu ukoliko se ne nalazi iznad glavne kontrole.

Pravim neku vrstu Grid-a, pa mi je potrebno da iscrtam one strelice koje se pojavljuju prilikom pomeranja kolona.

Jedini nacin koji ja znam je da uzmem floating kontrolu i nju "probusim" uz pomoc ovih funkcija.

Pozdrav
[ ravni @ 25.04.2010. 10:31 ] @
ako sam dobro shvatio sta pokusavas, probaj sa metodama
ControlPaint.DrawReversibleFrame
ControlPaint.DrawReversibleLine

One crtaju direktno po ekranu.