Ir ao conteúdo
  • Cadastre-se

Lucca Rodrigues

Membro Pleno
  • Posts

    1.081
  • Cadastrado em

  • Última visita

Tudo que Lucca Rodrigues postou

  1. @Cambalinho ptr++ faz com que o ponteiro aponte pra posição seguinte na memória. Se tem um vetor dinâmico como aquele tal `pixels`, pode indexar para acessar cada um dos elementos. Se `valor` for um endereço, então ok. Daí sim, altera o valor apontado pelo ponteiro.
  2. @Rafael-Rosa1 O que tentou fazer? Compreendeu o enunciado? Conseguiu fazer algum dos itens? Para postar o código, use o botão Code:
  3. @Cambalinho Talvez @arfneto ou algum outro colega saiba te direcionar melhor. Só quis te dar uma ideia de como resolver aquele problema inicial da SetPixel() De C++ não entendo tanto.
  4. @Cambalinho Vou postar o código do exemplo que mostrei em #8. De resto não posso te ajudar, não sei o que está tentando fazer e você não me diz (em detalhes). Das funções que eu escrevi nesse código: GetBitmapPixel() salva em um arquivo texto o tamanho e a cor dos pixels do bitmap carregado de um diretório por Loadhbit(). CreateBitmapPixel() lê os dados do bitmap do arquivo texto, cria o bitmap e o retorna para que seja usado pela função SendMessage() chamada após CreateWindowW(), isso tudo a fim de criar na janela a imagem estática. DrawImagePixel() lê os dados do bitmap do arquivo texto e o desenha na janela pixel a pixel. Se for testar, descomente da linha 118 à 126, comente da 107 à 117 e mude a linha 240 para fprintf(fp, "%u", COLORREFxRGB(ptPixels[i])); já que SetPixel() precisa da cor em COLORREF. Alias, img.bmp deve estar na mesma pasta que a main.c. Ou então mude o diretório na função Loadhbit(). #define ID_IMAGE 1 #define COLORREFxRGB(Color) (Color & 0xff00) | ((Color >> 16) & 0xff) \ | ((Color << 16) & 0xff0000) #include <stdio.h> #include <stdlib.h> #include <tchar.h> #include <windows.h> typedef struct { HBITMAP bitm; long bmWidth; long bmHeight; } BITDATA; int WindowX(void); int WindowY(void); HBITMAP Loadhbit(const char * load); BITDATA GetBitmapPixel(HBITMAP hBmp, const char* dir); int DrawImagePixel(long xStr, long yStr, const char* dir, HWND hwnd); HBITMAP CreateBitmapPixel(const char* dir); /* Declare Windows procedure */ LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); /* Make the class name into a global variable */ TCHAR szClassName[ ] = _T("CodeBlocksWindowsApp"); HWND hWnd = GetConsoleWindow(); int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow) { HWND hwnd; /* This is the handle for our window */ MSG msg; /* Here messages to the application are saved */ WNDCLASSEX wincl; /* Data structure for the windowclass */ /* The Window structure */ wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */ wincl.style = CS_DBLCLKS; /* Catch double-clicks */ wincl.cbSize = sizeof (WNDCLASSEX); /* Use default icon and mouse-pointer */ wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = NULL; /* No menu */ wincl.cbClsExtra = 0; /* No extra bytes after the window class */ wincl.cbWndExtra = 0; /* structure or the window instance */ /* Use Windows's default colour as the background of the window */ wincl.hbrBackground = CreateSolidBrush(RGB(255,255,255)); /* Register the window class, and if it fails quit the program */ if (!RegisterClassEx (&wincl)) return 0; /* The class is registered, let's create the program*/ hwnd = CreateWindowEx ( 0, /* Extended possibilites for variation */ szClassName, /* Classname */ _T("Pixel image"), /* Title Text */ WS_OVERLAPPEDWINDOW, /* default window */ CW_USEDEFAULT, /* Windows decides the position */ CW_USEDEFAULT, /* where the window ends up on the screen */ 544, /* The programs width */ 375, /* and height in pixels */ HWND_DESKTOP, /* The window is a child-window to desktop */ NULL, /* No menu */ hThisInstance, /* Program Instance handler */ NULL /* No Window Creation data */ ); /* Make the window visible on the screen */ ShowWindow (hwnd, nCmdShow); ShowWindow(hWnd, SW_MINIMIZE); //won't hide the window without SW_MINIMIZE ShowWindow(hWnd, SW_HIDE); /* Run the message loop. It will run until GetMessage() returns 0 */ while (GetMessage (&msg, NULL, 0, 0)) { /* Translate virtual-key msg into character msg */ TranslateMessage(&msg); /* Send message to WindowProcedure */ DispatchMessage(&msg); } /* The program return-value is 0 - The value that PostQuitMessage() gave */ return msg.wParam; } /* This function is called by the Windows function DispatchMessage() */ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND bk; switch (message) /* handle the msg */ { // case WM_CREATE: { GetBitmapPixel(Loadhbit("img.bmp"), "pixel.txt"); bk = CreateWindowW(L"Static", L"", WS_CHILD | WS_VISIBLE | SS_BITMAP, 0, 0, WindowX(), WindowY(), hwnd, (HMENU) ID_IMAGE, NULL, NULL); SendMessage(bk, STM_SETIMAGE, (WPARAM) IMAGE_BITMAP, (LPARAM) CreateBitmapPixel("pixel.txt")); } break; // /* case WM_PAINT : { Sleep(400); GetBitmapPixel(Loadhbit("img.bmp"), "pixel.txt"); DrawImagePixel(0, 0, "pixel.txt", hwnd); } break; */ case WM_CLOSE: { MessageBeep(MB_OK); if (MessageBox(hwnd, "Deseja realmente sair?", "Pixel image", MB_OKCANCEL) == IDOK) { DestroyWindow(hwnd); } else { return 0; } } break; case WM_DESTROY: { // Fechar o programa PostQuitMessage(0); // Fechar a console PostMessage(hWnd, WM_CLOSE, 0, 0); } break; default: /* for msg that we don't deal with */ return DefWindowProc (hwnd, message, wParam, lParam); } return 0; } int WindowX(void) { // Tamanho do desktop eixo X RECT desktop_rect_; HWND desktop_ = GetDesktopWindow(); GetWindowRect(desktop_, &desktop_rect_); return desktop_rect_.right; } int WindowY(void) { // Tamanho do desktop eixo Y RECT desktop_rect_; HWND desktop_ = GetDesktopWindow(); GetWindowRect(desktop_, &desktop_rect_); return desktop_rect_.bottom; } HBITMAP Loadhbit(const char * load) { HBITMAP hBitmap = (HBITMAP) LoadImage(NULL, (LPCSTR)load, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); if(hBitmap == NULL){ // Exibe uma caixa de dialogo se algo ocorrer errado MessageBox(NULL, "Erro ao carregar imagem", "Error", MB_OK|MB_ICONERROR); } return hBitmap; } BITDATA GetBitmapPixel(HBITMAP hBmp, const char* dir) { FILE *fp = fopen(dir, "w"); BITDATA RetBmp; HDC hBmpDC = NULL; if (hBmp) { // DC para bitmap de origem HDC BufferDC = CreateCompatibleDC(NULL); if (BufferDC) { HBITMAP hTmpBitmap = (HBITMAP) NULL; if (hBmpDC) if (hBmp == (HBITMAP)GetCurrentObject(hBmpDC, OBJ_BITMAP)) { hTmpBitmap = CreateBitmap(1, 1, 1, 1, NULL); SelectObject(hBmpDC, hTmpBitmap); } HGDIOBJ PreviousBufferObject = SelectObject(BufferDC,hBmp); // BufferDC contem o bitmap HDC DirectDC = CreateCompatibleDC(NULL); if (DirectDC) { // Obtendo o tamanho do bitmap BITMAP bm; GetObject(hBmp, sizeof(bm), &bm); // criando um BITMAPINFO para a CreateDIBSection() BITMAPINFO RGB32BitsBITMAPINFO; ZeroMemory(&RGB32BitsBITMAPINFO,sizeof(BITMAPINFO)); RGB32BitsBITMAPINFO.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); RGB32BitsBITMAPINFO.bmiHeader.biWidth = bm.bmWidth; RGB32BitsBITMAPINFO.bmiHeader.biHeight = bm.bmHeight; RGB32BitsBITMAPINFO.bmiHeader.biPlanes = 1; RGB32BitsBITMAPINFO.bmiHeader.biBitCount = 32; // Ponteiro para acesso aos pixels do bitmap UINT* ptPixels; HBITMAP DirectBitmap = CreateDIBSection(DirectDC, (BITMAPINFO *)&RGB32BitsBITMAPINFO, DIB_RGB_COLORS, (void **)&ptPixels, NULL, 0); if (DirectBitmap) { HGDIOBJ PreviousObject = SelectObject(DirectDC, DirectBitmap); BitBlt(DirectDC, 0, 0, bm.bmWidth,bm.bmHeight, BufferDC, 0, 0, SRCCOPY); // DirectDC contem o bitmap // Gravando tamanho do bitmap no arquivo fprintf(fp, "%ld\n%ld\n", bm.bmWidth, bm.bmHeight); // Gravando a cor dos pixels no arquivo for (int i= ((bm.bmWidth*bm.bmHeight)-1); i>=0; i--) { fprintf(fp, "%u", ptPixels[i]); if(i > 0) fputc('\n', fp); } // Limpeza SelectObject(DirectDC,PreviousObject); // Preparando retorno RetBmp.bitm = DirectBitmap; RetBmp.bmWidth = bm.bmWidth; RetBmp.bmHeight = bm.bmHeight; } // Limpeza DeleteDC(DirectDC); } if (hTmpBitmap) { SelectObject(hBmpDC, hBmp); DeleteObject(hTmpBitmap); } SelectObject(BufferDC,PreviousBufferObject); DeleteDC(BufferDC); } } fclose(fp); return RetBmp; } int DrawImagePixel(long xStr, long yStr, const char* dir, HWND hwnd) { PAINTSTRUCT ps; RECT r; GetClientRect(hwnd, &r); HDC hdc = BeginPaint(hwnd, &ps); FILE *fp = fopen(dir, "r"); if (fp == NULL) { return 1; } long bmWidth = 0; long bmHeight = 0; UINT pixel = 0; // Lendo tamanho do bitmap fscanf(fp, "%ld %ld", &bmWidth, &bmHeight); for(int i = yStr; i < (bmHeight + yStr); i++) { for(int j = xStr; j < (bmWidth + xStr); j++) { // Lendo do arquivo e pintando pixel a pixel fscanf(fp, " %u", &pixel); SetPixel(hdc, j, i, pixel); } } EndPaint(hwnd, &ps); return 0; } HBITMAP CreateBitmapPixel(const char* dir) { long bmWidth = 0; long bmHeight = 0; long long cont = 0; FILE *fp = fopen(dir, "r"); if (fp == NULL) { return NULL; } // Lendo tamanho do bitmap fscanf(fp, "%ld %ld", &bmWidth, &bmHeight); // Vetor de pixels unsigned int* pixels = (unsigned int*)malloc(bmWidth*bmHeight*sizeof(unsigned int)); for(int i = 0; i < bmHeight; i++) { for(int j = 0; j < bmWidth; j++) { // Lendo do arquivo e gravando no vetor fscanf(fp, " %u", &pixels[cont++]); } } // Criando o bitmap return CreateBitmap(bmWidth, bmHeight, 1, 32, pixels); }
  5. @Cambalinho Você já tem a cor do pixel em questão antes de chamar a SetPixel(). Em vez de chamar a função, preencha o vetor, assim como eu tinha dito: Se foi você que escreveu o código, saberá modificar da forma adequada. A ideia é justamente armazenar o pixel em vez de pintá-lo na janela. Você vai precisar do valor RGB dos pixels, e se tem COLORREF em mãos, converta: Coloque a macro na primeira linha do código e chame-a como função, seu retorno é o valor RGB. No mais: Seu código não vai mudar em geral, pode rotacionar e modificar o bitmap do jeito que quiser, o fato é que deveria ser uma aplicação Windows, que faz mais sentido do que uma aplicação de console nesse caso, já que está usando a API do Windows. Veja o link de exemplo de como criar uma imagem estática na janela: #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); void LoadMyImage(void); HBITMAP hBitmap; int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR lpCmdLine, int nCmdShow) { MSG msg; WNDCLASSW wc = {0}; wc.lpszClassName = L"Static image"; wc.hInstance = hInstance; wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE); wc.lpfnWndProc = WndProc; wc.hCursor = LoadCursor(0,IDC_ARROW); RegisterClassW(&wc); CreateWindowW(wc.lpszClassName, L"Static image", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 330, 270, 0, 0, hInstance, 0); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int) msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { HWND hsti; switch(msg) { case WM_CREATE: LoadMyImage(); hsti = CreateWindowW(L"Static", L"", WS_CHILD | WS_VISIBLE | SS_BITMAP, 5, 5, 300, 300, hwnd, (HMENU) 1, NULL, NULL); SendMessage(hsti, STM_SETIMAGE, (WPARAM) IMAGE_BITMAP, (LPARAM) hBitmap); break; case WM_DESTROY: DeleteObject(hBitmap); PostQuitMessage(0); break; } return DefWindowProcW(hwnd, msg, wParam, lParam); } void LoadMyImage(void) { hBitmap = LoadImageW(NULL, L"C:\\prog\\slovakia.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); } No exemplo, o autor chama LoadImageW() pra carregar o bitmap, no nosso caso, CreateBitmap() faria esse serviço. De resto, WinMain() é a entrada para a aplicação Windows, usará ela em vez da main(). A imagem estática é criada na WndProc() pela função CreateWindowW().
  6. @De Los Santos Isso faz com que caracteres de espaço em branco sejam lidos e ignorados, é uma boa prática se a ideia é evitar com que o usuário tecle Enter logo de cara (caso não haja interesse em ler esses caracteres). @Chr15 Qual tecla é pressionada ao finalizar a leitura? Enter! Essa tecla interessa na leitura de um inteiro? de um ponto flutuante? A resposta é não, mas veja, vai interessar na leitura de um caractere. \n é um caractere de espaço em branco, e você pode ignorá-lo colocando um espaço como primeiro caractere na string de formato na scanf(): Assim como fez sem saber o motivo, mas agora você sabe Sugiro esquecer bool em C, vai alocar 8 bits em vez de 1 como deveria (true ou false), acaba falhando no próprio conceito da variável. Pode usar um inteiro no lugar. Aqui não é stackoverflow... Duplicado ou não, se for uma questão válida, você será respondido
  7. @Cambalinho Novamente, não sei do que você está falando. Eu recomendo que você sempre contextualize seu problema, poste o código completo e pergunte com clareza e objetividade, você não fez nenhuma dessas 3 coisas. Já te expliquei como criar uma imagem estática na janela, o problema era esse, tentou corrigir?
  8. @Leucosia Antes de mais nada: `estado` não é uma string, como imagino que desejasse que fosse. A string deveria ter espaço para 2 caracteres? Ok, mas deixe espaço para o terminador da string também: char estado[3]; O que é o terminador da string? Fonte. Se tratando de uma string, dê para scanf() o endereço do elemento no qual deverá ser iniciada a gravação dos dados, ou então apenas esqueça o &, `&estado[0]` dá no mesmo que apenas `estado`, a gravação se dá no início da string. Se tratando de um caractere, então sim, o coloque entre aspas simples. Não vai conseguir usar switch com uma string como expressão. Se tratando de 2 caracteres apenas, mais fácil seria comparar manualmente: //case 'mg' : //case 'MG' : if((estado[0] == 'm' && estado[1] == 'g') || (estado[0] == 'M' && estado[1] == 'G')) { } De qualquer forma, caso queira comparar strings, pode usar a função strcmp() da string.h. A função compara caractere por caractere e retorna 0 se as strings forem idênticas.
  9. @Cambalinho Talvez por meio das variáveis PosX e PosY, não li o código. De modo geral, CreateDIBSection() te fornece um ponteiro para o local dos bits (pixels) do bitmap, é uma forma de ter acesso. Por que precisaria disso nesse contexto? Não sei se entendi do que está falando...
  10. @Cambalinho pixels é um vetor dinâmico, criado a partir das dimensões do bitmap: bmWidth e bmHeight. Você vai preencher o vetor no mesmo loop em que chama SetPixel(). O valor de COLORREF tem o formato hexadecimal 0x00bbggrr, os componentes de cor são armazenados na ordem oposta do RGB. Essa macro inverte o azul e o vermelho, pode usar para converter de um para outro se precisar: #define COLORREFxRGB(Color) (Color & 0xff00) | ((Color >> 16) & 0xff) \ | ((Color << 16) & 0xff0000) O problema mais evidente é SetPixel() ser chamada milhares de vezes, e como eu mostrei, não é eficiente. Não vai ter problemas se criar uma janela com imagem estática a partir de um HBITMAP carregado. Aliás, talvez esteja tentando criar a imagem no console, mas recomendo trabalhar com uma aplicação Windows. Aquele site que linkei tem um exemplo de como criar uma imagem estática, então acredito que basta rotacionar sua imagem como desejar e seguir o que eu tinha dito:
  11. @Cambalinho Eu cheguei a escrever um código como esse aí, chamar SetPixel() milhares de vezes não é a melhor escolha... Veja, uma imagem 250x250, relativamente pequena, sendo construída pixel a pixel: São ao todo 62500 chamadas de SetPixel(). Por isso eu disse: Uma ideia que posso te dar é criar um vetor com o valor RGB de cada pixel, e então chamar CreateBitmap(). unsigned int* pixels = (unsigned int*)malloc(bmWidth*bmHeight*sizeof(unsigned int)); // preencha o vetor... CreateBitmap(bmWidth,bmHeight,1,32,pixels); Atribua o retorno da função à um HBITMAP e chame CreateWindowW() e SendMessage() em sequência para criar na janela uma imagem estática. Veja, se tratando de uma aplicação para Windows, chame essas funções na WndProc(). Você pode fazer isso através da mensagem WM_CREATE. Dê uma olhada nesse link, nele tem um exemplo que expressa bem o que quero dizer. A diferença? Veja: De certa forma, a imagem aparece junto à janela pai
  12. @Cambalinho Em vez de chamar SetPixel() centenas/milhares de vezes, tenha um HBITMAP carregado em mãos e chame CreateWindowW(). Afinal, o que pretende fazer exatamente?
  13. Mais fácil seria testar se o resto da divisão por tal número é 0. Se ((x % 3) == 0) Entao <x é divisível por 3> O mesmo você usa pra testar se é par (divisível por 2) ou ímpar.
  14. @sthefanes245 Você se esqueceu de incrementar o valor de k, para acessar as demais posições do vetor. Antes de tudo, inicialize o valor de k: int k = 0; // ... V[k++] = M[i][j] * A; Aliás: 3*3 = 9, a matriz tem 9 elementos, não 18. #define lin 3 #define col 3 #define tam (lin*col)
  15. @Mcosta92093 x não tem como ser > E < que y ao mesmo tempo. Se x for > OU < que y, x não vai ser = a y, então ele é != de y. Daí também, negando a condição de igualdade.
  16. @IzeraXD Sem o código completo não dá pra testar...
  17. @immoraesz Sim, como disse: E você não me respondeu... A tecla é Enter. '\n' restante no fluxo que não foi lido por scanf() pronto pra ferrar com a leitura de fgets(). Pode ler e descartar com %*c, mas isso não lida com todos os casos, nada impede o usuário de teclar o que quiser, quantas vezes quiser. Te mostrei como lidar com isso, 2-3 vezes. Imprima na saída de erro padrão (stderr). Acho que você deve estar enviando naqueles sites que avaliam a saída padrão (stdout), nada impede você de imprimir em outro fluxo: fprintf(stderr, "Provavelmente o site não vai detectar isso");
  18. @immoraesz Que tecla você aperta quando finaliza a leitura? Essa tecla não é um número, de nada interessa na leitura e gravação de um valor inteiro. Acaba sendo lida e gravada na string por fgets(). Já te foi mostrado como solucionar isso, mas você não lê nada. Dica: Imprima instruções para que o usuário saiba o que deve fazer em seu programa, não há como adivinhar o que se deve inserir Talvez dessa forma possa visualizar onde está errando.
  19. @Geraldojunio23 Opa colega, isso não é C++ E não vai dar certo se você copiar o código de outro tópico no qual o autor também estava com problemas... Talvez devesse começar por baixo, sabe o que é uma pilha? Recomendo C : Como Programar, de Deitel, Paul, Deitel, Harvey. Capítulo 12 seção 5: Pilhas. Tem um exemplo inclusive
  20. @Darkmal Se você tem essa tal cs50.h, nada custa abrir e ver o tem por lá, procure essa tal get_int(). De qualquer forma é melhor pra você aprender a usar as funções da biblioteca padrão mesmo. O código pede um inteiro e imprime #, não o oposto int mat[4][4]; Matriz criada
  21. @Darkmal Você já está fazendo isso: Ainda bem, porque # não é um valor inteiro, então o usuário deveria ser alertado mesmo... O que pretende fazer afinal? Por que? cs50.h não faz parte da biblioteca padrão do C. O comum é usar scanf().
  22. @Darkmal Você pode ler com scanf() ou com alguma outra função, não precisa dessa cs50.h. int n; scanf(" %d%*c", &n); Se scanf() leu e gravou direito, deve retornar 1 nesse caso. A função retorna 0 se não leu nada, e -1 em caso de erro. Melhor seria: int ch; int n; printf("Digite o valor: "); while(scanf("%d", &n) < 1) { // Lendo o que resta no fluxo while((ch = fgetc(stdin)) != '\n' && ch != EOF); // Informando o problema printf("Entrada invalida!\nDigite o valor: "); } while((ch = fgetc(stdin)) != '\n' && ch != EOF);
  23. O fórum é público, se precisa de ajuda com seu código eu recomendo que poste ele. Use o botão Code
  24. @Diovani Facco Em geral se coluna + 2 = linha você vai ter a localização de um elemento da diagonal duas posições abaixo da diagonal principal:
  25. @Amanda Umlauf Não precisa do & para ler strings com scanf(), e se quiser colocar, indique a posição da string na qual deve ser iniciada a gravação dos dados: &lib[i].nome_livro[0]. Se quer ler strings com espaços também, já que a maioria dos livros têm ao menos um espaço, pode usar como especificador %[^\n], isso faz com que a leitura só se encerre quando for encontrado um \n. O mesmo vale pra isso. E isso. Declare a função como por exemplo int pra retornar um inteiro. O mesmo vale pra isso. Pra que esse loop? Só vai rodar uma vez. Aliás, você está cadastrando sempre na posição 0 de lib. Você precisa de um contador que indique quantos livros já foram cadastrados, daí pode efetuar o cadastro usando ele de índice em lib. Acho que o problema é justamente a falta do contador Aliás... Troque esse TAM pela variável responsável pela contagem, faça com que a função visualizar() receba esse valor, não trabalhe apenas com void funcao(void), isso só dificulta tudo.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...