Ir ao conteúdo
  • Cadastre-se

C++ como usar a função SetPixel()


Posts recomendados

Eu uso um windows 7 e programo c++  no dev c++ e estou criando um jogo nele sem bibliotecas de terceiros(tentando pelo menos) e para fazer a barra de vida dos inimigos, precisava de caracteres menores ou até PIXELS. Então fiquei em uma busca enorme na web e achei a função SetPixel() da biblioteca windows.h só que sempre que pego um programa da web para testar como é e depois reproduzì-lo aparece o famoso "id returned 1 exit staus" e eu não faço ideia do que devo mudar nesses programas para arrumar ou se é minha máquina que não consegue fazer isso. Será que alguém poderia me dar uma ideia? 

  • Amei 1
Link para o comentário
Compartilhar em outros sites

dev c++ não é um ótimo IDE, se está utilizando de recursos de alguma biblioteca então você precisa ler a documentação e tentar entender como ela vai funcionar necessariamente, voce diz que nao está utilizando bibliotecas de terceiros mas se depara com muitos projetos na internet que usam recursos muitas vezes do lgdi opengl ou alguma coisa do windows, ou seila o que voce anda vendo. Copiar projetos da internet nem sempre é a melhor opção para quem está começando, quando o ide é antigo você não tem muitos botões para marcar algumas opções adicionais então muitas vezes tem que inserir manualmente.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Daniel Bittencourt

Que programa está testando? Está fazendo um programinha de desktop usando a WinAPI?

Se tem uma mensagem de erro parecida com "undefined reference to `__imp_(função)'", então talvez tenha apenas que linkar uma livraria, só não tenho como adivinhar qual sem ver o programa, mas de qualquer forma, tente linkar a libgdi32.a ou a gdi32.lib.

 

PS: recomendo dar uma olhada nesse link aqui. Tem uns exemplos de como desenhar pixels, linhas, etc.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

1 hora atrás, Daniel Bittencourt disse:

o famoso "id returned 1 exit staus"

 

🤔 não conheço o famoso id returned 1 exit status

 

chamou GetLastError() ao menos? FormatMessage()?
 

Com conseguiu o handle pra chamar setpixel? Está certo de que era válido?

 

1 hora atrás, Daniel Bittencourt disse:

precisava de caracteres menores ou até PIXELS

 

Dependendo da tela talvez possa improvisar algo com os blocos de desenho da codepage 437, ou mesmo números de 0 a 100

 

1 hora atrás, Daniel Bittencourt disse:

sem bibliotecas de terceiros(tentando pelo menos)

 

A API do windows é uma biblioteca também. Não usar uma biblioteca (de terceiros) pode ser só prejuízo. Não acho que tenha muita razão para não usar uma API dessas, tipo Qt, Opengl, DirectX, SDL ou GTK+ hoje em dia. É mais fácil e produtivo. E elas nem são muito diferentes. 

adicionado 1 minuto depois
1 hora atrás, Daniel Bittencourt disse:

função SetPixel() da biblioteca windows.h só que sempre que pego um programa da web para testar

 

Não pegue. escreva um pequeno programa e teste você mesmo. Essas coisas não dão erro.

 

SetPixel()

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Daniel Bittencourt    para usar esse comando

SetPixel(hdc,2º Parâmetro,3º Parâmetro,4º Parâmetro);

você precisa criar um projeto no dev c++  do tipo Windows Aplication, , e dentro da função WINAPI WinMain ou na LRESULT CALBACK ,  coloque esse comando , ou pode ser em um código simples mesmo do tipo console , mas aí precisa configura o compilador , adicionado no linker , em Tools / Compiler Options / e em add this comand , marque essa cx e coloque essa linha no quadro ao lado

-lgdi32 

 , e na primeira linha de seu programa coloque

#define _WIN32_WINNT 0x0600

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Aqui tem um exemplo de como usar SetPixel para desenhar linhas através do algoritmo de Bresenham. Talvez ajude.

 

