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

VPS Starter Arubacloud
0 głosów
108 wizyt
pytanie zadane 15 czerwca 2022 w C i C++ przez MichaelM Bywalec (2,440 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,290 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 Ekspert (344,100 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 173 wizyt
pytanie zadane 15 czerwca 2022 w C i C++ przez MichaelM Bywalec (2,440 p.)
0 głosów
1 odpowiedź 180 wizyt
0 głosów
4 odpowiedzi 383 wizyt

92,453 zapytań

141,262 odpowiedzi

319,086 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...