PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ gefülltes Rechteck zeichnen (GDI)


theOne
2003-06-25, 15:44:47
ich würd gern wissen wie ich in C++ ein gefülltes Rechteck zeichnen kann.

Ein ungefülltes ist ja kein Problem:

Rectangle(HDC hDC, int x, int y, int x2, int y2);


ich kann Farben auswählen, ränder definieren, aber kein gefülltes Rechteck zeichnen.
Könnte mir da wer helfen?

Xmas
2003-06-25, 16:40:27
FillRect ist dein Freund


The FillRect function fills a rectangle by using the specified brush. This function includes the left and top borders, but excludes the right and bottom borders of the rectangle.

int FillRect(
HDC hDC, // handle to DC
CONST RECT *lprc, // rectangle
HBRUSH hbr // handle to brush
);
Parameters
hDC
[in] Handle to the device context.
lprc
[in] Pointer to a RECT structure that contains the logical coordinates of the rectangle to be filled.
hbr
[in] Handle to the brush used to fill the rectangle.

Gast
2003-06-25, 16:55:42
Hab ich eigentlich eh gewusst ;)

scherzal, danke

Gast
2003-06-25, 18:22:56
eine frage hätt ich noch:

Source:
void xy(char str[]){
char test[10];
sprintf(test, "text: %d", sizeof(str));
MessageBox(0, test, "TEST", MB_OK);
}



egal wie lang das char-Array ist; die MessageBox zeigt mir immer

text: 4

an. Warum das so ist,...????da bin ich eigentlich ratlos

Xmas
2003-06-25, 18:50:55
Original geschrieben von Gast
eine frage hätt ich noch:

Source:
void xy(char str[]){
char test[10];
sprintf(test, "text: %d", sizeof(str));
MessageBox(0, test, "TEST", MB_OK);
}



egal wie lang das char-Array ist; die MessageBox zeigt mir immer

text: 4

an. Warum das so ist,...????da bin ich eigentlich ratlos
Weil char str[] nur eine andere Schreibweise für char *str ist. Und der Pointer eben 32bit lang ist.

Dass sizeof(a) die Länge eines Arrays zurückgibt geht nur, wenn a auch als statisches Array (und damit meine ich jetzt nicht static) definiert wurde.
sizeof ist keine Funktion, sondern ein Compilerfeature. Es wird also beim Kompilieren durch eine Konstante ersetzt.

Gast
2003-06-25, 18:52:12
und....wie kann ich dann überhaupt die länge des arrays herausfinden?

Xmas
2003-06-25, 19:02:12
Original geschrieben von Gast
und....wie kann ich dann überhaupt die länge des arrays herausfinden?
Indem du sie als Parameter mitübergibst.

Gast
2003-06-25, 19:03:04
na toll...

Demirug
2003-06-25, 19:14:46
Das ist nun mal so bei C++. Das kommt daher das ein Array bei C++ kein richtiger Datentype ist sondern eigentlichen nur eine andere Syntax für Zeigerspielereien.

Gast
2003-06-25, 20:34:15
stimmt ja eh..

gibt es eigentlich eine möglichkeit zeiger auszugeben?



char text[];
text="Hallo";

MessageBox(0, text, "jhdksa", MB_OK); //->haut nicht hin

char text2[10];
strcpy(text, text2);
MessageBox(0, text2, "hkds", MB_OK); //->das wäre eine möglichkeit;
//einziges Problem: der "String" text2 hat eine länge, unabhängig von der tatsächlichen textlänge




???

Abe Ghiran
2003-06-25, 20:46:02
Meinst du die Adresse des Arrays?


char text[20];

sprintf(text, "address: %i", text);

MessageBox(0, text, "Blub", MB_OK);


Grüße, Jan

Gast
2003-06-25, 21:26:21
nope. ich mein den enthaltenen text

Abe Ghiran
2003-06-25, 21:45:11
Ah so...
Hmm, das machst du doch da oben eigentlich (mit der MessageBox). Sorry, versteh jetzt deine Frage nicht so ganz...

Oder willst du darauf hinaus, das du z.b. von text2 (in deinem vorletzten posting) nur das "Hallo" zu sehen bekommst das du da mit strcpy reinkopiert hast, obwohl doch text2 10 Zeichen groß ist?
Das liegt daran, das eine Funktion wie MessageBox, der du ja nur den Zeiger übergibst, gar nicht wissen kann wie lang das array ist (wie Demi und Xmas ja oben schon erklärt haben).
Deswegen enden in c / c++ Strings immer mit einer 0. MessageBox gibt dann solange den Inhalt des Arrays aus, bis es auf eine 0 stösst.
Die 0, die den String abschließt hat strpcy da hingepackt (an die 5. position des arrays, positionen 0-4 enthalten ja hallo), der rest des arrays bleibt dann ungenutzt.
Böse enden kann das natürlich, wenn die abschließende 0 fehlt, dann wurschteln so Stringfunktionen irgendwann irgendwo in Speicherbereichen rum, die gar nicht zu dem Array gehören.

Grüße, Jan

Xmas
2003-06-26, 15:28:47
Original geschrieben von Gast
char text[];
text="Hallo";
Welchen Compiler hast du eigentlich dass das funktioniert?
char text[];
ist so nicht zulässig. Du musst hier
char *text;
verwenden.
Die andere Schreibweise ist nur in Parameterlisten (andere Schreibweise für Pointer) und bei sofortiger Zuweisung eines Strings/einer Liste zulässig (dann ist es nämlich gar kein Pointer, sondern ein "echtes" Array).


// Zulässig:
int MyFunction(char text[]);
// identisch mit:
// int MyFunction(char *text);

char text[] = "Text";
// identisch mit
// char text[5] = "Text";
// nicht identisch mit:
// char *text = "Text";

int liste[] = { 1, 2, 3, 4 };
// identisch mit
// int liste[4] = { 1, 2, 3, 4 };
// folgendes ist gar nicht erst möglich:
// int *liste = { 1, 2, 3, 4 };

// Nicht zulässig:
char text[];

...

text = "Text";