[WinApi] Problem z odświeżaniem

0

Witam! W jaki sposób odświeżać zawartość ekranu, w ustawionym czasie np 25 razy na sekundę, albo jeszcze lepiej przy zmianie wyświetlanego obrazu na pulpicie? obecnie odświeżanie następuje jedynie gdy ruszam oknem;/...ideą programu jest w czasie rzeczywistym wyświetlanie wartości konkretnych pikseli, np podczas oglądania filmów.

0

Windows wysyła komunikat WM_PAINT do okna, kiedy zostanie poruszone, odsłonięte itp.
Możesz sam tego dokonać, ta funkcja nazywa się chyba ValidateRect. Poszukaj na msdn. Albo wyślij komunikat WM_PAINT przez SendMessage.

0

a w którym miejscu wstawić należy ValideteRect(hwnd,0) bo gdy daje pod WM_PAINT dostaje puste okienko...i czy taki myk będzie mi gwarantował działanie programu w tle?

0

Jak dasz w obsłudze komunikatu WM_PAINT to Twój program nie będzie robił nic innego jak odrysowywał się. :)
Wrzuć to po operacji odczytu piksela czy co Ty tam kombinujesz.

Nie wiem czy nieaktywne okno otrzymuje ten komunikat ;/.

A jak chcesz rozwiązać problem współdzielenia inputu myszki przez dwa programy na raz?
Wydaję mi się, że ten program nie będzie działał pisząc go tak po prostu. Musiałbyś podpinać jeszcze dll'ke pod każdy program, a w niej przechwytywać komunikaty myszki.

Może ktoś mądrzejszy ode mnie wypowie się na ten temat. :)

0

"Wyświetlanie wartości pixeli, np podczas oglądania filmu".
W jaki sposób to robisz? Bom Ciekaw.
Nie wiem czy dobrze rozumiem, ale jeżeli chcesz wyświetlać jakieś pixele "przed" wszystkim, to CHYBA tylko DirectDrawem czy ASM. Tylko że on nie wymaga takiego odświeżania o jakim tutaj mowa.

0

chodzi o to że pobieram pewną część pikseli i obliczam sredni kolor w tym rejonie:

int w=GetSystemMetrics(SM_CXSCREEN), h=GetSystemMetrics(SM_CYSCREEN);
 
  int bw=324;
  int bh=240;
  int bw4=(bw+3)&0xFFFFFFFC;
      BITMAPINFO bi;
	    bi.bmiHeader.biBitCount=24;
	    bi.bmiHeader.biClrImportant=0;
        bi.bmiHeader.biClrUsed=0;  
		bi.bmiHeader.biCompression=BI_RGB; 
		bi.bmiHeader.biHeight=bh;
        bi.bmiHeader.biPlanes=1;
		bi.bmiHeader.biSize=40;
		bi.bmiHeader.biSizeImage=bw4*bh*3;
        bi.bmiHeader.biWidth=bw4;
		bi.bmiHeader.biXPelsPerMeter=3780;
		bi.bmiHeader.biYPelsPerMeter=3780;
		BYTE *bits;
		HDC sdc=GetDC(0);
	
  hbm=CreateDIBSection(sdc,&bi,DIB_RGB_COLORS,(void**)&bits,NULL,0);
  HDC hdc=CreateCompatibleDC(sdc); 
  HGDIOBJ hold=SelectObject(hdc,hbm);
  StretchBlt(hdc,0,0,bw,bh,sdc,0,0,w,h,SRCCOPY);
  SelectObject(hdc,hold);
  DeleteDC(hdc);
  ReleaseDC(0,sdc);
   int r=0,y,pomocnicza=0;
  //sektor jeden( lewy dolny)
  for(y=0;y<60;y++){
	int temp=y*pomocnicza+162;
  for(;r<(temp);r+=3){

blue+=*(bits+r);		//niebiski
green+=*(bits+(r+1));		//zielen
red+=*(bits+(r+2));		//czerwien


	} r+=810;
   pomocnicza=972;
  }
*(tab+2)=red/3240;
*(tab+1)=green/3240;
*(tab)=blue/3240;
red=0;
green=0;
blue=0;

wrzuciłem do pętle while ale też coś lipa:

 while(GetMessage(&msgs,0,0,0))
  {
	  
	spectrum(kolory,1); //procedura podający kolory w sektorze
	
	b=*kolory;
	g=*(kolory+1);
	r=*(kolory+2);
	 if(tb!=b) InvalidateRect(hWnd,0,TRUE); //z ValidateRect nie było widac w ogóle odświeżania
	  tb=b;tg=g;tr=r;//
		
    TranslateMessage(&msgs);
    DispatchMessage(&msgs);

	SendMessage(hWnd,WM_QUIT,0,0);//dlaczego wysłanie WM_QUIT nie zakończa pętli while?
	
  }
0

zrobiłeś While z GetMessage, a program na wiadomość może czekać dłuuugo.
wpierw może sprawdzaj czy jest zdarzenie w kolejce. Inaczej pętla może Ci stawać

co do wychodzenia,
Próbowałeś z PostQuitMessage()?

0

Wychodzenie z pętli zrobione...ale odświeżanie nadal nie;/
Zrobiłem While z PeekMessage , odświeżał tyle że tak szybko że nic nie było widać:D
Potem próbowałem zrobic z GetMessage, ale w switchu pod WM_PAINT umieściłem PostMessage z wysyłaniem do kolejki zdarzenie WM_PAINT ale efekt taki sam jak z PeekMessage.

0

A nie idzie do ch... wafla po prostu napisać tam gdzie chcesz odświeżać to taką linijke:
SendMessage(hWnd, WM_PAINT, 0, 0);
Za hWnd wp...dol najpierw uchwyt głównego okna, potem uchwyt okna co chcesz odświeżać, jak dalej nie bedzie ni ch... działać to wtedy zamiast WM_PAINT napisz jakiś bylejaki komunikat związany z przesunięciem (sprawdź na msdnie). Chodzi o to by wywołać jakiegoś kapiszona, co sam odświeża. O mogłyby tez 2 linijki być, ze jedna minimalizuje okno, a zaraz potem druga linijka co z powrotem maksymalizuje. I samo się odświeży. Trza kombinować. pozdro

0

odświeżanie działa,ale jeśli mam:

hListBox=CreateWindow ("LISTBOX", NULL, WS_CHILDWINDOW | WS_VISIBLE | WS_BORDER | LBS_SORT, 10, 10, 200, 200, hwnd, (HMENU) 123, (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE), NULL) ;

	SendMessage (hListBox, LB_INSERTSTRING, (WPARAM) -1, (LPARAM) "coś tam"); 
	Rectangle(hdc,0,0,r,66);

to odświeża się tylko ten prostokąt(i jest widoczny cały czas) a lista widoczna jest jedynie przy poruszaniu oknem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1