Ir ao conteúdo

C++ como desenhar uma estrela no c++


Ir à solução Resolvido por cyer,

Posts recomendados

Postado

olá pessoal

        alguém poderia me ajudar, estou estudando a linguagem c++ e consegui fazer esse código, mas ele está apresentado mensagens  " warnig "  , queria saber como acertar o código para não aparecer essas mensagens  e porque o desenho faz linhas aleatórias onde não era para fazer, e também como detectar se a tecla ESC foi pressionada .   
ps : para rodar esse código precisa colocar ele como new project / windows application no dev c++   ou  new project / Win32 GUI project no codeblocks .

esse é o relatório de erros  :


||=== Build: Debug in desenhar uma estrela_3 (compiler: GNU GCC Compiler) ===|
C:\Users\usuario\Documents\Arquivos_win32GUI\desenhar uma estrela_3\main.cpp||In function `LRESULT WndProc(HWND__*, UINT, WPARAM, LPARAM)':|
C:\Users\usuario\Documents\Arquivos_win32GUI\desenhar uma estrela_3\main.cpp|51|warning: passing `double' for converting 2 of `BOOL MoveToEx(HDC__*, int, int, tagPOINT*)'|
C:\Users\usuario\Documents\Arquivos_win32GUI\desenhar uma estrela_3\main.cpp|51|warning: passing `double' for converting 3 of `BOOL MoveToEx(HDC__*, int, int, tagPOINT*)'|
C:\Users\usuario\Documents\Arquivos_win32GUI\desenhar uma estrela_3\main.cpp|53|warning: passing `double' for converting 2 of `BOOL LineTo(HDC__*, int, int)'|
C:\Users\usuario\Documents\Arquivos_win32GUI\desenhar uma estrela_3\main.cpp|53|warning: passing `double' for converting 3 of `BOOL LineTo(HDC__*, int, int)'|
C:\Users\usuario\Documents\Arquivos_win32GUI\desenhar uma estrela_3\main.cpp|54|warning: passing `double' for converting 2 of `BOOL LineTo(HDC__*, int, int)'|
C:\Users\usuario\Documents\Arquivos_win32GUI\desenhar uma estrela_3\main.cpp|54|warning: passing `double' for converting 3 of `BOOL LineTo(HDC__*, int, int)'|

||=== Build finished: 0 error(s), 6 warning(s) (0 minute(s), 2 second(s)) ===|
||=== Run: Debug in desenhar uma estrela_3 (compiler: GNU GCC Compiler) ===|

  o código completo é esse :

#include <windows.h>
#include <math.h>
#include <conio.h>
static int i;
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow){
    static TCHAR szAppName[] = TEXT ("Connect") ;
    HWND janela ;
    MSG msg ;
    WNDCLASS wndclass ;
    wndclass.style = CS_HREDRAW | CS_VREDRAW ;
    wndclass.lpfnWndProc = WndProc ;
    wndclass.cbClsExtra = 0 ;
    wndclass.cbWndExtra = 0 ;
    wndclass.hInstance = hInstance ;
    wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
    wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
    wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
    wndclass.lpszMenuName = NULL ;
    wndclass.lpszClassName = szAppName ;
    if (!RegisterClass (&wndclass)){
        MessageBox (NULL, TEXT ("Program requires Windows NT!"),
        szAppName, MB_ICONERROR) ;
        return 0 ;
    }
    janela = CreateWindow (szAppName, TEXT ("Desenhar Uma Estrela"),
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT,
    CW_USEDEFAULT, CW_USEDEFAULT,
    NULL, NULL, hInstance, NULL) ;
    ShowWindow (janela, iCmdShow) ;
    UpdateWindow (janela) ;
    while (GetMessage (&msg, NULL, 0, 0)){
        TranslateMessage (&msg) ;
        DispatchMessage (&msg) ;
    }
    return msg.wParam ;
}
LRESULT CALLBACK WndProc (HWND janela, UINT message, WPARAM wParam, LPARAM lParam){
    HDC tela ;
    COLORREF color;
    PAINTSTRUCT ps ;
    int z=0;
    double x,y,x2,y2,x3,y3,x4,y4,x5,y5;
    double k,w,k2,w2,k3,w3,k4,w4,k5,w5;
    tela = GetDC (janela) ;
    switch (message){
        case WM_COMMAND:
            if(kbhit())z=getch();
            if(z==27){
                PostQuitMessage (0) ;
                return 0;
            }
        case WM_PAINT :
            tela = BeginPaint (janela, &ps) ;
            x =cos( i     *3.141615/180)*200+300;
            y =sin( i     *3.141615/180)*200+250;
            x2=cos((i+72 )*3.141615/180)*200+300;
            y2=sin((i+72 )*3.141615/180)*200+250;
            x3=cos((i+144)*3.141615/180)*200+300;
            y3=sin((i+144)*3.141615/180)*200+250;
            x4=cos((i+216)*3.141615/180)*200+300;
            y4=sin((i+216)*3.141615/180)*200+250;
            x5=cos((i+288)*3.141615/180)*200+300;
            y5=sin((i+288)*3.141615/180)*200+250;
            k =cos( i+36  *3.141615/180)*100+300;
            w =sin( i+36  *3.141615/180)*100+250;
            k2=cos((i+108)*3.141615/180)*100+300;
            w2=sin((i+108)*3.141615/180)*100+250;
            k3=cos((i+180)*3.141615/180)*100+300;
            w3=sin((i+180)*3.141615/180)*100+250;
            k4=cos((i+252)*3.141615/180)*100+300;
            w4=sin((i+252)*3.141615/180)*100+250;
            k5=cos((i+324)*3.141615/180)*100+300;
            w5=sin((i+324)*3.141615/180)*100+250;
            i++;
            MoveToEx(tela,x ,y,0) ;//posição de inicio
            LineTo  (tela,k ,w  ) ;//vai para essa posição
            LineTo  (tela,x2,y2 ) ;
            LineTo  (tela,k2,w2 ) ;
            LineTo  (tela,x3,y3 ) ;
            LineTo  (tela,k3,w3 ) ;
            LineTo  (tela,x4,y4 ) ;
            LineTo  (tela,k4,w4 ) ;
            LineTo  (tela,x5,y5 ) ;
            LineTo  (tela,k5,w5 ) ;
            LineTo  (tela,x ,y  ) ;
            if(i>360)i=0;
            Sleep(500);
            InvalidateRect (janela, NULL, TRUE) ;//limpa a tela
            EndPaint (janela, &ps) ;
            return 0 ;
        case WM_DESTROY:
            PostQuitMessage (0) ;
            return 0 ;
    }
    return DefWindowProc (janela, message, wParam, lParam) ;
}

 

  • Solução
Postado

Está aparecendo essas mensagens porque você está passando uma valor do tipo double para um argumento que é do tipo inteiro(int), para resolver esse problema, você tem 2 opções:  fazer uma conversão de tipo(cast) de double para int ou desativar o warning especifico.

 

Primeira opção(Usando Casts):

LineTo  (tela, static_cast<int>(k) , static_cast<int>(w)  ) ;//vai para essa posição
LineTo  (tela, static_cast<int>(x2), static_cast<int>(y2) ) ;
LineTo  (tela, static_cast<int>(k2), static_cast<int>(w2) ) ;
LineTo  (tela, static_cast<int>(x3), static_cast<int>(y3) ) ;
LineTo  (tela, static_cast<int>(k3), static_cast<int>(w3) ) ;
LineTo  (tela, static_cast<int>(x4), static_cast<int>(y4) ) ;
LineTo  (tela, static_cast<int>(k4), static_cast<int>(w4) ) ;
LineTo  (tela, static_cast<int>(x5), static_cast<int>(y5) ) ;
LineTo  (tela, static_cast<int>(k5), static_cast<int>(w5) ) ;
LineTo  (tela, static_cast<int>(x), static_cast<int>(y)  ) ;

 

