Ir para conteúdo

POWERED BY:

Arquivado

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

Wanderson Regis Silva

Erro com CBitmapButton

Recommended Posts

Existe alguma inclusão adicional ao afxwin.h quando se for usar CBitmapButton em MFC?, por que em tudo quanto é exemplo que eu vejo, mostra sendo usado mas não fala nada de includes. E quando eu tento usar (no VS 2008) dá a seguinte saida quando tento compilar:

1>------ Build started: Project: OsMFC, Configuration: Debug Win32 ------
1>Compiling...
1>app_bmp.cpp
1>c:\users\wanderson\documents\visual studio 2008\projects\osmfc\osmfc\app_bmp.h(15) : error C2146: syntax error : missing ';' before identifier 'btnImagem'
1>c:\users\wanderson\documents\visual studio 2008\projects\osmfc\osmfc\app_bmp.h(15) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\wanderson\documents\visual studio 2008\projects\osmfc\osmfc\app_bmp.h(15) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\wanderson\documents\visual studio 2008\projects\osmfc\osmfc\app_bmp.cpp(17) : error C2065: 'btnImagem' : undeclared identifier
1>c:\users\wanderson\documents\visual studio 2008\projects\osmfc\osmfc\app_bmp.cpp(17) : error C2228: left of '.Create' must have class/struct/union
1>        type is ''unknown-type''
1>Build log was saved at "file://c:\Users\Wanderson\Documents\Visual Studio 2008\Projects\OsMFC\OsMFC\Debug\BuildLog.htm"
1>OsMFC - 5 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Dá a impressão que o VS tá achando que eu to tentando declarar um método, mas não é.

 

Eu declaro CBitmapButton btnImagem; como privado no arquivo .h e no construtor da classe (essa é a classe que cria a janela) eu uso assim:

btnImagem.Create(L"", WS_VISIBLE | BS_OWNERDRAW, CRect(256, 192, 352, 213), this, IDB_BOTAO);
//btnImagem.LoadBitmaps(IDI_BOTAO, IDI_BOTAO, IDI_BOTAO, IDI_BOTAO);
Eu estou apenas aprendendo, então éssa é apenas uma janela com botões, e foi a primeira vez que eu tento criar um CBitmapButton. Eu tenho apenas 2 classes: uma da aplicação (que faz uma implementação do método InitInstance e a classe da janela, que no construtor criaria esses botões.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Leia a mensagem de error e poste as linhas que dão error

 

 

btnImagem.Create(L"", WS_VISIBLE | BS_OWNERDRAW, CRect(256, 192, 352, 213), this, IDB_BOTAO);

 

Tenho quase certeza que a sintaxe está errada , deveria ser

 

btnImagem->Create(L"", WS_VISIBLE | BS_OWNERDRAW, CRect(256, 192, 352, 213), this, IDB_BOTAO);

 

 

Error :

error C2065: 'btnImagem' : undeclared identifier

 

Voce está tentando usar o objeto btnImagem e não o declarou ?

 

CButton btnImage;

 

* O 'L' que precede uma string acho que está obsoleto (pelo menos eu não preciso utilizar nem ele nem o S"")

 

 

Poste uma quantidade de código que seje suficiente para uma analise melhor , as vezes a linha que o compilador aponta como problema não é a unica causa do problema

 

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

A variável btnImage eu declarei no arquivo .h que eu declarei a classe como CBitmapButton private, e eu uso btnImage.Create... por que eu fiz assim com uma variável CButton e funcionouu assim. E o 'L', nem eu tenho certeza, mas às vezes quando eu num uso fica dando um monte de mensagem de aviso, prefiro deixar assim e evitar.

 

A mensagem de erro é como se a classe não existisse, mas ela tá no manual da ms pra minha versão do VS2008 inclusive. Eu já tentei só substituir o CBitmapButton por apenas CButton e funciona normal, mas quando eu tento o tal ai dá sempre erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem, eu não pude responder antes, mas acabei meio que resolvendo, na verdade eu tenho é a impressão que a tal classe CBitmapButton só existe na teoria mesmo, dai acabei por encontrar dois códigos fonte de classes que fariam o trabalho que eu tanto queria. Eu juntei os dois e saiu o seguinte código:

BitmapButton.h

#pragma once

#include <afxwin.h>

class BitmapButton : public CButton {
public:
	BOOL LoadBitmaps(UINT nIDBitmapResource,
		UINT nIDBitmapResourceSel = 0,
		UINT nIDBitmapResourceFocus = 0,
		UINT nIDBitmapResourceDisabled = 0);
	void PreSubclassWindow(void);
protected:
	CBitmap m_bitmap;
	CBitmap m_bitmapSel;
	CBitmap m_bitmapFocus;
	CBitmap m_bitmapDisabled;
	virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS);
};
BitmapButton.cpp

#include "BitmapButton.h"

