Problem mit gdi32.dll E x t F l o o d F i l l

15/04/2008 - 12:54 von Rainer Queck | Report spam
Hallo NG,

wegen eines noch zu lösenden Problems muss ich "E x t F l o o d F i l l"
und "F l o o d F i l l"
mit den Spaces schreiben.
Im tatsàchlichen Code ist das natürlich nicht der Fall.
Wenn interessiert, warum, der möge bitte meinen Thread in dieser NG von
heute "filter" lesen.

Nun mein gdi32 Problem:
In der Anwendung, an welcher ich zur Zeit arbeite, verwende ich aus Gründen
der Performance die "gdi32.dll" zum Zeichnen in Bitmaps.
Soweit funktionieren die von mir verwendeten GDI32.dll Funktionen auch
bestens.

Nun muss ich in einem "Symbol-Bitmap" die Farbe des Symbols zur Laufzeit
àndern. Hierzu würde ich gerne die Funktion "E x t F l o o d F i l l"
aus der GDI32.dll verwenden, nur wie es scheint, habe ich mir hierbei einen
Fehler eingebaut, denn mit dem F l o o d F i l l passiert
schlichtweg garnichts, das betreffende Symbol àndert seine Farbe nicht.


Die unten aufgeführten Methoden zeigen meinen Code zu dem sich folgendes
sagen làßt:

- Beim Durchschreiten des Codes mit dem Debugger kommte es zu keinen
Exceptions.

- Die Zeile in SetBmpSymbolColor "GDI32.DoF l o o d F i l l(hdc, x, y,
color);" wird
aufgerufen.
(Ausgangsbitmap ist eines mit einem vergleichsweise großem, schawarzen
symbol)

- Verwende ich statt Do F l o o d F i l l die auskommentierte Zeile
"GDI32.DrawRect(hdc, new WinRect(10, 10, 20, 20), Color.Red);"
wird in das Bitmap das erwartete rote Rechteck gezeichnet, d.h. das "hdc"
ist OK.

- In der Methode "DoF l o o d F i l l" spielt es keine Rolle ob ich "rgb"
oder
"rgb1" beim Aufruf von
"E x t F l o o d F i l l(hdc, x, y, rgb1, 1);" verwende.

- Werte ich den Rückgabewert von E x t F l o o d F i l l aus ist dieser
immer "false",
was auf einen Fehler hindeutet, oder?


Wo nur habe ich den Fehler eingebaut?
Für Hilfe und Hinwiese wàre ich sehr dankbar!

Gruß
Rainer


public void SetBmpSymbolColor(ref Bitmap defectBm, Color color)
{
try
{
Graphics g = Graphics.FromImage(defectBm);
IntPtr hdc = g.GetHdc();

// lets look for the symbol...
int x = defectBm.Width / 2;
for (int y = 0; y < defectBm.Height; y++)
{
Color c = defectBm.GetPixel(x, y);
if (c.ToArgb() == Color.Black.ToArgb())
{
// symbol found now do f l o o d f i l l with desired
color..
GDI32.DoF l o o d F i l l(hdc, x, y, color);

//GDI32.DrawRect(hdc, new WinRect(10, 10, 20, 20),
Color.Red);
}
}
g.ReleaseHdc(hdc);
}
catch( System.Exception ex )
{
FileDiagnose.Instance.ReportError("RibbonVisualizerWin32.SetBmpSymbolColor:
"
+ ex.Message);
}
}

// auszug aus der Klasse GDI32...

[System.Runtime.InteropServices.DllImport("gdi32.dll")]
internal static extern bool E x t F l o o d F i l l(
IntPtr hdc,
int nXStart,
int nYStart,
int crColor,
uint filltype
);
// = graphical utility functions =public static void Do F l o o d F i l l(IntPtr hdc,int x, int y, Color
color)
{
int rgb = ColorTranslator.ToWin32(color);
int rgb1 = ColorTranslator.ToWin32(Color.Black);
IntPtr hBrush = CreateSolidBrush(rgb);
IntPtr oldObj = SelectObject(hdc, hBrush);
DeleteObject(oldObj);
E x t F l o o d F i l l(hdc, x, y, rgb1, 1);
}
 

Lesen sie die antworten

#1 Thomas Scheidegger
15/04/2008 - 13:08 | Warnen spam
Hallo Rainer

verwende ich aus Gründen der Performance die "gdi32.dll"



naja, würde ich ja möglichst meiden ...


- Werte ich den Rückgabewert von E x t F l o o d F i l l aus ist dieser
immer "false", was auf einen Fehler hindeutet, oder?



mache _direkt_ nach PInvoke-Aufruf von EFF mal ein
Marshal.GetLastWin32Error
evtl. gibts einen aussagekràftigeren Code.



IntPtr oldObj = SelectObject(hdc, hBrush);
DeleteObject(oldObj);



ich glaube die Select-Logik ging seinerzeit anders, lies Win32 SDK.




Thomas Scheidegger - 'NETMaster'
http://www.cetus-links.org/oo_dotnet.html - http://dnetmaster.net/

Ähnliche fragen