Segunda opção(Desativando o warning do compilador):

 

Visual Studio:

#include <windows.h>
#include <math.h>
#include <conio.h>

#pragma warning(disable: 4244) // 4244 é código do warning: warning C4244: 'argument': conversion from 'double' to 'int', possible loss of data

// Restante do código...

 

Não lembro como desativar para GCC, pois não uso GCC, mas que eu me lembre seria algo assim:

 

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wuninitialized"
    // Função que deseja desabilitar os warnings aqui, no caso vai desabilitar o warning para variáveis não inicializadas
#pragma GCC diagnostic pop

 

Sobre as linhas sumir, tenho 2 coisas em mentes:

1 - A linha ainda não foi calculada para o frame atual(i++ só vai incrementar no próximo frame), essa opção é a que eu acho mais provável.

2 - Talvez alguma lentidão no código, geralmente algorítimos de desenhos que envolve bastante cálculos assim, são extremamente lentos, visto que a GDI é extremamente lenta também tanto que os jogos preferem usar OpenGL, DirectX e outras interfaces gráficas por serem muito mais rápido que GDI, juntando com funções de cálculo da math.h(sin, cos, ...) fica mais lento ainda, e pra piorar você ainda colocou um Sleep dentro.

 

Para detectar se a tecla esc foi pressionada você tem que verificar dentro da WM_KEYDOWN:

LRESULT CALLBACK WndProc (HWND janela, UINT message, WPARAM wParam, LPARAM lParam){
    HDC tela ;
    COLORREF color;
    PAINTSTRUCT ps ;
    int z=0;
    double x,y,x2,y2,x3,y3,x4,y4,x5,y5;
    double k,w,k2,w2,k3,w3,k4,w4,k5,w5;
    tela = GetDC (janela) ;
    switch (message){
    case WM_KEYDOWN:
        if (wParam == VK_ESCAPE) // Verifica se a tecla que foi pressionada é a tecla ESC(VK_ESCAPE)
        {
          	// Tecla ESC pressionada o que deseja fazer?
        }
        return 0;
    case WM_PAINT :
        tela = BeginPaint (janela, &ps) ;
        x =cos( i     *3.141615/180)*200+300;
        y =sin( i     *3.141615/180)*200+250;
        x2=cos((i+72 )*3.141615/180)*200+300;
        y2=sin((i+72 )*3.141615/180)*200+250;
        x3=cos((i+144)*3.141615/180)*200+300;
        y3=sin((i+144)*3.141615/180)*200+250;
        x4=cos((i+216)*3.141615/180)*200+300;
        y4=sin((i+216)*3.141615/180)*200+250;
        x5=cos((i+288)*3.141615/180)*200+300;
        y5=sin((i+288)*3.141615/180)*200+250;
        k =cos( i+36  *3.141615/180)*100+300;
        w =sin( i+36  *3.141615/180)*100+250;
        k2=cos((i+108)*3.141615/180)*100+300;
        w2=sin((i+108)*3.141615/180)*100+250;
        k3=cos((i+180)*3.141615/180)*100+300;
        w3=sin((i+180)*3.141615/180)*100+250;
        k4=cos((i+252)*3.141615/180)*100+300;
        w4=sin((i+252)*3.141615/180)*100+250;
        k5=cos((i+324)*3.141615/180)*100+300;
        w5=sin((i+324)*3.141615/180)*100+250;
        i++;
        MoveToEx(tela,x ,y,0) ;//posição de inicio
        LineTo  (tela, static_cast<int>(k) , static_cast<int>(w)  ) ;//vai para essa posição
        LineTo  (tela, static_cast<int>(x2), static_cast<int>(y2) ) ;
        LineTo  (tela, static_cast<int>(k2), static_cast<int>(w2) ) ;
        LineTo  (tela, static_cast<int>(x3), static_cast<int>(y3) ) ;
        LineTo  (tela, static_cast<int>(k3), static_cast<int>(w3) ) ;
        LineTo  (tela, static_cast<int>(x4), static_cast<int>(y4) ) ;
        LineTo  (tela, static_cast<int>(k4), static_cast<int>(w4) ) ;
        LineTo  (tela, static_cast<int>(x5), static_cast<int>(y5) ) ;
        LineTo  (tela, static_cast<int>(k5), static_cast<int>(w5) ) ;
        LineTo  (tela, static_cast<int>(x), static_cast<int>(y)  ) ;
        if(i>360)i=0;
        Sleep(500);
        InvalidateRect (janela, NULL, TRUE) ;//limpa a tela
        EndPaint (janela, &ps) ;
        return 0;
    case WM_DESTROY:
        PostQuitMessage (0) ;
        return 0 ;
    }
    return DefWindowProc (janela, message, wParam, lParam) ;
}

 

  • Obrigado 1
Postado

@cyer @cyer    muito obrigado ! 

      com seu  código  funcionou certo,  e também as linhas estão sendo desenhadas no local certo ,  segue o código corrigido :

#include <windows.h>
#include <math.h>
#include <conio.h>
#include <tchar.h>
static int i;
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow){
    static TCHAR szAppName[] = TEXT ("Connect") ;
    HWND janela ;
    MSG msg ;
    WNDCLASS wndclass ;
    wndclass.style = CS_HREDRAW | CS_VREDRAW ;
    wndclass.lpfnWndProc = WndProc ;
    wndclass.cbClsExtra = 0 ;
    wndclass.cbWndExtra = 0 ;
    wndclass.hInstance = hInstance ;
    wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
    wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
    wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
    wndclass.lpszMenuName = NULL ;
    wndclass.lpszClassName = szAppName ;
    if (!RegisterClass (&wndclass)){
        MessageBox (NULL, TEXT ("Program requires Windows NT!"),
        szAppName, MB_ICONERROR) ;
        return 0 ;
    }
    janela = CreateWindow (szAppName, TEXT ("Desenhar Uma Estrela"),
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT,
    CW_USEDEFAULT, CW_USEDEFAULT,
    NULL, NULL, hInstance, NULL) ;
    ShowWindow (janela, iCmdShow) ;
    UpdateWindow (janela) ;
    while (GetMessage (&msg, NULL, 0, 0)){
        TranslateMessage (&msg) ;
        DispatchMessage (&msg) ;
    }
    return msg.wParam ;
}
LRESULT CALLBACK WndProc (HWND janela, UINT message, WPARAM wParam, LPARAM lParam){
    HDC tela ;
    static TCHAR frase[] = _T("Tecle ESC Para Sair !");
    PAINTSTRUCT ps ;
    int j;
    tela = GetDC (janela) ;
    switch (message){
        case WM_COMMAND:
            return 0;
        case WM_KEYDOWN:
            if (wParam == VK_ESCAPE){
                PostQuitMessage (0) ;
                return 0 ;
            }
        return 0;
        case WM_PAINT :
            tela = BeginPaint (janela, &ps) ;
            TextOut(tela, 650, 50, frase, _tcslen(frase));
            MoveToEx(  tela,static_cast<int>(cos(i*3.141615/180)*200+300),
                            static_cast<int>(sin(i*3.141615/180)*200+250),0) ;//posição de inicio da estrela
            for(j=0;j<5;j++){
                LineTo(tela,static_cast<int>(cos((i+ j*72+36)*3.141615/180)*100+300) ,
                            static_cast<int>(sin((i+ j*72+36)*3.141615/180)*100+250));//vai para essas posições
                LineTo(tela,static_cast<int>(cos((i+(j+1)*72)*3.141615/180)*200+300) ,
                            static_cast<int>(sin((i+(j+1)*72)*3.141615/180)*200+250));
            }
            i++;
            if(i>360)i=0;
            Sleep(50);
            InvalidateRect (janela, NULL, TRUE) ;//limpa a tela
            EndPaint (janela, &ps) ;
            return 0 ;
        case WM_DESTROY:
            PostQuitMessage (0) ;
            return 0 ;
    }
    return DefWindowProc (janela, message, wParam, lParam) ;
}

 

  • Curtir 1
