Eigene Zeichenfunktion tut nichts, Rückgabewert sagt was anderes
Hallo Leute!
Ich habe mir eine Funktion erstellt, die simple, gefärbte Rechtecke auf dem Bildschirm ausgeben soll.
Ich habe von dieser Funktion zwei Versionen:
1. 'drawRect' Nimmt einen Startpunkt (von links oben aus gesehen) und Breite & Höhe.
2. 'drawRectSym' Nimmt 4 Parameter (exkl. Farbe):
Left und Top sind als Startpunkt (von links oben),
Right und Bottom sind als Endpunkt (von rechts unten) gedacht.
Die 1. Version funktioniert tadellos, allerdings die 2 nicht.
Zuerst hatte ich keinen Rückgabewert festgelegt (void), bis dieser Fehler auftrat. Dann habe ich den Wert von 'FillRect()' getestet (eigentliche Zeichenfunktion),
aber da kam immer true, also Erfolgreich zurück.
Da ich den Fehler aber selber nicht finde, möchte ich euch bitten, euch den Code mal anzuschauen.
Vielleicht fällt euch ja etwas auf.
System & IDE:
Windows 10 vor dem Creators Update
Dev-C++ mit gcc Compiler und manuell hinzugefügte Bibliothek GDI32
Gruß,
tomaschku
Ich habe mir eine Funktion erstellt, die simple, gefärbte Rechtecke auf dem Bildschirm ausgeben soll.
Ich habe von dieser Funktion zwei Versionen:
1. 'drawRect' Nimmt einen Startpunkt (von links oben aus gesehen) und Breite & Höhe.
2. 'drawRectSym' Nimmt 4 Parameter (exkl. Farbe):
Left und Top sind als Startpunkt (von links oben),
Right und Bottom sind als Endpunkt (von rechts unten) gedacht.
Die 1. Version funktioniert tadellos, allerdings die 2 nicht.
Zuerst hatte ich keinen Rückgabewert festgelegt (void), bis dieser Fehler auftrat. Dann habe ich den Wert von 'FillRect()' getestet (eigentliche Zeichenfunktion),
aber da kam immer true, also Erfolgreich zurück.
Da ich den Fehler aber selber nicht finde, möchte ich euch bitten, euch den Code mal anzuschauen.
Vielleicht fällt euch ja etwas auf.
//Header
bool drawRect(int X_Start, int Y_Start, int Width, int Height, HBRUSH brush);
bool drawRectSym(int Left, int Top, int Right, int Bottom, HBRUSH brush);
bool drawRect(int X_Start, int Y_Start, int Width, int Height, HBRUSH brush) {
HDC screen = GetDC(0);
const RECT coordinates = {X_Start, Y_Start, X_Start+Width, Y_Start+Height};
if(FillRect(screen, &coordinates, brush) != 0) {
return true;
} else {
return false;
};
};
bool drawRectSym(int Left, int Top, int Right, int Bottom, HBRUSH brush) {
HDC screen = GetDC(0);
const RECT coordinates = {Left, Top, Right, Bottom};
if(FillRect(screen, &coordinates, brush) != 0) {
return true;
} else {
return false;
};
};
//Main.cpp
int main() {
HBRUSH Bred = CreateSolidBrush(RGB(255, 0, 0));
HBRUSH Bgreen = CreateSolidBrush(RGB(0, 255, 0));
HBRUSH Bblue = CreateSolidBrush(RGB(0, 0, 255));
bool returns[3] = {false, false, false};
while(true) {
printf("R: %s | G: %s | B: %s\n", returns ? "true" : "false", returns[1] ? "true" : "false", returns[2] ? "true" : "false");
returns = drawRectSym(100, 100, 100, 100, Bred);
returns[1] = drawRectSym(200, 200, 200, 200, Bgreen);
returns[2] = drawRectSym(400, 400, 400, 400, Bblue);
Sleep(1000);
};
pause(); //Eig. unnötig, weil Endlosschleife
return 0;
}
System & IDE:
Windows 10 vor dem Creators Update
Dev-C++ mit gcc Compiler und manuell hinzugefügte Bibliothek GDI32
Gruß,
tomaschku
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 365601
Url: https://administrator.de/contentid/365601
Ausgedruckt am: 21.11.2024 um 22:11 Uhr
6 Kommentare
Neuester Kommentar
Zitat von @tomaschku:
Heißt: drawRectSym(100, 100, 100, 100) würde ein Rechteck erstellen, das rundherum 100px von Bildschirmrand entfernt wäre.
Wie kommst du darauf?Heißt: drawRectSym(100, 100, 100, 100) würde ein Rechteck erstellen, das rundherum 100px von Bildschirmrand entfernt wäre.
https://msdn.microsoft.com/en-us/library/windows/desktop/dd162719(v=vs.8 ...
lprc [in]
A pointer to a RECT structure that contains the logical coordinates of the rectangle to be filled.
Heißt, das RECT deren Adresse du übergibst wird gefüllt.A pointer to a RECT structure that contains the logical coordinates of the rectangle to be filled.
In den Bemerkungen findet sich dann noch
FillRect does not include the rectangle's right and bottom sides. GDI fills a rectangle up to, but not including, the right column and bottom row, regardless of the current mapping mode.
Mein "wenn überhaupt" von oben kann ich also noch mit einem Ausrufezeichen versehen, denn in der Realität sollte also nicht mal ein Punkt gezeichnet werden.Ergo: Du übergibst ein RECT mit gleichen Werten für left und right, sowie gleichen Werten für top und bottom. Somit sagst du der Funktion, dass sie nichts füllen soll, was wunschgemäß gemacht wird und darum zur Erfolgsmeldung führt.
Steffen
Um zu erreichen was du vorhast, brauchst du die GetSystemMetrics Funktion
https://msdn.microsoft.com/en-us/library/windows/desktop/ms724385(v=vs.8 ...
die du mit Argument SM_CXSCREEN bzw. SM_CYSCREEN fütterst. So bekommst du Breite und Höhe des (Haupt-)Monitors. Was fehlt ist ein bisschen Mathe. Left und Top lässt du bei 100, Right ist Breite - 100 und Bottom ist Höhe -100. Um Fehler zu vermeiden müsstest du natürlich noch prüfen dass Right nicht kleiner als Left und Bottom nicht kleiner als Top wird.
Steffen
https://msdn.microsoft.com/en-us/library/windows/desktop/ms724385(v=vs.8 ...
die du mit Argument SM_CXSCREEN bzw. SM_CYSCREEN fütterst. So bekommst du Breite und Höhe des (Haupt-)Monitors. Was fehlt ist ein bisschen Mathe. Left und Top lässt du bei 100, Right ist Breite - 100 und Bottom ist Höhe -100. Um Fehler zu vermeiden müsstest du natürlich noch prüfen dass Right nicht kleiner als Left und Bottom nicht kleiner als Top wird.
Steffen