Ir ao conteúdo
  • Cadastre-se
s4lezardv1A

C RESOLVIDO Redimensionar o prompt sem usar funcao SYSTEM

Recommended Posts

Boa noite pessoal. Estou com um problema de conflito. Estou usando uma função para pegar o estado do mouse, e junto com ela estou usando uma função system para mudar o tamanho da janela do prompt . Não quero maximizar quero colocar 120x40, entao uso a função:

 system("MODE con cols=119 lines=40 ");

Mas reparei que quando uso ela, o codigo para pegar o estado do mouse nao funciona. So funciona sem, Tem alguma outra função para mudar o tamanho da tela do prompt sem essa system?

  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@s4lezardv1A Olá!

Se o que você quer é outra forma para redimensionar a Janela do console no Windows, aqui vai:

BOOL console_windows_redimensione(int y, int x)
{
    HANDLE console= GetStdHandle(STD_OUTPUT_HANDLE);
    SMALL_RECT windows= { 0, 0, (y - 1), (x - 1) };
    COORD screen= { y, x };
    
    BOOL acesso= SetConsoleScreenBufferSize(console, screen);
    BOOL retorn= SetConsoleWindowInfo(console, acesso, &windows);
    return retorn;
}

*Importe a biblioteca windows.h

 

UPDATE: Não garante que será compatível com as API's que está usando para controle do mouse.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado Ansic: Tinha achado essa daqui e resolvi testar: 

 void SetWindow(int Width, int Height)
{
    _COORD coord;
    coord.X = Width;
    coord.Y = Height;

    _SMALL_RECT Rect;
    Rect.Top = 0;
    Rect.Left = 0;
    Rect.Bottom = Height - 1;
    Rect.Right = Width - 1;

    HANDLE Handle = GetStdHandle(STD_OUTPUT_HANDLE);      // Get Handle
    SetConsoleScreenBufferSize(Handle, coord);            // Set Buffer Size
    SetConsoleWindowInfo(Handle, TRUE, &Rect);            // Set Window Size
}

Deu certinho. Estava batendo a cabeça. Agora estou com outra duvida. Estou usando uma api que tem uma função desse tipo:

( ir_Evento->Event.MouseEvent.dwEventFlags == DOUBLE_CLICK )

Com ela eu faço uma condição casso eu pressiono duas vezes qualquer um dos dois botões do mouse. Sabe dizer como posso que ele prossiga somente caso eu apertar um botão do mouse, ou mais alem, se caso eu apertar somente um botão do lado esquerdo do mouse?

 

ATUALIZADO:

 

Consegui resolver Ansic, veja se o que eu fiz foi o certo. Li que quando o valor para uma variavel sobre o estado do mouse, é 0 significa que ela esta pressionada. Na definição de double click estava 2, criei #define SINGLE_CLICK 0 ,troquei a variavel de lugar e deu certo. Foi o mais correto ou ja tinha algum modo para fazer isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, pois não há macros ou outras formas de representacao desse flag dentro da biblioteca windows. Fique atento porque que esse evento do mouse pode ser disparado tanto pelo botão direito quanto pelo esquerdo, para diferenciar verifique o status em dwButtonState

Compartilhar este post


Link para o post
Compartilhar em outros sites
4 horas atrás, AnsiC disse:

Sim, pois não há macros ou outras formas de representacao desse flag dentro da biblioteca windows. Fique atento porque que esse evento do mouse pode ser disparado tanto pelo botão direito quanto pelo esquerdo, para diferenciar verifique o status em dwButtonState

sim, isso que eu ia te perguntar. Sou bem iniciante em linguagem de programação, comecei com visualg semestre passado e agora estou em c, entao ainda estou perdido. Esse status em dwbuttonstate você encontra onde? aqui nao achei, o q achei foi:

typedef struct _MOUSE_EVENT_RECORD {
	COORD dwMousePosition;
	DWORD dwButtonState;
	DWORD dwControlKeyState;
	DWORD dwEventFlags;

onde acho ele e o que devo colocar la?

Compartilhar este post


Link para o post
Compartilhar em outros sites

É o primeiro DWORD da estrutura.

4 horas atrás, AnsiC disse:

dwButtonState

6 minutos atrás, s4lezardv1A disse:

dwButtonState

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
3 minutos atrás, AnsiC disse:

É o primeiro DWORD da estrutura.

 

Ansic, desculpe a ignorância mesmo, é uma area nova pra mim, estou perdido. No corpo do meu programa esta:


DWORD dw_func;
BOOL bl_func;
INPUT_RECORD ir_func;

e na blblioteca wincon.h so achei esse dwbuttonstate que te mostrei anteriormente, alem disso achei uma constante chamada FROM_LEFT_1ST_BUTTON_PRESSED , mas ela nao funciona, quando uso ela assim que passo com o mouse, ja é iniciado a condição.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Coloque em um post a instrução de controle, por exemplo aqui estou com esse teste que executa como esperado. Quando pressiono o botão esquerdo mouse é impresso 1 no prompt:

/*  Principal função de um programa escrito em c */
int main(void)
{
    HANDLE console= GetStdHandle(STD_INPUT_HANDLE);
    DWORD numero_de_eventos_lidos;
    INPUT_RECORD eventos;
    
    SetConsoleMode(console, ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT  | 
                                                  ENABLE_EXTENDED_FLAGS);
                                                  
    ReadConsoleInput(console, &eventos, 1, &numero_de_eventos_lidos);
    while (true){
        if (MOUSE_EVENT == eventos.EventType
                && eventos.Event.MouseEvent.dwButtonState
                == FROM_LEFT_1ST_BUTTON_PRESSED){
            printf("%d", eventos.Event.MouseEvent.dwButtonState);
        }
        ReadConsoleInput(console, &eventos, 1, &numero_de_eventos_lidos);
    }
    return 0;
} 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
8 horas atrás, AnsiC disse:

Coloque em um post a instrução de controle, por exemplo aqui estou com esse teste que executa como esperado. Quando pressiono o botão esquerdo mouse é impresso 1 no prompt:


/*  Principal função de um programa escrito em c */
int main(void)
{
    HANDLE console= GetStdHandle(STD_INPUT_HANDLE);
    DWORD numero_de_eventos_lidos;
    INPUT_RECORD eventos;
    
    SetConsoleMode(console, ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT  | 
                                                  ENABLE_EXTENDED_FLAGS);
                                                  
    ReadConsoleInput(console, &eventos, 1, &numero_de_eventos_lidos);
    while (true){
        if (MOUSE_EVENT == eventos.EventType
                && eventos.Event.MouseEvent.dwButtonState
                == FROM_LEFT_1ST_BUTTON_PRESSED){
            printf("%d", eventos.Event.MouseEvent.dwButtonState);
        }
        ReadConsoleInput(console, &eventos, 1, &numero_de_eventos_lidos);
    }
    return 0;
} 

 

Consegui usando seu codigo,mudei conforme o que estava no meu:

 if (MOUSE_EVENT == ir_func.EventType && ir_func.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)

ele estava assim antes:

 

if ( ir_Evento->Event.MouseEvent.dwEventFlags == SINGLE_CLICK )

ATUALIZADO:

adicionado 33 minutos depois

Ansic, estou tendo um outro conflito, por exemplo , em uma tela menu eu coloco uma condição que se eu clicar na posição  = 48,50, eu vou pra função compra();, em outra tela, por exemplo venda, se eu clicar na posição = 48,50, ou eu vou para a função ainda da compra, ou entao fica bugado o cursor. Eu coloquei uma variavel pra contar em que tela estou pra nao dar esse conflito, mas parece q ta dando ainda assim, mas a variavel confere q estou na tela certa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu não sei do que você está falando quando diz que troca de telas, como assim? Se por acaso as coordenadas da posição do mouse em determinado momento e área descreve a superfície de um botão então o evento vai ser disparado sempre que o mouse estive sobre essa superfície independente do que esteja impresso lá, porque o stdoutput é mesmo, ou seja, a superfície de contato do mouse e geograficamente sempre a mesma.

Compartilhar este post


Link para o post
Compartilhar em outros sites
10 horas atrás, AnsiC disse:

Eu não sei do que você está falando quando diz que troca de telas, como assim? Se por acaso as coordenadas da posição do mouse em determinado momento e área descreve a superfície de um botão então o evento vai ser disparado sempre que o mouse estive sobre essa superfície independente do que esteja impresso lá, porque o stdoutput é mesmo, ou seja, a superfície de contato do mouse e geograficamente sempre a mesma.

 

Eu estou na função MENU, e na posição 50x40 tem um evento que vou pra função COMPRA.

 

Na função CONTATO na mesma posição 50x40 tem um outro tipo de evento que vai para função INICIAL.

 

Para não ocorrer conflito quando eu clicar no mesmo ponto , eu usei uma variavel que recebe 1,2,3,etc.. e dependendo da tela que eu estou  a variavel muda, entao na função MENU fica por exemplo :  if( aux==1 && pos(x,y)==50,40) {evento COMPRA}, e na função CONTATO fica:  if( aux==2 && pos(x,y)==50,40)(evento INICIAL). Para as outras funções esta dando certo, só para essas duas funções que ta dando conflito. Por enquanto eu mudei a posição do botão de uma das funções para contornar esse problema.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×