PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : GDI+ in C#


Elemental
2005-05-03, 08:32:38
Kann mir bitte mal jemand folgenden Code erklären:


[DllImport("gdi32.dll")] private static extern IntPtr CreateSolidBrush(uint colorRef);

public static IntPtr GetSolidBrushHandle(int argb)
{
int r = (argb & 0x00FF0000) >> 16;
int g = (argb & 0x0000FF00) >> 8;
int b = argb & 0x000000FF;

int modified = r + (g << 8) + (b << 16);
IntPtr h = CreateSolidBrush((uint) modified);
return h;
}


Wozu braucht man denn diese rumgeshifte?
wieso kann man nicht einfach den int argb in CreatesolidBrush() reinstecken?

mfG
Elemental

grakaman
2005-05-03, 09:38:24
Kann mir bitte mal jemand folgenden Code erklären:


[DllImport("gdi32.dll")] private static extern IntPtr CreateSolidBrush(uint colorRef);

public static IntPtr GetSolidBrushHandle(int argb)
{
int r = (argb & 0x00FF0000) >> 16;
int g = (argb & 0x0000FF00) >> 8;
int b = argb & 0x000000FF;

int modified = r + (g << 8) + (b << 16);
IntPtr h = CreateSolidBrush((uint) modified);
return h;
}


Wozu braucht man denn diese rumgeshifte?
wieso kann man nicht einfach den int argb in CreatesolidBrush() reinstecken?

mfG
Elemental


Also laut Doku sollte das auch über Color.FromArgb(int argb) möglich sein und das dann eben bei der SolidBrush Klasse benutzen. Oben hat man das eben über Win32 und PInvoke gelöst. Vielleicht gehts dort nicht anders?!

Elemental
2005-05-03, 09:53:52
Die DrawingEngine, aus der dieser Code stammt macht irgendwie alles mit PInvoke und erledigt die ganze Speicherverwaltung selbst.

Ich check blos nicht, wieso man da mit dem int argb so komisch rumshifted und dann einen neuen int für CreateSolidBrush() erzeugt...


mfG
Elemental

Asmodeus
2005-05-03, 10:27:06
Die DrawingEngine, aus der dieser Code stammt macht irgendwie alles mit PInvoke und erledigt die ganze Speicherverwaltung selbst.

Ich check blos nicht, wieso man da mit dem int argb so komisch rumshifted und dann einen neuen int für CreateSolidBrush() erzeugt...


mfG
Elemental

Naja, wie es aussieht werden doch einfach aus dem argb die Kanäle r,g,b herausgelesen, um sie dann in ein bgr zu überführen. Gibt ja z.B. auch einige Bildformate, die mit bgr anstatt mit rgb arbeiten.

Gruss, Carsten.

Elemental
2005-05-03, 10:31:10
Shame on me; is mir garnicht aufgefallen, dass nach dem geshifte kein rgb mehr ist... :rolleyes:

Elemental
2005-05-03, 11:09:55
Hab mich jetzt mal etwas in der MSDN Lirbary schlau gemacht:
CreateSolidBrush() ertwartet ein COLORREF als Parameter.


COLORREF

The COLORREF value is used to specify an RGB color.

typedef DWORD COLORREF;
typedef DWORD *LPCOLORREF;

Remarks

When specifying an explicit RGB color, the COLORREF value has the following hexadecimal form:

0x00bbggrr

The low-order byte contains a value for the relative intensity of red; the second byte contains a value for green; and the third byte contains a value for blue. The high-order byte must be zero. The maximum value for a single byte is 0xFF.


Gibts da eine alternative, die auch den Alpha-Wert berücksichtigt?


mfG
Elemental