• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zmiana koloru piksela za pomocą setPxiel().

0 głosów
256 wizyt
pytanie zadane 15 czerwca 2022 w C i C++ przez MichaelM Gaduła (3,000 p.)

Witam, napisałem kod w c++, który powinien zmienić wartość piksela o współrzędnych x=20px i y=20px na kolor czerwony z domyślnego białego. Program nie generuje żadnych błędów ale mimo to piksel nie zmienia koloru.

To fragment kodu, który odpowiada za zmianę koloru: 

HDC hdcDesktop = GetDC(hwnd);
HDC hdc = CreateCompatibleDC(hdcDesktop);
SetPixel(hdc, 20, 20, RGB(255,0,0));
ReleaseDC(hwnd, hdc);

A to cały kod:

#include <windows.h>
#include <shellapi.h>
/* This is where all the input to the window goes to */
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
	switch(Message) {
		
		/* Upon destruction, tell the main thread to stop */
		case WM_DESTROY: {
			PostQuitMessage(0);
			break;
		}
		
		/* All other messages (a lot of them) are processed using default procedures */
		default:
			return DefWindowProc(hwnd, Message, wParam, lParam);
	}
	return 0;
}

/* The 'main' function of Win32 GUI programs: this is where execution starts */
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
	WNDCLASSEX wc; /* A properties struct of our window */
	HWND hwnd; /* A 'HANDLE', hence the H, or a pointer to our window */
	MSG msg; /* A temporary location for all messages */

	/* zero out the struct and set the stuff we want to modify */
	memset(&wc,0,sizeof(wc));
	wc.cbSize		 = sizeof(WNDCLASSEX);
	wc.lpfnWndProc	 = WndProc; /* This is where we will send messages to */
	wc.hInstance	 = hInstance;
	wc.hCursor		 = LoadCursor(NULL, IDC_ARROW);
	
	/* White, COLOR_WINDOW is just a #define for a system color, try Ctrl+Clicking it */
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
	wc.lpszClassName = "WindowClass";
	wc.hIcon		 = LoadIcon(NULL, IDI_APPLICATION); /* Load a standard icon */
	wc.hIconSm		 = LoadIcon(NULL, IDI_APPLICATION); /* use the name "A" to use the project icon */

	if(!RegisterClassEx(&wc)) {
		MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
		return 0;
	}

	hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Caption",WS_VISIBLE|WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, /* x */
		CW_USEDEFAULT, /* y */
		640, /* width */
		480, /* height */
		NULL,NULL,hInstance,NULL);

	HDC hdcDesktop = GetDC(hwnd);
	HDC hdc = CreateCompatibleDC(hdcDesktop);
	SetPixel(hdc, 20, 20, RGB(255,0,0));
	ReleaseDC(hwnd, hdc);

	if(hwnd == NULL) {
		MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
		return 0;
	}

	/*
		This is the heart of our program where all input is processed and 
		sent to WndProc. Note that GetMessage blocks code flow until it receives something, so
		this loop will not produce unreasonably high CPU usage
	*/
	while(GetMessage(&msg, NULL, 0, 0) > 0) { /* If no error is received... */
		TranslateMessage(&msg); /* Translate key codes to chars if present */
		DispatchMessage(&msg); /* Send it to WndProc */
	}
	return msg.wParam;
}

Całość jest w winAPI. Mogą być również alternatywy dla funkcji setPixel().

Z góry dziękuję za odpowiedź.

2
komentarz 15 czerwca 2022 przez Oscar Nałogowiec (29,420 p.)
Nie znam WinAPI, ale tak zasadniczo w środowiskach okienkowych wszelkie rysowanie wykonuje się na życzenie systemu - jak otrzymasz WM_PAINT w funkcji WndProc. Wydaje mi się też, że rysujesz po obiekcie nie znajdącym się na ekranie, tylko kopii roboczej okienka. Takie kopie przydają się gdy bezpośrednie rysowanie jest skomplikowane, wtedy można mieć "gotowy rysunek" kopiowany do okienka w odpowiedzi na WM_PAINT.
1
komentarz 15 czerwca 2022 przez adrian17 Mentor (355,240 p.)
Popieram że ten kod powinien być przeniesiony do WM_PAINT, domyślam się że wtedy zadziała out of the box.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
2 odpowiedzi 727 wizyt
pytanie zadane 15 czerwca 2022 w C i C++ przez MichaelM Gaduła (3,000 p.)
0 głosów
1 odpowiedź 431 wizyt
0 głosów
4 odpowiedzi 1,780 wizyt

93,776 zapytań

142,732 odpowiedzi

323,384 komentarzy

63,379 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...