• 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
33 wizyt
pytanie zadane 15 czerwca w C i C++ przez MichaelM Użytkownik (830 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 przez Oscar Nałogowiec (25,590 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 przez adrian17 Ekspert (320,640 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 59 wizyt
pytanie zadane 15 czerwca w C i C++ przez MichaelM Użytkownik (830 p.)
0 głosów
4 odpowiedzi 285 wizyt
0 głosów
1 odpowiedź 150 wizyt
pytanie zadane 16 stycznia 2018 w C i C++ przez moldoveanu Nowicjusz (150 p.)

88,311 zapytań

136,904 odpowiedzi

305,517 komentarzy

58,593 pasjonatów

Motyw:

Akcja Pajacyk

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

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...