Interface gráfica em C

1. Interface gráfica em C

Fabricio de Medeiros
FabiC

(usa Ubuntu)

Enviado em 29/11/2015 - 23:19h

Andei pesquisando sobre interface gráficas em C, mas só encontrei para C++. Agora pouco encontrei a biblioteca Windows.h, fui pesquisar como usa-lá, sintaxe... Porém não encontrei nada. Gostaria de que quem conhecer falar um pouco mais sobre ou me mandar algum link que explique melhor ou de forma mais simples possível


  


2. Re: Interface gráfica em C

Paulo
paulo1205

(usa Ubuntu)

Enviado em 30/11/2015 - 06:50h

FabiC escreveu:

Andei pesquisando sobre interface gráficas em C, mas só encontrei para C++. Agora pouco encontrei a biblioteca Windows.h, fui pesquisar como usa-lá, sintaxe... Porém não encontrei nada. Gostaria de que quem conhecer falar um pouco mais sobre ou me mandar algum link que explique melhor ou de forma mais simples possível


Tecnicamente falando, "windows.h" não é uma biblioteca, mas tão-somente algo que o C chama de cabeçalhos (em Inglês, headers, por isso o sufixo “.h”). O cabeçalho contém declarações para que o compilador saiba como usar as funções, mas essas funções são implementadas em outros lugares -- geralmente em arquivos separados, que nem mesmo são usados pelo compilador, mas somente pelo linker ou na hora em que o programa for executado.

Linguagens orientadas a objeto são mais comumente usadas com interfaces gráficas porque elas normalmente oferecem formas convenientes de representar os elementos da GUI. É fácil constatar isso: numa linguagem orientada a objetos, como C++ ou Java, você pode usar o objeto como fonte primária de informação, e a partir deles invocar ações que lhes correspondam; numa linguagem procedural, como C ou Pascal, seu material primário são as funções, e os dados são elementos secundários, passados como parâmetros para essas funções. Tanto para pessoas como, de certa maneira, também para o compilador, é mais fácil ver se a operação faz sentido sobre aquele dado olhando primeiro para o dado.

Veja os exemplos abaixo, que compara tentativas de realizar tarefas grosseiramente análogas usando Qt (C++) e Win32 API (C).

// Qt4 (C++)
void f(QWindow *wnd, void *p){
if(wnd)
wnd->requestUpdate(); // OK!
if(v){
v->requestUpdate(); // Erro de compilação (tipo de *v desconhecido).
requestUpdate(v); // Erro de compilação (função não existe).
}
}


// Win32 (C)
void f(HWND hwnd, void *v){
if(hwnd){
PAINTSTRUCT ps;
HDC hdc=BeginPaint(hwnd, &ps); // OK
/* Mais um monte de coisa. */
EndPaint(hwnd, &ps); // OK
}
if(v){
PAINTSTRUCT ps;
HDC hdc=BeginPaint(v, &ps); // OK (?!)
/* Mais um monte de coisa. */
EndPaint(v, &ps); // OK (?!)
}
}


No segundo caso, o compilador não tem como detectar erro, porque um ponteiro para void é automaticamente convertido pelo compilador em ponteiro para qualquer outro tipo (aliás, dado que internamente HWND também é definido como ponteiro para void, o compilador não dá absolutamente nenhuma garantia sobre nenhuma invocação de BeginPaint() ou EndPaint()!).

Alguém pode tentar lhe dizer que GTK é uma biblioteca gráfica em C, mas que é mais fácil de usar do que a Win32 pura porque é orientada a objetos. É uma meia-verdade, mais até para mentira. Feita por fanáticos anti-C++, a forma de obter orientação a objetos em C é estender a linguagem com uma quantidade tão grande de macros e tipos não-nativos de uso obrigatório, além de incontáveis conversões explícitas de tipos de ponteiros, também elas obrigatórias, que o resultado, na prática, é uma linguagem diferente de C e muito mais difícil de usar do que C++.

