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:




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" ) );

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

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é.