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

Zmiana wartości piksela, SetPixel()

0 głosów
72 wizyt
pytanie zadane 15 czerwca w C i C++ przez MichaelM Użytkownik (910 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 przez Degustator254 Początkujący (480 p.)
wybrane 15 czerwca 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 przez overcq Pasjonat (17,750 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 przez MichaelM Użytkownik (910 p.)

Dodałem 

	CreateCompatibleBitmap(hdc, 100,100);

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

komentarz 15 czerwca przez overcq Pasjonat (17,750 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 przez j23 Mędrzec (177,460 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 przez MichaelM Użytkownik (910 p.)
DZIAŁA! Dziękuję bardzo za pomoc i cierpliwość.

Podobne pytania

0 głosów
0 odpowiedzi 48 wizyt
pytanie zadane 15 czerwca w C i C++ przez MichaelM Użytkownik (910 p.)
0 głosów
1 odpowiedź 152 wizyt
pytanie zadane 16 stycznia 2018 w C i C++ przez moldoveanu Nowicjusz (150 p.)
0 głosów
1 odpowiedź 33 wizyt

88,701 zapytań

137,308 odpowiedzi

306,748 komentarzy

58,894 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.

...