funkcja floodfill

0

Witam, napiszę jeszcze raz bo nie wiem z jakiej przyczyny mój post powędrował do kosza ? Mam problem, opisałem go, po 10 minutach dostałem odpowiedz, która nie jest związana z moim problemem.
(Mój problem to nie działająca funkcja floodfill() ,a nie wypełnienie formularza i narysowanie prostokąta , takim laikiem to ja nie jestem)
Po kolejnych 2 minutach patrzę, a mój post jest w koszu. No nie. Czy mój temat jest niewygodny czy co?

// twój poprzedni post usunąłem z uwagi na niewiele mówiący temat "floodfill" --> czyt. regulamin. Powiedzmy, że ten jest trochę lepsze, ale na przyszłość: pisz tematy, które opisują wątek w jakimś stopniu. - Deti

Proszę tego nie usuwać. Zależy mi na pomocy.

Witam,

mam problem bo potrzebuję funkcji FloodFill. Niestety nie ma w C# tak łatwo jak miałem w Delphi czy C++
(PaintBox1->Canvas->FloodFill(................)). Przeszukałem trochę internet i znalazłem, że można użyć biblioteki gdi32.dll i tam jest funkcja FloodFill. Mam tylko taki problem, że mi to nie działa :)
Robię coś takiego:

using System.Runtime.InteropServices;

public partial class Form1 : Form
{
    [DllImport("gdi32")]
    public static extern int FloodFill(int hDC, int x, int y, int crColor);       
    Graphics g;
   

    public Form1()
    {
        InitializeComponent();
        pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
        g = Graphics.FromImage(pictureBox1.Image);
    }

A pod przyciskiem mam kod
private void button1_Click(object sender, EventArgs e)
{
g.Clear(Color.White);
g.DrawRectangle(Pens.Black, 10, 20, 30, 40);
int x = 0;
x=FloodFill(g.GetHdc().ToInt32(), 1, 1, ColorTranslator.ToWin32(Color.Black));
pictureBox1.Refresh();
}

Czyli rysuję sobie prostokąt. A następnie chciałbym, żeby to co jest na zewnątrz tego prostokąta zostało zamalowane. Zauważyłem, że funkcja FloodFill zwraca 1 a to by oznaczało, że działa poprawnie (chyba).
Podejrzewam, że problem może być taki, że to maluje tylko na biało i tego nie widać. W C++ moglem sobie zmienić kolor pędzla (PainBox1->Canvas->Brush->Color=clRed) W C# nie ma czegoś takiego :(
Jakieś pomysły?

0
qqwww napisał(a)

Czy mój temat jest niewygodny czy co?

[rotfl]
Zapewne jest niezgodny z linią bieżącej partii rządzącej forum a na dodatek rani uczucia religijne moderatorów.

qqwww napisał(a)

Czyli rysuję sobie prostokąt. A następnie chciałbym, żeby to co jest na zewnątrz tego prostokąta zostało zamalowane.

Nie prościej najpierw narysować tło, a potem przykryć je prostokątem?

qqwww napisał(a)

Zauważyłem, że funkcja FloodFill zwraca 1 a to by oznaczało, że działa poprawnie (chyba).

To jakaś chyba nowa moda, bo zazwyczaj prawidłowym wynikiem działania funkcji jest 0.

qqwww napisał(a)

Jakieś pomysły?

Czemu używasz jakiejś dziwnej zewnętrznej funkcji, zamiast tego, co oferuje .NET? (jeśli to nie tajemnica)
Myślę, że gdybyś napisał co chcesz osiągnąć, to łatwiej byłoby komuś powiedzieć Ci jak to osiągnąć.

0
somekind napisał(a)

Nie prościej najpierw narysować tło, a potem przykryć je prostokątem?

Przeczytałeś to do końca? Przecież mówię, że to nie jest dla mnie problemem. Mój problem funkcja FloodFill(), której będę musiał użyć do bardziej skomplikowanych zadań. To z tym prostokątem to tylko przykład. LUDZIE.

somekind napisał(a)

To jakaś chyba nowa moda, bo zazwyczaj prawidłowym wynikiem działania funkcji jest 0.

Poszukaj sobie opisu do tej funkcji to zobaczysz

Return Values

If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero.

somekind napisał(a)

Czemu używasz jakiejś dziwnej zewnętrznej funkcji, zamiast tego, co oferuje .NET? (jeśli to nie tajemnica)
Myślę, że gdybyś napisał co chcesz osiągnąć, to łatwiej byłoby komuś powiedzieć Ci jak to osiągnąć.

To nie jest dziwna funkcja. W Borlandzie jest ona już od dawna. Tylko w C# nie wiem czemu tego nie dali :-[ . Potrzebne mi to jest bo muszę wypełniać pewne zamknięte figury. Raz na zewnątrz raz wewnątrz.

0

Aby używać HDC musisz dodać do funkcji flagę UnmanagedCode, ten przykład wszystko rozjaśni:

MSDN napisał(a)

public class GDI
{
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
internal static extern bool Rectangle(
IntPtr hdc,
int ulCornerX, int ulCornerY,
int lrCornerX, int lrCornerY);
}

[System.Security.Permissions.SecurityPermission(
System.Security.Permissions.SecurityAction.LinkDemand, Flags =
System.Security.Permissions.SecurityPermissionFlag.UnmanagedCode)]
private void GetHdcForGDI1(PaintEventArgs e)
{

// Create pen.
Pen redPen = new Pen(Color.Red, 1);

// Draw rectangle with GDI+.
e.Graphics.DrawRectangle(redPen, 10, 10, 100, 50);

// Get handle to device context.
IntPtr hdc = e.Graphics.GetHdc();

// Draw rectangle with GDI using default pen.
GDI.Rectangle(hdc, 10, 70, 110, 120);

// Release handle to device context.
e.Graphics.ReleaseHdc(hdc);

}

1 użytkowników online, w tym zalogowanych: 0, gości: 1