Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

15.07.2008, 13:22

[Erledigt] Zeichenvorgang optimieren

Also, ich hab nen paar Controls schreiben müssen, für nen Projekt. Soweit kein Problem. GDI+ wäre in dem Fall overhead, von d.h. beschränken wir uns auf GDI, d.h. WinAPI.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
            void Slider::set_value(std::size_t value)
            {
                if (value < m_range.first) value = m_range.first;
                else if (value > m_range.second) value = m_range.second;
                else if (m_value == value) return;
            
                ::RECT rect;
                ::GetClientRect(m_hWnd, &rect);
                
                // value multiplier

                const double multiplier(static_cast<double>(rect.right - rect.left - 10) / (m_range.second - m_range.first));

                // old cursor pos

                const long old_x(rect.left + static_cast<long>(multiplier * (m_value - m_range.first)));
                
                // old cursor rect

                const ::RECT old_rect = { old_x - 5, rect.top, old_x + 5, rect.bottom };
        
                const std::size_t old_value(m_value);
                m_value = value;
                
                // new cursor pos

                const long new_x(rect.left + 5 + static_cast<long>(multiplier * (m_value - m_range.first)));
                rect.left   = new_x - 5;
                rect.right  = new_x + 5;

                // redraw old and new rect

                ::InvalidateRect(m_hWnd, &old_rect, TRUE);
                ::InvalidateRect(m_hWnd, &rect, TRUE);

                ::SendMessageW(m_pParentWnd->get_safe_hwnd(), SMN_POSCHANGE, MAKEWPARAM(old_value, m_value), reinterpret_cast<LPARAM>(m_hWnd));
            }
ist die Funktion, wenn der Wert des Sliders eines Slide-Controls geändert wird. Ich erklär halt den alten und den neuen Bereich für ungültig und lass ihn neu zeichnen.

Mir ist gerade beim Tippen aufgefallen, dass das Problem wahrscheinlich ist, dass die GDI-Funktionen wahrscheinlich das RECT anders interpretieren als ich, d.h. die 1px zu wenig rechts und unten zeichnen. Könnte das sein?
Auf jedenfall hab ich im Moment ne Verlaufsspur, und das ist unschön ;)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

15.07.2008, 13:27

Zitat von »"msdn"«


By convention, the right and bottom edges of the rectangle are normally considered exclusive. In other words, the pixel whose coordinates are (right, bottom) lies immediately outside of the the rectangle. For example, when RECT is passed to the FillRect function, the rectangle is filled up to, but not including, the right column and bottom row of pixels. This structure is identical to the RECTL structure.
@D13_Dreinig

3

15.07.2008, 13:44

Hm jop hatte es jetzt auch geändert, doch nicht die erhoffte Verbesserung bekommen :/
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

4

15.07.2008, 13:50

Also, es tritt nur auf, wenn ich den Cursor nach rechts bewege, d.h. kam mir auch der Gedanke, dass es daran liegen könnte. Doch ist nicht immer nur 1px vom alten Cursor noch sichtbar, sondern auch schonmal noch die hälfte oder so. set_value wird aber bei jeder Mausbewegung innerhalb des Control-HWND aufgerufen und von d.h. sollte es doch eigtl. klappen.
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

5

16.07.2008, 22:18

Keiner mehr ne Idee? Wüsste nicht, was ich noch groß verbessern soll an dem Code (okay könnte den Slider nur einmal Zeichnen und dann einfach reinblitten, wenn gezeichnet werden soll) ... aber jedesmal das komplette Control für ungültig erklären, würde bedeuten, dass es flackert, DAS darf aber nicht!
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

6

16.07.2008, 22:23

Wenn ich das richtig verstehe, dann gibts, wenn du nach Rechts fährst eine nachziehenede Spur? (Kannst mal einen Screenshot machen?)

Hmm.
Ansonsten fällt mir so auf die schnell nur ein, dass ev. die Koordinaten, oder sonst wo nicht genau sind.

7

16.07.2008, 22:44

sry nach links war wohl richtig :/ falsch umeditiert :D

Screenshot von Beispielanwendung

(Link)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

8

16.07.2008, 22:53

Hmm. Das ist wirklich sehr komisch. :)

Sieht aus, als ob da einfach ein gewisser Bereich nicht mehr gerendert wird. (Also das darunterliegende).

Wie siehts aus, wenn du sonstige Sachen rumschiebst?
Also ein "Bild", oder so? Mal ganz ohne "Controllfähigkeiten", ausser rumschieben.
Wie schiebst du? - Per Maus, oder auch per Code direkt?
Was passiert, wenn du den Slider per sin, oder so einfach hin und hersausen lässt? Immer noch diese Streifen?

9

16.07.2008, 23:01

Vielleicht liegt es an InvalidateRect. Könnest ja stattdessen denn Slider an der alten/vorherigen Position noch mal in der Hintergrundfarbe zeichnen.

10

16.07.2008, 23:20

Nja dadurch das ich den Bereich für ungültig erkläre, müsste er neu gezeichnet werden und dadurch das ich vorher den neuen Wert setze, sollte jetzt da nur noch der Strich und nicht mehr der Slider gezeichnet werden. Wenn ich nach Rechts (normales Tempo) schiebe, wird ja korrekt neu gezeichnet.

Und ja es wird auf die Interaktion des Benutzers reagiert :P
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Werbeanzeige