#include <windows.h>
#include <cmath>
#define ROUND(a) ((int) (a + 0.5))

/* set window handle */

static HWND sHwnd;
static COLORREF redColor=RGB(255,0,0);
static COLORREF blueColor=RGB(0,0,255);
static COLORREF greenColor=RGB(0,255,0);

void SetWindowHandle(HWND hwnd)
{
	sHwnd=hwnd;
}

/* SetPixel */
void setPixel(int x,int y,COLORREF& color=redColor)
{
	if(sHwnd==NULL) {
		MessageBox(NULL,"sHwnd was not initialized !","Error",MB_OK|MB_ICONERROR);
		exit(0);
	}

	HDC hdc=GetDC(sHwnd);
	SetPixel(hdc,x,y,color);
	ReleaseDC(sHwnd,hdc);
	return;

// NEVERREACH //
}

void drawLineBresenham(int xa, int ya, int xb, int yb)
{
	int dx = abs(xa - xb), dy = abs(ya - yb);
	int p = 2 * dy - dx;
	int twoDy = 2 * dy, twoDyDx = 2 * (dy - dx);
	int x, y, xEnd;

	if (xa > xb) {
		x = xb;
		y = yb;
		xEnd = xa;
	} else {
		x = xa;
		y = ya;
		xEnd = xb;
	}

	setPixel(x, y);

	while(x < xEnd) {
		x++;
		if(p < 0)
			p += twoDy;
		else {
			y++;
			p += twoDyDx;
		}

		setPixel(x, y);
	}
}