Tão difícil, aliás, que, para que se pudessem escrever programas minimamente legíveis, criou-se, literalmente, uma linguagem nova, chamada Vala, que permite escrever código humanamente inteligível (parecido com que se teria feito diretamente em C++, Java ou C#, aliás), que depois é convertido para C+GObject+GTK, e então finalmente compilado para código nativo.


3. Re: Interface gráfica em C

Elder Marco
eldermarco

(usa Fedora)

Enviado em 30/11/2015 - 07:38h

Além da Qt, citada pelo colega acima, existe a Gtk, do projeto GNOME, que te permite criar interfaces gráficas também no Windows. Há uma farta documentação dessas duas bibliotecas em seus respectivos sites.


4. Re: Interface gráfica em C

Ricardo Fabiano Silva
madrugada

(usa Gentoo)

Enviado em 30/11/2015 - 12:20h

paulo1205 escreveu:

FabiC escreveu:

Andei pesquisando sobre interface gráficas em C, mas só encontrei para C++. Agora pouco encontrei a biblioteca Windows.h, fui pesquisar como usa-lá, sintaxe... Porém não encontrei nada. Gostaria de que quem conhecer falar um pouco mais sobre ou me mandar algum link que explique melhor ou de forma mais simples possível


Tecnicamente falando, "windows.h" não é uma biblioteca, mas tão-somente algo que o C chama de cabeçalhos (em Inglês, headers, por isso o sufixo “.h”). O cabeçalho contém declarações para que o compilador saiba como usar as funções, mas essas funções são implementadas em outros lugares -- geralmente em arquivos separados, que nem mesmo são usados pelo compilador, mas somente pelo linker ou na hora em que o programa for executado.

Linguagens orientadas a objeto são mais comumente usadas com interfaces gráficas porque elas normalmente oferecem formas convenientes de representar os elementos da GUI. É fácil constatar isso: numa linguagem orientada a objetos, como C++ ou Java, você pode usar o objeto como fonte primária de informação, e a partir deles invocar ações que lhes correspondam; numa linguagem procedural, como C ou Pascal, seu material primário são as funções, e os dados são elementos secundários, passados como parâmetros para essas funções. Tanto para pessoas como, de certa maneira, também para o compilador, é mais fácil ver se a operação faz sentido sobre aquele dado olhando primeiro para o dado.

Veja os exemplos abaixo, que compara tentativas de realizar tarefas grosseiramente análogas usando Qt (C++) e Win32 API (C).

// Qt4 (C++)
void f(QWindow *wnd, void *p){
if(wnd)
wnd->requestUpdate(); // OK!
if(v){
v->requestUpdate(); // Erro de compilação (tipo de *v desconhecido).
requestUpdate(v); // Erro de compilação (função não existe).
}
}


// Win32 (C)
void f(HWND hwnd, void *v){
if(hwnd){
PAINTSTRUCT ps;
HDC hdc=BeginPaint(hwnd, &ps); // OK
/* Mais um monte de coisa. */
EndPaint(hwnd, &ps); // OK
}
if(v){
PAINTSTRUCT ps;
HDC hdc=BeginPaint(v, &ps); // OK (?!)
/* Mais um monte de coisa. */
EndPaint(v, &ps); // OK (?!)
}
}


No segundo caso, o compilador não tem como detectar erro, porque um ponteiro para void é automaticamente convertido pelo compilador em ponteiro para qualquer outro tipo (aliás, dado que internamente HWND também é definido como ponteiro para void, o compilador não dá absolutamente nenhuma garantia sobre nenhuma invocação de BeginPaint() ou EndPaint()!).

Alguém pode tentar lhe dizer que GTK é uma biblioteca gráfica em C, mas que é mais fácil de usar do que a Win32 pura porque é orientada a objetos. É uma meia-verdade, mais até para mentira. Feita por fanáticos anti-C++, a forma de obter orientação a objetos em C é estender a linguagem com uma quantidade tão grande de macros e tipos não-nativos de uso obrigatório, além de incontáveis conversões explícitas de tipos de ponteiros, também elas obrigatórias, que o resultado, na prática, é uma linguagem diferente de C e muito mais difícil de usar do que C++.

Tão difícil, aliás, que, para que se pudessem escrever programas minimamente legíveis, criou-se, literalmente, uma linguagem nova, chamada Vala, que permite escrever código humanamente inteligível (parecido com que se teria feito diretamente em C++, Java ou C#, aliás), que depois é convertido para C+Gbject+GTK, e então finalmente compilado para código nativo.


Cara, que aula!!! Meus parabéns!








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts