Forum Sveta kompjutera

Nazad   Forum Sveta kompjutera > Test Run > Programiranje

Programiranje Programski jezici, tehnike, alatke...

Odgovor
 
Alatke vezane za temu Vrste prikaza
Stara 11.11.2010, 21:39   #1
clzola
Član
 
Član od: 14.4.2010.
Lokacija: Podgorica
Poruke: 332
Zahvalnice: 61
Zahvaljeno 11 puta na 11 poruka
Određen forumom Win32, Nacrtati sliku na klik

Poceo sam da ucim da radim win32 (Allegro je bzv xD i ako sam pokusavao da sklepam nesto u njemu) i skinuo sam Visual C++ pa preko njega poceo. Do sada sam uspio samo da napravim novu opciju u File meniju, Kada kliknem da mi ispise koordinate klika, da prozor iscrta neku sliku u pozadini..

Takodje sada zelim da pokusam da napravim da kad kliknem on nacrta novu sliku tamo gde sam kliknuo.

Napravio sam funkciju LoadBitmap, koju koristim za crtanje slike na ekranu, ali ona radi samo kad je stavim pod:
Kod:
case WM_PAINT:
	hdc = BeginPaint(hWnd, &ps);
	 LoadBitmap(__T("grafika/status.bmp"), hdc, 0, 0);
	 LoadBitmap(__T("grafika/tabla.bmp"), hdc, 252, 0);  
	EndPaint(hWnd, &ps);
	break;
Takodje imam i opciju za lijevi klik misa:
Kod:
case WM_LBUTTONDOWN:
	{
		int iPosX = LOWORD(lParam);
		int iPosY = HIWORD(lParam);

		if (iPosX > 265 && iPosX < 610 && iPosY > 13 && iPosY < 357)
		{
			wchar_t waCoord[20];
			wsprintf(waCoord, _T("%i, %i"), iPosX, iPosY);
			::MessageBox(hWnd, waCoord, _T("LMB Click"), MB_OK);
			hdc = BeginPaint(hWnd, &ps);
			  LoadBitmap(__T("grafika/P.bmp"), hdc, iPosX, iPosY);
			EndPaint(hWnd, &ps);
			}
		break;
	}
Medjutim kada kliknem, on pokaze MessageBox, ali ne nacrta sliku... :/
Razmisljao sam nesto, da li nekako (i kako?) moze da se napravi funkcija, koja ce da crta na sliku, ne na hdc (koliko sam hvatio ovo je prozor, tj client dio - kao neko imaginarno platno )
Kao sto u allegro postoji draw_sprite(buffer, slika.bmp, X, Y)... Ili postoji neki drugi nacin...
clzola je offline   Odgovor sa citatom ove poruke
Stara 12.11.2010, 0:32   #2
boshkodj
Veteran
 
Član od: 4.7.2008.
Lokacija: Somewhere along the line
Poruke: 505
Zahvalnice: 85
Zahvaljeno 34 puta na 29 poruka
Određen forumom Re: Win32, Nacrtati sliku na klik

Ako tako nastavis, odustaces
boshkodj je offline   Odgovor sa citatom ove poruke
Stara 12.11.2010, 1:08   #3
Belphegor
V.I.P. Programiranje
 
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
Određen forumom Re: Win32, Nacrtati sliku na klik

Pa zar ne moze ovako recimo:
Kod:
bool bLButtonPressed = false;//global var
...
case WM_LBUTTONDOWN:
{
    ...
    bLButtonPressed = true;
}break;
...
case WM_LBUTTONUP:
{
    ...
    bLButtonPressed = false;
}break;
...
case WM_PAINT:
{
    hdc = BeginPaint(hWnd, &ps);
    ...
    if(bLButtonPressed)
    {
         LoadBitmap(__T("grafika/P.bmp"), hdc, iPosX, iPosY);
    }
    EndPaint(hWnd, &ps);
}break;
Nikad nisam "crtao" pomocu win32 api-ja tako da mozda i gresim!