BOOL BitmapButton::LoadBitmaps(UINT nIDBitmapResource,
								UINT nIDBitmapResourceSel,
								UINT nIDBitmapResourceFocus,
								UINT nIDBitmapResourceDisabled) {
	m_bitmap.DeleteObject();
	m_bitmapSel.DeleteObject();
	m_bitmapFocus.DeleteObject();
	m_bitmapDisabled.DeleteObject();
	
	if ( ! m_bitmap.LoadBitmap(nIDBitmapResource)) {
		return FALSE;
	}

	BOOL bAllLoaded = TRUE;
	
	if (nIDBitmapResourceSel != NULL) {
		if (!m_bitmapSel.LoadBitmap(nIDBitmapResourceSel)) {
			bAllLoaded = FALSE;
		}
	}
	
	if (nIDBitmapResourceFocus != NULL) {
		if (!m_bitmapFocus.LoadBitmap(nIDBitmapResourceFocus))
			bAllLoaded = FALSE;
	}

	if (nIDBitmapResourceDisabled != NULL) {
		if (!m_bitmapDisabled.LoadBitmap(nIDBitmapResourceDisabled))
			bAllLoaded = FALSE;
	}

	return bAllLoaded;
}

void BitmapButton::PreSubclassWindow(void) {
  CButton::PreSubclassWindow();

  ModifyStyle(0, BS_OWNERDRAW);
}

void BitmapButton::DrawItem(LPDRAWITEMSTRUCT lpDIS) {
	ASSERT(lpDIS != NULL);
	ASSERT(m_bitmap.m_hObject != NULL);
	CBitmap* pBitmap = &m_bitmap;
	UINT state = lpDIS->itemState;

	if ((state & ODS_SELECTED) && m_bitmapSel.m_hObject != NULL)
		pBitmap = &m_bitmapSel;
	else if ((state & ODS_FOCUS) && m_bitmapFocus.m_hObject != NULL)
		pBitmap = &m_bitmapFocus;
	else if ((state & ODS_DISABLED) && m_bitmapDisabled.m_hObject != NULL)
		pBitmap = &m_bitmapDisabled;

	CDC* pDC = CDC::FromHandle(lpDIS->hDC);
	CDC memDC;
	memDC.CreateCompatibleDC(pDC);
	CBitmap* pOld = memDC.SelectObject(pBitmap);

	if (pOld == NULL)
		return;

	CRect rect;
	rect.CopyRect(&lpDIS->rcItem);
	pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
	memDC.SelectObject(pOld);
}
E pra testar eu carreguei 4 imagens de 128X128 pixels com os seguintes fontes:

Tela.h

#pragma once

#include <afxwin.h>
#include "BitmapButton.h"

class Tela : public CFrameWnd {
	BitmapButton btnImg;
	CButton btnOk;
	CButton btnCancel;
public:
	Tela(void);
	void OnOkClicked(void);
	void OnCancelClicked(void);
	DECLARE_MESSAGE_MAP()
};
Tela.cpp

#include "Tela.h"

Tela::Tela(void) {
	Create(NULL, TEXT("Bits"),
		WS_MINIMIZEBOX | WS_VISIBLE | WS_SYSMENU | WS_BORDER,
		CRect(100, 100, 340, 388));

	btnOk.Create(L"Ok", WS_VISIBLE, CRect(10, 10, 110, 110), this, 0x0128);
	btnCancel.Create(L"Cancelar", WS_VISIBLE, CRect(120, 10, 220, 110), this, 0x0256);

	btnImg.Create(L"", WS_VISIBLE, CRect(48, 120, 176, 248), this, 0x0512);
	btnImg.LoadBitmaps(0x0001, 0x0002, 0x0004, 0x0008);
}

void Tela::OnOkClicked(void) {
	btnImg.EnableWindow(TRUE);
}

void Tela::OnCancelClicked(void) {
	btnImg.EnableWindow(FALSE);
}

BEGIN_MESSAGE_MAP(Tela, CFrameWnd)
	ON_BN_CLICKED(0x0128, OnOkClicked)
	ON_BN_CLICKED(0x0256, OnCancelClicked)
END_MESSAGE_MAP()
main.cpp

#include <afxwin.h>
#include "Tela.h"

class Bits : public CWinApp {
public:
	virtual BOOL InitInstance(void);
};

BOOL Bits::InitInstance(void) {
	m_pMainWnd = new Tela();

	return TRUE;
}

Bits bits;
resource.rc

0x0001 BITMAP "image_a.bmp"
0x0002 BITMAP "image_b.bmp"
0x0004 BITMAP "image_c.bmp"
0x0008 BITMAP "image_d.bmp"
Acho que talvez seja interessante colocar no laboratório de códigos fontes, pois pode ser útil pra mais alguém.

 

E... aproveitando o embalo, umas dúvidas sobre botões:

1 - Por que o botão que eu crio, não fica com a aparência normal de botões so windows vista (estando no vista, é claro)?

2 - Como eu faço para que seja possível mudar qual controle (botões, no caso) com a tecla TAB?

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.