Ir ao conteúdo
  • Cadastre-se

C Desenho de imagem sobre controle estático Windows


Ir à solução Resolvido por devair1010,

Posts recomendados

Estava testando códigos de apps que usam a API do Windows pra exibir texto, botões, check box, etc, em uma janela.

Quando fui testar o desenho de imagens sobre controle estático, aconteceu que a imagem não foi carregada.

Tenho linkado: -mwindows -lgdiplus -lopengl32.

Fui tentando fuçar no que dava, fui lendo algumas postagens no stackoverflow, editei o programa mas continua com o mesmo erro.

Alguém teria alguma ideia de como solucionar?

#include <windows.h>
#include <wingdi.h>

#define WM_CREATE 0x0001
#define WM_DESTROY 0x0002

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void LoadMyImage(void);

HBITMAP hBitmap;

int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    PSTR 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:
			//Mostra a imagem quando abrir a janela
            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)hBitmap);
            PostQuitMessage(0);
            break;
    }

    return DefWindowProcW(hwnd, msg, wParam, lParam);
}

void LoadMyImage(void) {

    hBitmap = (HBITMAP) LoadImageW(NULL, L"a.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
  	//A imagem está na pasta do programa
    if(hBitmap == NULL){
      	//Sempre acusa esse tal erro...
        MessageBox(NULL, "Error while loading image", "Error", MB_OK|MB_ICONERROR);
    }
}

Agradeço desde já.

a.bmp

  • Amei 1
Link para o comentário
Compartilhar em outros sites

  • Solução

@Lucca Rodrigues     testei aqui no codeblocks e está funcionando bem , carregou e imprimiu a imagem normalmente , mas ela precisa estar na mesma pasta do projeto , lá onde está a main , e ser do tipo .bmp , além de que foi preciso adicionar esse , #define ,

#define _WIN32_WINNT 0x0500  /* tem ficar na primeira linha do código */

e linkado essa livraria -lgdi32 em settings / compiler / linker settings / other linker options , e talvez a imagem seja muito grande e a janela criada pequena , então experimente aumentar o tamanho  para 800 x 800 .

1709612679_carronfs.thumb.jpg.e4515cd690f37b0d22fb5dae64342ec8.jpg

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@devair1010 Coloquei o #define na primeira linha, aumentei o tamanho da janela para 800x800, linkei aquela livraria, mas o erro persiste...

A imagem é do tipo .bmp, está na mesma pasta onde está a main.

O tamanho da imagem é 187x128.

#define _WIN32_WINNT 0x0500  /* tem ficar na primeira linha do código */
#include <windows.h>
#include <wingdi.h>

#define WM_CREATE 0x0001
#define WM_DESTROY 0x0002

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void LoadMyImage(void);

HBITMAP hBitmap;

int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    PSTR 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, 800, 800, 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)hBitmap);
            PostQuitMessage(0);
            break;
    }

    return DefWindowProcW(hwnd, msg, wParam, lParam);
}

void LoadMyImage(void) {

    hBitmap = (HBITMAP) LoadImageW(NULL, L"a.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
    if(hBitmap == NULL){
        MessageBox(NULL, "Error while loading image", "Error", MB_OK|MB_ICONERROR);
    }
}

@Jorge Curvelo Da uma olhada aqui.

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@devair1010 @arfneto Bom, eu salvei a mesma imagem .png como sendo Bitmap monocromático, funcionou.

Também tem Bitmap de 16 cores, 256 cores, 24 bits...

image.png.a14fb555936d8580dc5a4249c2f66a57.png

Saberia dizer a diferença entre estes, e qual seria melhor pra usar nesse caso?

E também, dentro da pasta desse programa de imprimir uma imagem, tem esse app aqui:

image.png.769b80c603bd8ae2f7098c5a5eb81c60.png

Se eu abro ele, é mostrada apenas a janela, sem o console, diferente do que está na pasta bin. Nas outras pastas dos programas de criar, por exemplo, um botão, texto, etc, não tem esse aplicativo, não sei nem como isso foi parar aí. Teria como fazer o mesmo para os outros programas? Um executável que abre apenas a janela.

Obrigado pela ajuda.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

45 minutos atrás, Lucca Rodrigues disse:

aberia dizer a diferença entre estes, e qual seria melhor pra usar nesse caso?

 

Mas qual é o caso?

Se quer mostrar um bitmap LoadImage() cuida dos detalhes. Se não precisa mudar nada não mude nada.

Note que LoadImageW espera as strings wide, então convém mudar para LoadImageA() ou mudar as strings()

 

Rodou no meu computador com umas poucas mudanças:

 

Declarei WinMain() como int __stdcall para o compilador não ficar reclamando. 


Prefixei as strings com L em

        MessageBox(NULL, L"Error while loading image", L"Error", MB_OK | MB_ICONERROR);

Só para ele não ficar reclamando 

        //Mostra a imagem quando abrir a janela
        hsti = CreateWindowW(L"Static", L"",
            WS_CHILD | WS_VISIBLE | SS_BITMAP,
            5, 5, 1024, 768, hwnd, (HMENU)1, NULL, NULL);

        LoadMyImage();

        SendMessage(hsti, STM_SETIMAGE,
            (WPARAM)IMAGE_BITMAP, (LPARAM)hBitmap);

        SetWindowPos(hwnd, HWND_TOP, 50, 100, 800, 600, SWP_SHOWWINDOW);

Coloquei LoadMyImage() depois de CreateWindow() --- não precisava --- e chamei SetWindowPos() em seguida para mudar o tamanho para o tamanho da janela para o tamanho do bitmap, que era 800x600 --- um fractal gerado por um programa de teste que eu escrevi outro dia ;) --- e assim a imagem ficou inteira:
 

image.thumb.png.d8819efdc82a41f175d42571e01090da.png

adicionado 0 minutos depois

Para compilar usei o compilador da microsoft mesmo

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@arfneto Bacana, obrigado pela explicação.

Saberia me explicar também sobre isso?

1 hora atrás, Lucca Rodrigues disse:

image.png.769b80c603bd8ae2f7098c5a5eb81c60.png

Se eu abro ele, é mostrada apenas a janela, sem o console, diferente do que está na pasta bin. Nas outras pastas dos programas de criar, por exemplo, um botão, texto, etc, não tem esse aplicativo, não sei nem como isso foi parar aí. Teria como fazer o mesmo para os outros programas? Um executável que abre apenas a janela.

Gostaria de gerar um executável que mostrasse apenas a imagem impressa na janela, sem o console. Acabei fazendo isso por acidente aí. Saberia como se faz isso?

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

de novo eu não entendir  aexplicacao do arfnet ele joga os trechos de códigos soltos eu so substituir 1 linha pela linha que ele mostrou e já deu erro

 [Error] cannot convert 'const wchar_t*' to 'LPCSTR {aka const char*}' for argument '2' to 'int MessageBoxA(HWND, LPCSTR, LPCSTR, UINT)'

 

 MessageBox(NULL, L"Error while loading image", L"Error", MB_OK | MB_ICONERROR);

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

3 minutos atrás, Lucca Rodrigues disse:

Gostaria de gerar um executável que mostrasse apenas a imagem impressa na janela, sem o console. Acabei fazendo isso por acidente aí. Saberia como se faz isso

 

É um pouco chato isso. Mas são várias funções que você chama, e tem várias maneiras de fazer. Um programa não precisa ter uma janela, ou pode ter outras. Talvez o mais simples seja usar uma segunda janela e deixar minimizada a janela do seu programa, chamando SetWindowPos() para as janelas certas e EnumClhildWindows() para achar a certa. Eu acho. Estou escrevendo sem consultar.

 

A documentação disso é muito boa. Eu acho. E começa em https://docs.microsoft.com/en-us/windows/win32/winmsg/windows Dá uma lida lá pra ver o que acha.

 

Em geral não se usa mais isso porque é muito trabalho para pouco resultado. Então o interesse vai para os frameworks, como .Net e GTK+ e Qt e SDL e WxWidgets e tal. Porque tem os designers gráficos para arrastar e colar componentes e já gera o código. Muito meigo. :) E para objetivos mais ambiciosos OpenGL e Directx e mesmo asssim em geral através de outros frameworks, como os game engines e os SDK da nVidia e da AMD...

 

Mas pode achar divertido.

adicionado 2 minutos depois
5 minutos atrás, Jorge Curvelo disse:

de novo eu não entendir  aexplicacao do arfnet ele joga os trechos de códigos soltos eu so substituir 1 linha pela linha que ele mostrou e já deu erro

 [Error] cannot convert 'const wchar_t*' to 'LPCSTR {aka const char*}' for argument '2' to 'int MessageBoxA(HWND, LPCSTR, LPCSTR, UINT)'

 

:D está "solto" porque eu só troquei 2 letras... E não era assim uma explicação, confesso. Me desculpe. Apenas listei as linhas que eu alterei para rodar no meu computador com um bitmap que eu sabia que era 800 por 600 porque foi meu programa que gerou.

 

E o __stdcall, e a chamada a SetWindowPos(). Foi só o que eu mudei do programa que o autor postou.

 

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Lucca Rodrigues    vá na pasta onde você salvou o programa , onde está a main e clica na pasta  bin e depois na pasta debug  ali estará o executável desse programa que você criou então coloque uma imagem do tipo bitmap , que esteja no paint brush , e salve nesse local como .bmp .

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@devair1010 Funciona sim, só que o console aparece também, tipo nesse daqui que eu fiz de teste:

image.png.c1878aa96d41210b65497e5b2ecdc170.png

No primeiro programa pra imprimir uma imagem que eu tinha feito, do nada apareceu um executável na pasta, que é esse que eu tinha mostrado:

2 horas atrás, Lucca Rodrigues disse:

image.png.769b80c603bd8ae2f7098c5a5eb81c60.png

Quando eu abro, não aparece o console:

image.png.c90502a8e08519cc238433c7b77b57ad.png

Daí eu tava tentando descobrir como eu fiz isso pra fazer com os outros programas também.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

19 minutos atrás, Lucca Rodrigues disse:

Daí eu tava tentando descobrir como eu fiz isso pra fazer com os outros programas também

 

Se quer sumir com as barras de scroll e tal, basta usar SetConsoleScreenBufferSize() e mudar o tamanho da janela para ficar igual ao tamanho do buffer.

 

A janela da console tem 9001 linhas, e por isso o scroll sempre acende...

image.png.ac6e644b51576073b70582b567787856.png

 

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Lucca Rodrigues @Lucca Rodrigues   aqui está funcionando sem aparecer o console ,  mas já sei , aqui é por que usei dentro da função int WinMain ,esse comando exclusivo para codeblocks ,

 

ShowWindow( hWnd, SW_MINIMIZE );
    while (GetMessage(&msg, NULL, 0, 0)) {

        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    // esse comando dessa linha abaixo
    //
    system("taskkill /IM cb_console_runner.exe");/* FECHAR JANELA DO CONSOLE */
    //
    //
    return (int) msg.wParam;
}

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@devair1010 Bom... system() não funciona nesse meu notebook, é um dos mistérios da vida... Ainda to tentando descobrir o porquê.

De qualquer forma, se eu fecho o console, a janela com a imagem impressa fecha também. Será que isso não seria um problema? Se não for, eu até dou uma olhada em alguma função pra fechar ele.

Por enquanto, eu fiz o seguinte, como você tinha mostrado:

HWND hWnd = GetConsoleWindow();
ShowWindow( hWnd, SW_MINIMIZE );  //Minimizar
//Não sei se conseguiria encerrar o console caso esteja escondido
//ShowWindow( hWnd, SW_HIDE );

Acho que só minimizar já basta. Se eu esconder, vou ter que fechar no gerenciador de tarefas. Se eu fechar, a janela com a imagem fecha também.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@devair1010

Tem alguma forma de fechar o console sem system()?

Realmente system() não funciona aqui.

Eu editei aqui, coloquei pra esconder a janela do console, e caso a janela com a imagem seja fechada, ele mostra a janela do console de novo, só não sei fechar ela...

adicionado 13 minutos depois

Consegui aqui, usei o seguinte:

PostMessage(GetConsoleWindow(), WM_CLOSE, 0, 0);

Agradeço, @devair1010 e @arfneto pela ajuda.

Obrigado.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Lucca Rodrigues     aqui tem esse código que faz exatamente isso , e não sei o por que  , veja se no seu notebook também fica só a janela criada e com a imagem , 

#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,x,y;
    float f;
    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));
            f = i*3.141615/180;
            x = (int)(cos(f)*200+300) ;
            y = (int)(sin(f)*200+250) ;
            MoveToEx(  tela,x,y,0) ;//posição de inicio da estrela
            for(j=0;j<5;j++){
                x = (int)(cos((i+ j*72+36)*3.141615/180)*100+300) ;
                y = (int)(sin((i+ j*72+36)*3.141615/180)*100+250) ;
                LineTo(tela,x,y);//vai para essas posições
                x = (int)(cos((i+(j+1)*72)*3.141615/180)*200+300) ;
                y = (int)(sin((i+(j+1)*72)*3.141615/180)*200+250) ;
                LineTo(tela,x,y);
            }
            x = (int)(sin(i*3.141615/180)*100+700) ;
            y = (int)(cos(i*3.141615/180)*100+250) ;
            MoveToEx(  tela,x,y,NULL) ;//posição de inicio do quadrado
            for(j=1;j<5;j++){
                x = (int)(sin((i+ j*90+00)*3.141615/180)*100+700) ;
                y = (int)(cos((i+ j*90+00)*3.141615/180)*100+250) ;
                LineTo(tela,x,y);//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 1
Link para o comentário
Compartilhar em outros sites

3 horas atrás, devair1010 disse:

aqui está funcionando sem aparecer o console ,  mas já sei , aqui é por que usei dentro da função int WinMain ,esse comando exclusivo para codeblocks ,

 

 

???? Que seria um comando exclusivo para code::Blocks? system? taskkill? 

Não creio que exista existe isso. Code::Blocks não tem comandos fora do menu, e mesmo lá é meio primitivo comparado aos IDE modernos...

C:\WINDOWS\system32>taskkill /?

TASKKILL [/S sistema [/U usuário [/P [senha]]]]
         { [/FI filtro] [/PID processid | /IM imagename] } [/T] [/F]

Descrição:
    Esta ferramenta é usada para finalizar tarefas por identificação de
processo (PID) ou nome de imagem.

Lista de parâmetros:
    /S   system            Especifica o sistema remoto ao qual se conectar.

    /U   [domínio\]usuário Especifica o contexto de usuário em que
                           o comando deve ser executado.

    /P   [senha]           Especifica a senha para o contexto de
                           usuário. Solicita entrada, caso omitido.

    /FI   filtro           aplica um filtro para selecionar um conjunto
                           de tarefas.
                           Permite que "*" seja usado. Por exemplo:
                           nome_imagem eq acme*

    /PID   processid       especifica a PID do processo a ser finalizado.
                           Use TaskList para obter a PID.

    /IM   imagename        Especifica o nome de imagem do processo a ser
                           finalizado. O caractere curinga '*' pode ser
                           usado para especificar todas as tarefas ou
                           nomes de imagem.

    /T                     Finaliza o processo especificado e quaisquer
                           processos filho iniciados por ele.

    /F                     Especifica a finalização forçada do(s)
                           processo(s).

    /?                     Exibe esta mensagem da Ajuda.

Como sempre escrevo isso, vou repetir aqui: nunca use system. Ou mesmo taskkill em seus programas. Não vai estar fazendo nada exceto chamar o sistema pra fazer algo. É lento, sem controle e perigoso porque alguém pode facilmente trocar esses programas por outros.

 

Esses programas de linha de comando existem para serem usados em scripts e arquivos .BAT para ferramentas simples de administração de sistema onde não há experiência suficiente para escrever uma ferramenta em alguma linguagem e nem experiência para usar recursos como powershell ou WMI ou algo assim.

 

1 hora atrás, devair1010 disse:

aqui tem esse código que faz exatamente isso , e não sei o por que  , veja se no seu notebook também fica só a janela criada e com a imagem , 

 

@devair1010 @Lucca Rodrigues A barra de scroll aparece nos programas gerados para o susbsystem console por padrão, porque a janela tem como sabe 9001 linhas por default. Se você mudar ela desaparece. Se você gerar usando o subsystem para desktop ela não aparece a menos que você force a mesma situação...

 

2 horas atrás, Lucca Rodrigues disse:

Tem alguma forma de fechar o console sem system()?

Realmente system() não funciona aqui.

Eu editei aqui, coloquei pra esconder a janela do console, e caso a janela com a imagem seja fechada, ele mostra a janela do console de novo, só não sei fechar ela...

adicionado 13 minutos depois

Consegui aqui, usei o seguinte:


PostMessage(GetConsoleWindow(), WM_CLOSE, 0, 0);

 

 

PostMessage() para mandar uma mensagem para uma janela do seu próprio programa é um caminho estranho. São as janelas do seu programa. Você não precisa mandar mensagens para elas. Basta usar os Handles que você já tem. 

 

E entenda o que eu disse sobre gerar programas para a console ou para o desktop. No Unix/Linux/Mac/Android  não tem esse conceito, mas no Windows é diferente. A console é um mundo separado. Se você não quer a janela da console escreva para desktop e vai abrir uma janela comum e você pode controlar melhor.

 

 

 

 

 

 

 

 

adicionado 16 minutos depois

Acho que no ano passado eu postei um programa aqui que listava todos os processos rodando no Windows. Esse é o mecanismo comum no Windows para essas coisas: você chama uma função de enumeração --- é a nomenclatura --- e ela vai devolvendo a lista de processos rodando. Deve dar pra ver aqui na lista de conteúdo que eu postei. Não sei agora o que era.

 

Depois disso você identifica o processo que você quer terminar e chama TerminateProcess() para encerrar. https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-terminateprocess?redirectedfrom=MSDN

 

Não chame system() para chamar TaskKill() se está escrevendo um programa em C e usando a API do Windows. Seria como mandar uma carta alguém que está na sua frente dizendo pra ele mandar um recado para alguém que está do seu lado.

 

Um último palpite: não testem esse tipo de programa dentro do ambiente de execução do IDE apenas. Esse ambiente é muito diferente do ambiente de execução normal e de um "build" de produção normal, um  "release build". Gere um EXE e RODE ao menos uma vez antes de tirar conclusões.  

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

5 horas atrás, devair1010 disse:

que só fecha o console se estiver rodando o codeblocks e em outro compilador não

 

Está errado: nada tem a ver com estar rodando o Code::Blocks. Pense bem: o propósito do IDE é gerar programas que se imagina você vai usar depois... Não pode haver um comando do Code::Blocks no seu programa. Se tiver você está criando um problema...

 

Isso vem do jeito de os iniciantes usam os programas, e eu nunca tinha pensado de fato nisso até frequentar esses forums: em geral usa um IDE para escrever E RODAR os programas. E depois que o programa fica pronto não se usa mais. Nunca mais.

 

Citação

Essa é a antítese do que seria desenvolver um programa, que começa a existir quando fica pronto.

 

De volta ao Code::Blocks e ao contexto

 

Basta você identificar qual a janela da console e fechar, ou mininizar, ou esconder, usando por exemplo SetWindowPos()

 

 Está programando em C ou C++ usando exatamente a API do Windows. Não há nada que não possa fazer com o Windows, já que afinal é a API do Windows.

 

Não é que funciona só com o code::Blocks, @devair1010 Apenas se você olhar na pasta de instalação desse programa vai ver:

 

image.png.10dc269b74111f0fd69f6a84d62c12bc.png

 

Então você precisa, ao distribuir o programa, enviar também esse executável, que foi fornecido com o Code::Blocks. Você não precisa de um IDE para escrever programas. É só uma conveniência e nem sempre é conveniente.

 

Se você escrever um programa usando o Eclipse pode muito bem usar esse executável, dá na mesma. Ele não faz parte do Code::Blocks, que não permitiria afinal sequer criar um programa. Ele nem tem um compilador, como sabe. É só uma capa em torno de um ou mais compiladores e linkers, como todo IDE

 

Você quer fechar a janela da console dentro de um programa em C que usa a Windows API então feche a janela usando a windows API. 
 

Citação

Dentro de um programa em C, e usando a API do Windows, usar system para chamar um programa para fechar uma janela e do seu próprio programa seria como mandar uma carta para alguém que está na sua frente dizendo pra ele mandar um recado para alguém que está do seu lado.

 

 

 

adicionado 25 minutos depois

image.png.3976bdf09347aef1e929dd8beeea78f8.png

 

Para ficar claro: se você escreve um programa para console é bem possível que você queira configurar a tal janela. Tirar as barras de scroll, controlar o tamanho, as cores e a fonte, a página de código... É o simples.

 

 

Mas se você quer abrir janelas e usar controles, tipo os common controls lá, botões, janelas, labels e tal, apenas no LINK não deve usar o /SUBSYSTEM:CONSOLE mas sim o WINDOWS. Ou assim configurar o projeto no IDE.

  • Curtir 1
  • Obrigado 1
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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!