quarta-feira, 10 de março de 2021
sexta-feira, 5 de julho de 2013
Função "explode" com wxWidgets
Criar uma função “explode” em wxWidgets é uma tarefa simples, graças a facilidade proporcionada pelo wxArrayString, ela pode ser implementada da seguinte maneira:
Para usarmos a mesma:
Essa função é muito útil para passarmos listas para um wxComboBox por exemplo.
Qualquer dúvida ou correção no código deixe nos comentários.
Até a próxima.
wxArrayString explode(char delimiter, wxString mStr)
{
wxArrayString ret;
wxString getStr;
for( unsigned int i = 0 ; i < mStr.Length() ; i++ )
{
if( mStr.GetChar(i) == delimiter)
{
ret.Add( getStr );
getStr.Clear();
}
else
{
getStr.Append(mStr.GetChar(i));
if( i == ( mStr.Length() - 1 ) ) ret.Add( getStr );
}
}
return ret;
}
Para usarmos a mesma:
//Crio uma string contendo as substrings separadas por ';'
wxString mVal = wxT( "String 1;String 2;String 3;String 4" );
//Agora crio o wxArrayString para pegar cada uma delas
wxArrayString mgetVals = explode( ';' , mVal );
//Pego cada um dos valores
wxString valor1 = mgetVals.Item( 0 );
wxString valor2 = mgetVals.Item( 1 );
wxString valor3 = mgetVals.Item( 2 );
wxString valor4 = mgetVals.Item( 3 );
Essa função é muito útil para passarmos listas para um wxComboBox por exemplo.
Qualquer dúvida ou correção no código deixe nos comentários.
Até a próxima.
segunda-feira, 1 de julho de 2013
Verificar se um ano é bissexto
Hoje vou mostrar como podemos verificar se um ano é bissexto usando uma função bem simples:
bool IsBissextile( int year )
{
return ( year % 4 == 0) && ( ( year % 400 ) == 0 || ( year % 100 ) > 0 );
}
O que fizemos aqui foi verificar se o ano é divisível por 4, ou seja, verificamos se o módulo da divisão é igual a zero, depois verificamos uma segunda condição, o ano não deve ser divisível por 100 ao menos que ele seja divisível por 400, se as duas condições forem verdadeiras é porque o ano é bissexto.
Vamos testar a função verificando se o ano atual é bissexto, para isso vamos usar a classe wxDateTime.
int year = wxDateTime::Today().GetYear();
if( IsBissextile( year ) )
wxMessageBox( wxT( "É bissexto" ) );
else
wxMessageBox( wxT( "Não é bissexto" ) );
bool IsBissextile( int year )
{
return ( year % 4 == 0) && ( ( year % 400 ) == 0 || ( year % 100 ) > 0 );
}
O que fizemos aqui foi verificar se o ano é divisível por 4, ou seja, verificamos se o módulo da divisão é igual a zero, depois verificamos uma segunda condição, o ano não deve ser divisível por 100 ao menos que ele seja divisível por 400, se as duas condições forem verdadeiras é porque o ano é bissexto.
Vamos testar a função verificando se o ano atual é bissexto, para isso vamos usar a classe wxDateTime.
int year = wxDateTime::Today().GetYear();
if( IsBissextile( year ) )
wxMessageBox( wxT( "É bissexto" ) );
else
wxMessageBox( wxT( "Não é bissexto" ) );
Até a próxima dica
quarta-feira, 13 de março de 2013
ScreenShot com wxWidgets
Hoje vamos ver como
podemos tirar um screenshot usando wxWidgets.
Em primeiro lugar vamos
ver quais as classes que usaremos para isso:
O wxWidgets trabalha
com alguns tipos de DC ou Device Context, cada um deles é
responsável por selecionar um determinado objeto para que possamos
desenhar ou obter informações de imagem, um dos Dcs que já
expliquei por aqui foi o wxPaintDC, com ele, selecionamos um objeto
derivado de wxWindow e podemos desenhar nesse objeto, hoje vamos ver
outros dois Dcs, o wxScreenDC, que seleciona a tela do Desktop,
fazendo com que possamos convertê-la em imagem, depois usaremos o
wxMemoryDC que seleciona um wxBitmap e consegue desenhar no mesmo.
Vamos criar uma função
chamada GetScreenShot que vai nos retornar um wxBitmap:
wxBitmap GetScreenShot()
{
wxSize mSize = wxGetDisplaySize();
wxBitmap mBmp = wxBitmap(mSize.x, mSize.y);
wxMemoryDC mDC(mBmp);
wxScreenDC sDC;
mDC.Blit(0, 0, mSize.x, mSize.y, &sDC, 0, 0);
mDC.SelectObject(wxNullBitmap);
return mBmp;
}
Na linha 1 temos a
declaração da função.
Na linha 4 pegamos o
tamanho do nosso Desktop, incluindo a área do painel, usando a
função wxGetDisplaySize() que me retornará um wxSize.
Na linha 6 criamos um
wxBitmap com as dimensões da nossa Área de Trabalho.
ha 8 criamos o
wxMemoryDC passando como parâmetro o wxBitmap, ele será responsável
por plotar a imagem da Área de Trabalho em nosso bitmap.
Na linha 10 criamos o
wxScreenDC, ele será responsável por pegar a imagem da Área de
Trabalho, ele fará isso automaticamente.
Em 12 temos a parte
mais complicada da função, é quando plotamos a imagem da área de
trabalho no bitmap usando a função Blit.
Os parâmetros da
função Blit que usaremos aqui são:
O primeiro e o segundo
parâmetros são usados para passar a posição inicial do bitmap
onde queremos desenhar, aqui uso 0 e 0 pois quero que a Área de
Trabalho seja plotada iniciando nessas coordenadas.
O terceiro e quarto
parâmetros são a altura e largura que irei usar na plotagem, no
caso o tamanho total da área de trabalho.
O quinto parâmetro é
um ponteiro para o DC que quero “colar” na imagem, no caso o
wxScreenDC com a imagem da nossa Área de Trabalho.
O sexto e o sétimo
parâmetros definem a partir de qual ponto do DC que estamos plotando
será iniciado o processo, aqui eu usei 0 e 0 mais uma vez pois quero
a área total do mesmo.
Na linha 14 removo o
mBmp do controle do wxMemoryDC.
E em 16 finalizo
retornando o mBmp na função.
Vejam que com poucas
linhas conseguimos obter um ScreenShot da nossa área de trabalho.
Para testar a função:
class wxAppSS : public wxApp
{
public:
virtual bool OnInit(void);
};
bool wxAppSS::OnInit(void)
{
wxInitAllImageHandlers();
GetScreenShot().SaveFile(wxT("test.png"), wxBITMAP_TYPE_PNG);
return false;
}
IMPLEMENT_APP(wxAppSS)
![]() |
| Resultado Final no Mint/Linux |
Marcadores:
Imagens com wxWidgets,
ScreenShot com wxWidgets,
wxDC
segunda-feira, 19 de novembro de 2012
wxAutomationObject – Parte 5 – Contando o número de Workbooks abertos em uma Instância
Hoje vamos criar uma função
simples para contar o número de Workbooks abertos na instância do Excel que
estamos trabalhando.
Na classe wxAutomationExcel
em public digitamos a declaração da função.
int
wxAutomationExcel::GetWorkbookCount()
no arquivo mexcel.cpp sua
contrução.
int
wxAutomationExcel::GetWorkbookCount()
{
const wxVariant workbooksCountV = this->GetProperty(wxT("Workbooks.Count"));
if (workbooksCountV.IsNull())
{
wxLogError(wxT("Problemas ao executar a
operação"));
return 0;
}
const long workbooksCount = workbooksCountV;
return
workbooksCount;
}
Aqui estamos trabalhando mais
uma vez com propriedades, no caso, chamamos a propriedade Workbooks.Count, ela
retornará um long como resultado, veja que se meu wxVariant for igual a nulo,
eu retorno o 0, eu faço assim, pois se existirem Workbooks na instância, ele
será maior que zero.
Para testar a função:
wxAutomationExcel m_excel;
//Primeiro
pegamos a instância do Excel,
//se ela não
existir eu retorno Nulo
if(!m_excel.GetExcelInstance())
return;
//Pego o número
de Workbooks abertos...
int getWBCount
= m_excel.GetWorkbookCount();
//Exibo uma
mensagem com o valor.
wxMessageBox(wxString::Format("Número
de Workbooks abertos\n%d", getWBCount));
Lembrando que essa função conta apenas o número
de Workbooks que estão abertos na instância que estamos controlando, se tivéssemos 5 instâncias rodando, cada uma com 1 Workbook aberto, o valor
retornado seria 1.
Uma imagem com o resultado do teste, veja que
tenho 3 Workbooks abertos, todos na instância que eu estou controlando.
sábado, 27 de outubro de 2012
wxAutomationObject – Parte 4 – Exibir ou esconder o Excel
Agora começaremos a trabalhar
com propriedades, na classe wxAutomationObject usamos dois métodos para isto,
um chamado GetPropert para pegarmos o valor de uma propriedade e PutPropert
para alterarmos uma propriedade, note que a partir daqui iremos utilizar com frequência wxVariants, então recomendo que vocês leiam a documentação da mesma.
Primeiro vamos verificar se o
Excel está visível ou se está correndo em segundo plano.
Na classe wxAutomationExcel
em public digitamos a declaração da função.
bool GetVisible();
no arquivo mexcel.cpp sua
contrução.
bool
wxAutomationExcel::GetVisible()
{
if(this == NULL)
return false;
wxVariant m_show = this->GetProperty(wxT("Visible"));
return m_show.GetBool();
}
No código acima, vemos o uso
do método GetProperty, passamos para o mesmo o nome da propriedade que queremos
pegar o valor e passamos esse para um wxVariant, veja que antes verifico se
wxAutomationExcel é nulo, se o Excel estiver visível nossa função retornará
verdadeiro, caso contrário, falso...
Agora, vamos alterar essa
propriedade, escondendo ou exibindo a instância do Excel que estiver setada em
nosso wxAutomationExcel.
Na classe wxAutomationExcel
em public digitamos a declaração da função.
bool SetVisible(bool visible);
no arquivo mexcel.cpp sua
contrução.
bool
wxAutomationExcel::SetVisible(bool visible)
{
if(this == NULL)
return false;
if(!this->PutProperty(wxT("Visible"), visible))
{
wxLogError(wxT("Excel não pode ser exibido"));
return false;
}
return true;
}
Nessa função utilizamos o
método PutProperty, esse método é utilizado para pegarmos alguma propriedade do
objeto setado em nossa classe, passamos primeiro o nome da propriedade e depois
o valor que queremos dar para ela, no caso da propriedade Visible passamos um
valor booleano.
Vale lembrar que essa classe
está trabalhando apenas com o Excel.Application, então todos os métodos e
propriedades passados como parâmetros servem apenas para a aplicação em si.
Para testarmos as duas
funções apresentadas nesse tutorial:
wxAutomationExcel m_excel;
if(!m_excel.GetExcelInstance())
return;
//ou
//if(!m_excel.CreateExcelInstance())
// return;
//Vejo se o
Excel está visível...
if(m_excel.GetVisible())//...se sim...
m_excel.SetVisible(false);//...escondo...
else//...se não...
m_excel.SetVisible(true);//...exibo
o mesmo...
No próximo tutorial iremos
iniciar com Workbooks, até.
Assinar:
Postagens (Atom)

