Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: MouseMove + ikkunan liikuttelu ongelma

t-rex [10.11.2008 15:14:28]

#

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.

Metabolix [10.11.2008 16:13:34]

#

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).

t-rex [10.11.2008 19:16:20]

#

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 ??!!

Grez [10.11.2008 19:36:23]

#

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.

Metabolix [10.11.2008 19:54:27]

#

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(...) */
	}
}

t-rex [10.11.2008 22:01:24]

#

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.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta