Ir ao conteúdo
  • Cadastre-se

C++ como desenhar uma estrela no c++


devair1010
Ir à solução Resolvido por cyer,

Posts recomendados

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

 

Link para o comentário
Compartilhar em outros sites

  • Solução

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
Link para o comentário
Compartilhar em outros sites

@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
Link para o comentário
Compartilhar em outros sites

   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
Link para o comentário
Compartilhar em outros sites

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