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