/* Window Procedure WndProc */

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	switch(message) {
		case WM_PAINT:
			SetWindowHandle(hwnd);
			drawLineBresenham(10, 20, 250, 300);
			break;
		case WM_CLOSE: // FAIL THROUGH to call DefWindowProc
			break;
		case WM_DESTROY:
			PostQuitMessage(0);
			return 0;
		default:
			break; // FAIL to call DefWindowProc //
	}
	return DefWindowProc(hwnd,message,wParam,lParam);
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow)
{
	static TCHAR szAppName[] = TEXT("Straight Line");
	WNDCLASS wndclass;
	wndclass.style         = CS_HREDRAW|CS_VREDRAW ;
	wndclass.lpfnWndProc   = WndProc ;
	wndclass.cbClsExtra    = 0 ;
	wndclass.cbWndExtra    = 0 ;
	wndclass.hInstance     = hInstance ;
	wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
	wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
	wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
	wndclass.lpszMenuName  = NULL ;
	wndclass.lpszClassName = szAppName ;

	// Register the window //

	if(!RegisterClass(&wndclass)) {
		MessageBox(NULL,"Registering the class failled","Error",MB_OK|MB_ICONERROR);
		exit(0);
	}

	// CreateWindow //

	HWND hwnd=CreateWindow(szAppName,"Bresenham's Algorithm - Programming Techniques",
	                       WS_OVERLAPPEDWINDOW,
	                       CW_USEDEFAULT,
	                       CW_USEDEFAULT,
	                       CW_USEDEFAULT,
	                       CW_USEDEFAULT,
	                       NULL,
	                       NULL,
	                       hInstance,
	                       NULL);

	if(!hwnd) {
		MessageBox(NULL,"Window Creation Failed!","Error",MB_OK);
		exit(0);
	}

	// ShowWindow and UpdateWindow //
	ShowWindow(hwnd,iCmdShow);
	UpdateWindow(hwnd);

	// Message Loop //
	MSG msg;

	while(GetMessage(&msg,NULL,0,0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	/* return no error to the operating system */
	return 0;
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Daniel Bittencourt

 

Não acho mesmo que valha a pena programar nesse mecanismo. Não se usa isso há épocas e por uma razão simples: os modelos de programação mais novos são mais produtivos e mais simples. Inclusive os da Microsoft. De todo todo, se quer usar isso a fonte de documentação e exemplos é a mesma. A dos donos do campo, da bola e das camisas. A  Microsoft 

 

Veja a documentação a partir daqui: https://docs.microsoft.com/en-us/windows/win32/gdi/windows-gdi

 

Exemplos

 

Um número importante de exemplos está aqui: https://github.com/microsoft/Windows-classic-samples e acho que não tem nada parecido. 

 

Recomendo que instale Visual Studio em sua máquina. Se ficar lento apenas aumente sua paciência. Se não conseguir e puder gastar algum dinheiro e tempo, aumente então a memória de sua máquina, a versão de Windows e tente quem sabe um SSD.

 

Mas não é imprescindível.

 

O que tem nos tais exemplos?
 

Tem de tudo. São centenas de projetos completos que você pode rodar com esse roteiro complicado: clique na solução, o arquivo sln, e clique no triângulo verde... 

Veja um pedaço:

 

image.thumb.png.3bfecfbe8061c1abcf575d41591d0d8c.png

 

Tem uma parte só com exemplos de Windows7. Dentro dessa uma pasta com exemplos para iniciantes. Dentro dessas por exemplo uma pasta com exemplos de Win32... Veja lá. E você pode ler os programas todos e alguma documentação direto no GitHub. E pode baixar apenas o programa para rodar em seu ambiente Dev-C++, se fizer questão. Não é o melhor caminho, mas funciona. Para o VisualStudio é um passeio porque já está tudo arrumadinho, os includes, o ambiente, os projetos e tal. Você pode escolher o projeto na barra lateral --- Solution Explorer --- clicar no arquivo da solução, o .sln, e os arquivos todos já ficam disponíveis no IDE e pode rodar o exemplo...
 

image.png.8c4f4e008f7c3f45840f38628460aab8.png


 E rodar direto

image.png.3d5e4bf96f16f6c79d46a68075ff2185.png

 

Com ou sem o debugger. Com o debugger é legal porque pode parar o programa nas chamadas a API e ver o que tem nas estruturas por exemplo. E eventualmente alterar em tempo real.

 

exemploGDI.png.0831b24658987f7b3b0f8872ecccfa2d.png

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

30 minutos atrás, Daniel Bittencourt disse:

eu tenho o visual studio code mas mesno com a dotnet ainda não consegui fazer os programas serem executáveis

 

Assim vai dar mais trabalho. 

 

Faça o simples como eu disse. Se não vai usar outras linguagens ou compiladores ou Linux ou WSL ou Node ou algo assim, VS Code é mais problema que solução.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Daniel Bittencourt Da message box? O que quer dizer com isso?

A função MessageBox() está sendo usada nesse programa pra mostrar que algum erro ocorreu, tudo que tem nela são botões e texto.

A única linha que vejo foi desenhada na janela, e é basicamente isso que o programa faz... Basta deletar a função drawLineBresenham() que não vai ter mais linha.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Lucca Rodrigues @Benjamin Breeg eu quis dizer a janela de fundo branco q aparece

  

adicionado 0 minutos depois

essa olhe

image.thumb.png.53fa3875bf9a46fad8786d4f7c079c0e.png

adicionado 1 minuto depois
agora, Daniel Bittencourt disse:

@Lucca Rodrigues @Benjamin Breeg eu quis dizer a janela de fundo branco q aparece

  

adicionado 0 minutos depois

essa olhe

image.thumb.png.53fa3875bf9a46fad8786d4f7c079c0e.png

eu queria colocar a linha na janela de fundo preto

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Daniel Bittencourt

9 minutos atrás, Daniel Bittencourt disse:

eu queria colocar a linha na janela de fundo preto

Isso daí é o console, você pode até colorir texto e até o background, mas a respeito de manipular pixels, na minha opinião você não deveria estar trabalhando no console.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

1 minuto atrás, Daniel Bittencourt disse:

@Lucca Rodrigues então os pixeis que eu colocar vão aparecer na janela branca?

 

@Daniel Bittencourt

 

Trata-se de um exemplo de um programa de computador. A cor do fundo da janela é um parâmetro. Em geral a janela que aparece por definição em preto é uma janela de console, onde você escreve em texto, letras e símbolos. E essa "branca" é a janela de uma aplicação para desktop, tipo essa do forum.

 

Quando você escreve o programa, na verdade na hora do link --- dentro do IDE ou não --- você de alguma forma especifica o sistema do tipo de aplicação que está escrevendo... Eis as opções

/SUBSYSTEM:{BOOT_APPLICATION|CONSOLE|EFI_APPLICATION|
            EFI_BOOT_SERVICE_DRIVER|EFI_ROM|EFI_RUNTIME_DRIVER|NATIVE|
            POSIX|WINDOWS)
            [,major[.minor]]

Direto de https://docs.microsoft.com/pt-br/cpp/build/reference/subsystem-specify-subsystem?view=vs-2019 a documentação...

 

Ou você ou o IDE especificam isso na hora de gerar o EXE...

 

De resto é um programa, e faz o que você.... programar

adicionado 1 minuto depois

Se vem a janela pretinha provavelmente gerou um programa de console. Que mesmo assim pode gerar janelas.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

3 minutos atrás, Lucca Rodrigues disse:

@Daniel Bittencourt Nenhum caractere da tabela ASCII te agradou? tem um que é só uma linha na horizontal, não é isso que você quer?


#include <stdio.h>

int main()
{
    printf("%c%c%c%c%c", 196, 196, 196, 196, 196);

    return 0;
}

 

 

O que vai aparecer nesse caso vai depender de ser um program de console, da fonte em uso e da codepage de saída em uso. E se pode usar Unicode nessa codepage pode fazer grande diferença também. E se está rodando o programa na console ou no Terminal do Windows. Isso só funciona bem no Windows 10 nas versões a partir do fim de 2018,  a tal edição de aniversário eu acho. Antes de escrever na tela precisa confirmar essas coisas.

 

Esse pedaço abaixo tem uma fonte moderna para uso na console

 

image.png.6d8fcf1047c28458cca83a897cad61b2.png

 

bem no trecho onde tem algumas das linhas. 

 

Note que versões antigas de Windows não tem o aplicativo mapa de caracteres. mas pode digitar Alt e o código direto na tela como nos anos 90 e ver o código que sai na console.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@Lucca Rodrigues bom, o jogo é feito com essa tabela, e o inimigo era só um quadradinho, o 219, e no caso eu achei que nenhum símbolo dela ficaria proporcional

adicionado 1 minuto depois

mas agora já achei outro modo de mostrar a hp do inimigo, estou estudando esta função para tentarfazer sprites em c puro e até incrementá-la na minha biblioteca

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

1 minuto atrás, Daniel Bittencourt disse:

bom, o jogo é feito com essa tabela, e o inimigo era só um quadradinho, o 219, e no caso eu achei que nenhum símbolo dela ficaria proporcional

 

Imagino que não pretenda que todo mundo que for jogar o seu jogo vá usar o SEU computador e o seu IDE e compilar o programa fonte toda vez, então vai ter que se preocupar com o que eu expliquei ou não vai saber o que está aparecendo na tela dos caras...

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

sobre a tabela unicode, eu não conheço a forma de colocá-la no printf, se puder explicar, agradeço.

adicionado 2 minutos depois

sobre as pessoas jogarem meu jogo, eu estou passando o arquivo exe para alguns amigos, só para avaliarem, mas não sei como veria a tela dos outros ainda

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

12 minutos atrás, Daniel Bittencourt disse:

sobre as pessoas jogarem meu jogo, eu estou passando o arquivo exe para alguns amigos, só para avaliarem, mas não sei como veria a tela dos outros ainda

Foi o que eu te expliquei. Precisa controlar aquelas coisas no inicio do programa. a pagina de codigo da console, a fonte das letras e coisas assim

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...