EDIT: Ne znam kako funkcionise LoadBitmap i kolko je efikasno zvati tu funkciju na WM_PAINT message
ali po nekoj prostoj logici resurse bi trebalo ucitati samo jednom prilikom inicijalizacije aplikacije
pa onda pozivati taj resurs na iscrtavanje (ne znam koje funkcije treba pozivati posto kao sto sam rekao nisam to jos probao).

Poslednja ispravka: Belphegor (12.11.2010 u 1:15)
Belphegor je offline   Odgovor sa citatom ove poruke
Stara 12.11.2010, 15:47   #4
clzola
Član
 
Član od: 14.4.2010.
Lokacija: Podgorica
Poruke: 332
Zahvalnice: 61
Zahvaljeno 11 puta na 11 poruka
Određen forumom Re: Win32, Nacrtati sliku na klik

@boshkodj
nije da cu odustati, jeste da sam cas na allegro, cas C, cas C++, gledam da zavrsim ovaj projekat, posto mi je veoma vazan, sad nije bitno kako cu ga napisati, bitno je da radi svoj posao

@Belphegor
Pokusao sam, prijavljuje mi 3 upozorenje, uninitilize X, Y i bLButtonPressed
stavio sam X = iPosX i Y = iPosY i njih sam deklarisao kao int, van zagrada da bi mogle da koriste u citavom prozoru, a definisanje je bilo odmah posle definisanja i deklarisanja iPoX i iPosY... a bLButtonPressed sam stavio ovako bool bLButtonPresed; ...
clzola je offline   Odgovor sa citatom ove poruke
Stara 12.11.2010, 19:40   #5
Stevvan
Veteran
 
Član od: 17.12.2005.
Lokacija: Zarkovo, Beograd
Poruke: 1.114
Zahvalnice: 97
Zahvaljeno 179 puta na 104 poruka
Slanje poruke preko MSN-a korisniku Stevvan Slanje poruke preko Skypea korisniku Stevvan
Određen forumom Re: Win32, Nacrtati sliku na klik

A da probaš sa SDL-om, ili GTK-om? Koliko znam allegro je prilično zastareo, a win api se odnosi samo na windows. Za ova 2 navedena ćes sigurno naći dosta podrške na netu
Stevvan je offline   Odgovor sa citatom ove poruke
Stara 12.11.2010, 23:38   #6
Belphegor
V.I.P. Programiranje
 
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
Određen forumom Re: Win32, Nacrtati sliku na klik

Citat:
Pokusao sam, prijavljuje mi 3 upozorenje, uninitilize X, Y i bLButtonPressed...
Kod koji sam postavio je bio samo kao primer! Nisam mogao da predpostavim da ces samo da ga prekopiras i da ocekujes da ce da radi tek tako!
Pretpostavljam da imas bar osnovno znanje u C/C++-su?

Probaj nesto ovako sad:
"main.cpp"
Kod:
// "true" ako je levi klik aktivan/pritisnut
bool bLButtonPressed = false;
// "drze" poziciju kursora
int iPosX = 0;
int iPosY = 0;
...
LRESULT CALLBACK WindowProc(bla bla bla...)
{
    ...
    case WM_LBUTTONDOWN:
    {
        bLButtonPressed = true;
    }break;
    case WM_LBUTTONUP:
    {
        bLButtonPressed = false;
    }break;
    case WM_PAINT:
    {
        hdc = BeginPaint(hWnd, &ps);

        iPosX = LOWORD(lParam);
        iPosY = HIWORD(lParam);

        if(bLButtonPressed && iPosX > 265 && iPosX < 610 && iPosY > 13 && iPosY < 357)
        {
             const int bufferSize = 20;
             wchar_t buffer[bufferSize];
             swprintf_s(buffer, bufferSize, _T("%i, %i"), iPosX, iPosY);
             SetWindowText(hWnd, buffer);
             LoadBitmap(__T("grafika/P.bmp"), hdc, iPosX,   iPosY);
        }
        EndPaint(hWnd, &ps);
    }break; 
}
To bi trebalo da radi ako su LoadBitmap() i ekstraktovanje pozicije kursora iz lParam-a korektni metodi za koriscenje (posto to nisam probao).
Znaci, dokle god drzis levi klik pritisnutim i pozicija kursora je u granicama (u kojima si ti odredio) trebalo bi da prikazujesliku "P.bmp" na zadatim koordinatama prozora.

Iz MSDN-a:
Citat:
An application should not call BeginPaint except in response to a WM_PAINT message...
U prevodu pozivaj Begin/EndPaint samo na/u WM_PAINT message!

PS. Ne odustaj sta god ti drugi pricali!!!
Belphegor je offline   Odgovor sa citatom ove poruke
Stara 13.11.2010, 1:12   #7
clzola
Član
 
Član od: 14.4.2010.
Lokacija: Podgorica
Poruke: 332
Zahvalnice: 61
Zahvaljeno 11 puta na 11 poruka
Određen forumom Re: Win32, Nacrtati sliku na klik

Evo sad probah ovo tvoje..

Ovo sam stavio u pretprocesorski dio (dje su header-i i ta cuda)
Kod:
// "true" ako je levi klik aktivan/pritisnut
bool bLButtonPressed = false;
// "drze" poziciju kursora
int iPosX = 0;
int iPosY = 0;
A evo kako izgleda LRESULT CALLBACK WindowProc(bla bla bla...)
Kod:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;

	switch (message)
	{
	case WM_LBUTTONDOWN:
    {
        bLButtonPressed = true;
    }break;
    case WM_LBUTTONUP:
    {
        bLButtonPressed = false;
    }break;
	case WM_COMMAND:
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);
		// Parse the menu selections:
		switch (wmId)
		{
		case IDM_ABOUT:
			DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
			break;
		case IDM_EXIT:
			DestroyWindow(hWnd);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;
	case WM_PAINT:
    {
        hdc = BeginPaint(hWnd, &ps);

        iPosX = LOWORD(lParam);
        iPosY = HIWORD(lParam);

        if(bLButtonPressed && iPosX > 265 && iPosX < 610 && iPosY > 13 && iPosY < 357)
        {
             const int bufferSize = 20;
             wchar_t buffer[bufferSize];
             swprintf_s(buffer, bufferSize, _T("%i, %i"), iPosX, iPosY);
             SetWindowText(hWnd, buffer);
             LoadBitmap(__T("grafika/P.bmp"), hdc, iPosX,   iPosY);
        }
        EndPaint(hWnd, &ps);
    }break; 
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}
I opet nece ... :/ gde sad grijesim,
clzola je offline   Odgovor sa citatom ove poruke
Stara 13.11.2010, 16:17   #8
Belphegor
V.I.P. Programiranje
 
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
Određen forumom Re: Win32, Nacrtati sliku na klik

Da ne bih nagadjao napamet i dok ti mozda neko drugi ne nadje odgovor probaj ove tutoriale!
Belphegor je offline   Odgovor sa citatom ove poruke
Stara 13.11.2010, 16:23   #9
Belphegor
V.I.P. Programiranje
 
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
Određen forumom Re: Win32, Nacrtati sliku na klik

Evo jos jedan vezano za bitmap-e!
Belphegor je offline   Odgovor sa citatom ove poruke
Odgovor

Bookmarks sajtovi

Alatke vezane za temu
Vrste prikaza

Vaš status
Ne možete postavljati teme
Ne možete odgovarati na poruke
Ne možete slati priloge uz poruke
Ne možete prepravljati svoje poruke

BB kod: uključeno
Smajliji: uključeno
[IMG] kod: uključeno
HTML kod: isključeno


Slične teme
tema temu započeo forum Odgovora Poslednja poruka
[Monitor] BenQ G2420HD Aibo Opisi, recenzije i testovi 31 6.4.2011 15:04
Podešavanje - Windows Server 2003 majtimika Komunikacioni uređaji i umrežavanje 6 20.9.2009 20:19
Counter Strike na Hamachiju nameZola Mrežne igre 0 18.6.2009 14:01
Ne vide se dva računara! milicgoran Komunikacioni uređaji i umrežavanje 23 15.6.2009 22:32
Kako istovremeno da imam sliku na tv i monitoru alien Video/TV softver 4 5.3.2006 0:00


Sva vremena su po Griniču +2 h. Sada je 19:48.


Powered by vBulletin® verzija 3.8.7
Copyright ©2000–2024, vBulletin Solutions, Inc.
Hosted by Beograd.com