Tarkoitus on liikuttaa luomaani ikkunaa hiirellä kun pidän vasenta nappia alhaalla. MouseLButtonDown
-aliohjelmassa asetan SetCapture(HWND ikkunan_kahva)
mutta MouseMove
-aliohjelmassa saan tulee kahdenlaisia x- ja y- koordinaatteja peräjälkeen ja ikkuna hyppii ikävästi paikasta toiseen. MouseLButtonUp
vapautan taas hiiren ReleaseCapture
:lla. Missä vika. Tein vastaavan ohjelman VC++:llä käyttäen MFC:tä ja homma toimii. Haluaisin kuitenkin irtautua MFC:stä ja ymmärtää Windows-ohjelmointia "vaikeamman" kautta. Ikkunan kahvat on oikeita, sillä tulostan siihen samalla hiiren koordinaatit TextOut
:lla.
MouseMove antaa hiiren uudet koordinaatit (xl, yl) ikkunan sisällä. Tallenna siis koordinaatit, joissa nappi meni alas (xa, ya) ja siirrä ikkunaa hiiren liikkuessa aina (xl-xa, yl-ya) pikseliä sen kulloisistakin koordinaateista (xi, yi) laskettuna eli kohtaan (xi+xl-xa, yi+yl-ya). Tämän siirron jälkeen hiiri on tietenkin ikkunan sisällä taas kohdassa (xa, ya).
Tallennan kyllä kaikki koordinaatit. Ongelma tuntuu esiintyvän ikkunaa siirrettäessä. Sama ei esinny, kun venytän ikkunaa oikeasta laidasta (testasin muodon vuoksi). Tuntuu, että joka toisella kerralla MouseMove antaa eri koordinaatit, ikkuna siis vispaa kahdessa eri paikassa. SetWindowPos jotenkin sotkee, tai sitten en vain hoksaa mistä on kyse ??!!
Mielestäni Metabolix selitti sen tuossa ihan hyvin.
Eli kun ikkuna siirtyy vaikka 5 pikseliä ylös niin hiiren pysyessä paikallaan se siirtyy 5 pikseliä alas.
Eli käytännössä sinun tarvitsee vain pitää hiiri paikallaan ikkunasta katsoen.
Kyse on luultavasti juuri tuosta, mitä sanoin. Teet vain yhä jotain neuvojen vastaista. Seuraava koodi demonstroi käytännön toteutusta ja todistettavasti toimii oikeassa ohjelmassakin.
int wnd_x, wnd_y; /* Ikkunan sijainti */ int move_x, move_y; /* Siirron alun klikkauskoordinaatit */ int move_act = 0; /* Onko siirto käynnissä? */ void move_start(int x, int y) { /* Tallennetaan alkukohta ja haetaan ikkunan sijainti alussa */ move_x = x; move_y = y; move_act = 1; get_window_pos(&wnd_x, &wnd_y); /* GetWindowRect(...) jne. */ } void move_end() { /* Merkitään siirto loppuneeksi */ move_act = 0; } void move_move(int x, int y) { if (move_act) { /* Muutetaan koordinaatteja hiiren liikkeen mukaan */ wnd_x += x - move_x; wnd_y += y - move_y; set_window_pos(wnd_x, wnd_y); /* SetWindowPos(...) */ } }
Löysinkin vastauksen myös vanhasta koodistani. Sitä ei aina muista mitä on joskus väsyneillä pikkutunneilla vuonna miekka ja kivi tehnyt.
Kiitos kuitenkin taas neuvoista.
Aihe on jo aika vanha, joten et voi enää vastata siihen.