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.