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

Zmiana wartości piksela, SetPixel()

VPS Starter Arubacloud
0 głosów
173 wizyt
pytanie zadane 15 czerwca 2022 w C i C++ przez MichaelM Bywalec (2,440 p.)

Witam, próbuje zrobić, by program pomalował piksel. Niestety nie wiem co poszło nie tak, bo cały czas nie działa.

Oto mój 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;
		}
		
		case WM_PAINT: {
			HDC hdcDesktop = GetDC(hwnd);
			HDC hdc = CreateCompatibleDC(hdcDesktop);
			SetPixel(hdc, 20, 20, RGB(255,0,0));
			ReleaseDC(hwnd, hdc);
			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);
		
	UpdateWindow(hwnd);
	
	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;
}

Bardzo proszę o pomoc. 

2 odpowiedzi

+2 głosów
odpowiedź 15 czerwca 2022 przez Degustator254 Początkujący (480 p.)
wybrane 15 czerwca 2022 przez MichaelM
 
Najlepsza
Witam serdecznie, C++ średnio znam, więc nie jestem w stanie dać Ci gotowego kodu, ale to co chcesz zrobić, w sensie zmiana koloru piksela, czy rysowanie czegokolwiek na ekranie, kól, kwadratów, obrazków itd można osiągnąć w następujący sposób. Najpierw musisz stworzyć okno, które jest ponad innymi oknami (topmost), jest niewidoczne (transparenty?  o ile dobrze pamiętam eng nazwe...),  nie ma paska z tytułem, krzyżykiem itd, nie widać go na pasku zadań i ogólnie takie okno musi być rozciągnięte na całym ekranie np na ekranie full hd będzie to width 1920, height 1080. Musisz też być w stanie normalnie klikać na pulpicie czy w innych aplikacjach przez to okno, generalnie to taki overlay. Wydaje mi się, że dasz radę stworzyć takie okno korzystając z windows api. Następnie gdy już je będziesz miał, możesz rysować po tym oknie korzystając z np directxa. Opengl i inne technologie teoretycznie też powinny działac, chociaż, nie widziałem zbytnio projektów z czymś innym niż directx. Noi od tego momentu możesz rysować co tylko zechcesz tym np directxem po niewidocznym oknie overlayu. Tak działa rysowanie po ekranie w różnych external haxach, w aimbotach, wallhackach, skryptach do ligii legend etc. Z projektów C++ możesz znaleźć sobie np LView na githubie, tam masz przykład użycia overlaya. Mozesz też pobawić się imgui, tylko musisz tam zmienić okno na takie jak napisałem powyżej przezroczyste itd. Ja mógłbym dać Ci przykładowy kod jedynie w C#.
+1 głos
odpowiedź 15 czerwca 2022 przez overcq Pasjonat (21,540 p.)

Z opisu CreateCompatibleDC:

A memory DC exists only in memory. When the memory DC is created, its display surface is exactly one monochrome pixel wide and one monochrome pixel high. Before an application can use a memory DC for drawing operations, it must select a bitmap of the correct width and height into the DC. To select a bitmap into a DC, use the CreateCompatibleBitmap function, specifying the height, width, and color organization required. 

 

komentarz 15 czerwca 2022 przez MichaelM Bywalec (2,440 p.)

Dodałem 

	CreateCompatibleBitmap(hdc, 100,100);

Przed UpdateWindow(hwnd); nadal nie działa :(.

komentarz 15 czerwca 2022 przez overcq Pasjonat (21,540 p.)

Przy pomocy tej funkcji narysujesz piksel na bitmapie, a nie w oknie. Tylko wcześniej potrzeba też użyć funkcji SelectObject. Jeśli chcesz rysować w oknie to użyj BeginPaint/EndPaint.

komentarz 15 czerwca 2022 przez j23 Mędrzec (194,920 p.)

Rozwijając nieco poprzednią wypowiedź, robisz tak:

case WM_PAINT: {
    PAINTSTRUCT ps;
    
    HDC hdc = BeginPaint(hwnd, &ps);
    SetPixel(hdc, 20, 20, RGB(255,0,0));
    EndPaint(hwnd, &ps);            
    return 0;
}

 

komentarz 15 czerwca 2022 przez MichaelM Bywalec (2,440 p.)
DZIAŁA! Dziękuję bardzo za pomoc i cierpliwość.

Podobne pytania

0 głosów
0 odpowiedzi 108 wizyt
pytanie zadane 15 czerwca 2022 w C i C++ przez MichaelM Bywalec (2,440 p.)
0 głosów
1 odpowiedź 219 wizyt
pytanie zadane 16 stycznia 2018 w C i C++ przez moldoveanu Nowicjusz (150 p.)
0 głosów
1 odpowiedź 180 wizyt

92,454 zapytań

141,262 odpowiedzi

319,089 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!

...