Postado

   acrescentei outra figura geométrica  invertendo a direção que ela gira  :

#include <windows.h>
#include <math.h>
#include <conio.h>
#include <tchar.h>
static int i;
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow){
    static TCHAR szAppName[] = TEXT ("Connect") ;
    HWND janela ;
    MSG msg ;
    WNDCLASS wndclass ;
    wndclass.style = CS_HREDRAW | CS_VREDRAW ;
    wndclass.lpfnWndProc = WndProc ;
    wndclass.cbClsExtra = 0 ;
    wndclass.cbWndExtra = 0 ;
    wndclass.hInstance = hInstance ;
    wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
    wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
    wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
    wndclass.lpszMenuName = NULL ;
    wndclass.lpszClassName = szAppName ;
    if (!RegisterClass (&wndclass)){
        MessageBox (NULL, TEXT ("Program requires Windows NT!"),
        szAppName, MB_ICONERROR) ;
        return 0 ;
    }
    janela = CreateWindow (szAppName, TEXT ("Desenhar Uma Estrela"),
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT,
    CW_USEDEFAULT, CW_USEDEFAULT,
    NULL, NULL, hInstance, NULL) ;
    ShowWindow (janela, iCmdShow) ;
    UpdateWindow (janela) ;
    while (GetMessage (&msg, NULL, 0, 0)){
        TranslateMessage (&msg) ;
        DispatchMessage (&msg) ;
    }
    return msg.wParam ;
}
LRESULT CALLBACK WndProc (HWND janela, UINT message, WPARAM wParam, LPARAM lParam){
    HDC tela ;
    static TCHAR frase[] = _T("Tecle ESC Para Sair !");
    PAINTSTRUCT ps ;
    int j;
    tela = GetDC (janela) ;
    switch (message){
        case WM_COMMAND:
            return 0;
        case WM_KEYDOWN:
            if (wParam == VK_ESCAPE){
                PostQuitMessage (0) ;
                return 0 ;
            }
        return 0;
        case WM_PAINT :
            tela = BeginPaint (janela, &ps) ;
            TextOut(tela, 650, 50, frase, _tcslen(frase));
            MoveToEx(  tela,static_cast<int>(cos(i*3.141615/180)*200+300),
                            static_cast<int>(sin(i*3.141615/180)*200+250),0) ;//posição de inicio da estrela
            for(j=0;j<5;j++){
                LineTo(tela,static_cast<int>(cos((i+ j*72+36)*3.141615/180)*100+300) ,
                            static_cast<int>(sin((i+ j*72+36)*3.141615/180)*100+250));//vai para essas posições
                LineTo(tela,static_cast<int>(cos((i+(j+1)*72)*3.141615/180)*200+300) ,
                            static_cast<int>(sin((i+(j+1)*72)*3.141615/180)*200+250));
            }
            MoveToEx(  tela,static_cast<int>(sin(i*3.141615/180)*100+700),
                            static_cast<int>(cos(i*3.141615/180)*100+250),NULL) ;//posição de inicio do quadrado
            for(j=1;j<5;j++)
                LineTo(tela,static_cast<int>(sin((i+ j*90+00)*3.141615/180)*100+700) ,
                            static_cast<int>(cos((i+ j*90+00)*3.141615/180)*100+250));//vai para essas posições
            i++;
            if(i>360)i=0;
            Sleep(50);
            InvalidateRect (janela, NULL, TRUE) ;//limpa a tela
            EndPaint (janela, &ps) ;
            return 0 ;
        case WM_DESTROY:
            PostQuitMessage (0) ;
            return 0 ;
    }
    return DefWindowProc (janela, message, wParam, lParam) ;
}

 

  • Curtir 2

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!