Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Wanderson Regis Silva

Botão bitmap

Recommended Posts

Bem, queria mecher com imagens no programa que estou fazendo, não editar ou gravar, apenas usá-las. Já consegui colocar uma imagem no fundo da tela com esse código:

LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
	switch(msg) {
	//...
	case WM_PAINT: {
		HBITMAP bknd;
		BITMAP bm;
		PAINTSTRUCT ps;

		bknd = LoadBitmap(hInstance, MAKEINTRESOURCE(IDI_BKGND));

		HDC hdc = BeginPaint(hwnd, &ps);

		HDC hdcMem = CreateCompatibleDC(hdc);
		HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, bknd);

		GetObject(bknd, sizeof(bm), &bm);

		BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);

		SelectObject(hdcMem, hbmOld);
		DeleteDC(hdcMem);

		EndPaint(hwnd, &ps);
			}
		break;
	//...

	return 0;
}
mas queria outras coisas tipo imagem em botão, e de preferência que tivesse um efeito press (hover nem preciso tanto), seria legal se desse pra ter transparência, ai eu poderia (pelo menor fingir) fazer botões em formatos diferentes. O que eu achei a respeito dizia pra fazer assim:

HWND hInstBtmImg = CreateWindow(TEXT("button"), TEXT(""),
		WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON | BS_BITMAP,
		300, 200, 96, 21, hwnd, (HMENU) IDB_IMAGEM, hInst /*NULL*/, NULL);

	HBITMAP hBmp = LoadBitmap(hInst, MAKEINTRESOURCE(IDI_IMAGEM));
	SendMessage(hInstBtmImg, BM_SETIMAGE, IDI_IMAGEM, (LPARAM)hBmp);
Mas não funciona, e o botão fica em branco (um botão vazio e cinza).

 

Se eu tento carregar uma imagem em formato diferente de .bmp (tentei com .jpg) dá erro ainda na compilação, por isso eu nem tentei com GIFs e PNGs.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem, queria mecher com imagens no programa que estou fazendo, não editar ou gravar, apenas usá-las. Já consegui colocar uma imagem no fundo da tela com esse código:

LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
	switch(msg) {
	//...
	case WM_PAINT: {
		HBITMAP bknd;
		BITMAP bm;
		PAINTSTRUCT ps;

		bknd = LoadBitmap(hInstance, MAKEINTRESOURCE(IDI_BKGND));

		HDC hdc = BeginPaint(hwnd, &ps);

		HDC hdcMem = CreateCompatibleDC(hdc);
		HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, bknd);

		GetObject(bknd, sizeof(bm), &bm);

		BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);

		SelectObject(hdcMem, hbmOld);
		DeleteDC(hdcMem);

		EndPaint(hwnd, &ps);
			}
		break;
	//...

	return 0;
}
mas queria outras coisas tipo imagem em botão, e de preferência que tivesse um efeito press (hover nem preciso tanto), seria legal se desse pra ter transparência, ai eu poderia (pelo menor fingir) fazer botões em formatos diferentes. O que eu achei a respeito dizia pra fazer assim:

HWND hInstBtmImg = CreateWindow(TEXT("button"), TEXT(""),
		WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON | BS_BITMAP,
		300, 200, 96, 21, hwnd, (HMENU) IDB_IMAGEM, hInst /*NULL*/, NULL);

	HBITMAP hBmp = LoadBitmap(hInst, MAKEINTRESOURCE(IDI_IMAGEM));
	SendMessage(hInstBtmImg, BM_SETIMAGE, IDI_IMAGEM, (LPARAM)hBmp);
Mas não funciona, e o botão fica em branco (um botão vazio e cinza).

 

Se eu tento carregar uma imagem em formato diferente de .bmp (tentei com .jpg) dá erro ainda na compilação, por isso eu nem tentei com GIFs e PNGs.

 

A imagem é um Icone... e não um BMP?

Compartilhar este post


Link para o post
Compartilhar em outros sites

HWND hInstBtmImg = CreateWindow(TEXT("button"), TEXT(""),WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON | BS_BITMAP,300, 200, 96, 21, hWnd, NULL, hInst /*NULL*/, NULL);

HBITMAP hBmp = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BMP_BTN));
SendMessage(hInstBtmImg, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBmp);

Funcionou pra mim assim!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ow, num é que funcionou! Coloquei IMAGE_BITMAP no lugar de IDI_IMAGEM e deu certo.

 

Dai, eu queria fazer melhor, o botão com a imagem, fica com aquele efeito de sombra na direita e abaixo e claro acima e na esquerda, tem como tirar isso?

 

E tem como carregar uma imagem que não seja no formato .BMP? A idéia é carregar uma imagem com menor peso (em bytes) e possibilitar a transparência (pra mostrar o fundo).

 

E teria também como adicionar um efeito de press personalizado? Tipo, outra imagem?

 

De qualquer forma, você já ajudou, valeu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Porque voce não usa o .NET framework 2.0 ? ele facilita a vida da pra fazer tudo que voce quer e com um código extremamente menor do que o que você usa na win32 api

 

Pro 2.0 use o VS 2005

3.5 -> VS 2008

4.0 -> VS 2010

 

Eu uso o 2008 com down pra rodar usando o frame 2.0

Compartilhar este post


Link para o post
Compartilhar em outros sites

Porque voce não usa o .NET framework 2.0 ? ele facilita a vida da pra fazer tudo que voce quer e com um código extremamente menor do que o que você usa na win32 api

 

Pro 2.0 use o VS 2005

3.5 -> VS 2008

4.0 -> VS 2010

 

Eu uso o 2008 com down pra rodar usando o frame 2.0

 

Flexibilidade é um dos principais pontos, não pretendo ficar preso numa linguagem que só existe no windows, uso principalmente linux, e pra um projeto específico to tendo que usar um pouco de programação windows, prefiro c++ por que apesar (graças à micro$oft) de o código ser um pouco complicado, existe a possiblidade de eu transportar um trexo do código (a prte lógica, é claro) entre sem grandes adaptações.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ow, num é que funcionou! Coloquei IMAGE_BITMAP no lugar de IDI_IMAGEM e deu certo.

 

Dai, eu queria fazer melhor, o botão com a imagem, fica com aquele efeito de sombra na direita e abaixo e claro acima e na esquerda, tem como tirar isso?

 

E tem como carregar uma imagem que não seja no formato .BMP? A idéia é carregar uma imagem com menor peso (em bytes) e possibilitar a transparência (pra mostrar o fundo).

 

E teria também como adicionar um efeito de press personalizado? Tipo, outra imagem?

 

De qualquer forma, você já ajudou, valeu.

 

 

Buenas...

 

Seguinte, a coisa começa a complicar, você terá que estudar o DrawItem do Botao.

Digamos que teria que refazer esse botão, graficamente falando...

 

Sobre o que falaram acima de usar o VS2008 com .Net, é verdade, e o que você está fazendo, com Windows, você não vai conseguir usar em Linux, você pode usar o VS2008 (graficamente), e chamar uma lib/dll feita em C/C++, com as funcionalidades!

 

Vai dar trabalho, se fosse você usaria ao menos MFC, por que tratar tudo do zero, vai demorar bastante!

 

 

Abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

beleza, vo ver aqui alguma coisa de MFC. Mas eu num disse que levaria o código todo, só a partde da lógica, o modo de funcionamento do programa, as regras de trabalh, sacou?

 

Beleza, é isso mesmo! Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.