2012-08-02 22 views
5

Desarrollé el solucionador de ecuaciones de tabla de vapor en lenguaje C ... pero la entrada de valores en la consola de pantalla negra es aburrida.simple c programación gui

Así que estrictamente quería crear GUI simple en C.

Busqué hola códigos mundo, todos eran bastante larga. Pero este fue el único que entendí.

#include <windows.h> 

int main() 
{ 
MessageBoxA(NULL, "Hello World!", "Hello", MB_OK); 
} 

Mediante el uso de un constructor de interfaz gráfica de usuario para C, tengo este código, ahora estaba pensando en cómo valores de escaneo desde textBox1 y TextBox2 en Al hacer clic de CommandButton1 y mostrar el resultado en TextBox3?

#define WIN32_LEAN_AND_MEAN 

#include <windows.h> 
#include <windowsx.h> 
#include <commctrl.h> 
#include "hello.auto.h" 


HWND hwnd_Label1, hwnd_Label2, hwnd_TextBox1, hwnd_TextBox2, hwnd_CommandButton1, 
hwnd_TextBox3; 

HFONT MSSansSerif_8pt; 



void CreateChildWindows(HWND hwndMainWindow, HINSTANCE hInstance) 
{ 
InitCommonControls(); 

MSSansSerif_8pt = CreateFont(-11,0,0,0,FW_NORMAL,0,0,0,0,0,0,0,0,"MS Sans Serif"); 

hwnd_Label1 = CreateWindowEx(0, "Static", "Pressure", 
    WS_CHILD | WS_VISIBLE, 
    11, 55, 95, 38, hwndMainWindow, 
    (HMENU)Label1, hInstance, NULL); 

SetWindowFont(hwnd_Label1, MSSansSerif_8pt, TRUE); 

hwnd_Label2 = CreateWindowEx(0, "Static", "Temperature", 
    WS_CHILD | WS_VISIBLE, 
    11, 110, 95, 38, hwndMainWindow, 
    (HMENU)Label2, hInstance, NULL); 

SetWindowFont(hwnd_Label2, MSSansSerif_8pt, TRUE); 

hwnd_TextBox1 = CreateWindowEx(WS_EX_CLIENTEDGE, "Edit" , NULL, 
    WS_CHILD | ES_WANTRETURN | WS_VISIBLE, 
    187, 55, 83, 35, hwndMainWindow, 
    (HMENU)TextBox1, hInstance, NULL); 

SetWindowFont(hwnd_TextBox1, MSSansSerif_8pt, TRUE); 

hwnd_TextBox2 = CreateWindowEx(WS_EX_CLIENTEDGE, "Edit" , NULL, 
    WS_CHILD | ES_WANTRETURN | WS_VISIBLE, 
    187, 99, 83, 35, hwndMainWindow, 
    (HMENU)TextBox2, hInstance, NULL); 

SetWindowFont(hwnd_TextBox2, MSSansSerif_8pt, TRUE); 

hwnd_CommandButton1 = CreateWindowEx(0, "Button", "CommandButton1", 
    WS_CHILD | BS_MULTILINE | BS_PUSHBUTTON | WS_VISIBLE, 
    308, 77, 117, 52, hwndMainWindow, 
    (HMENU)CommandButton1, hInstance, NULL); 


SetWindowFont(hwnd_CommandButton1, MSSansSerif_8pt, TRUE); 

hwnd_TextBox3 = CreateWindowEx(WS_EX_CLIENTEDGE, "Edit" , NULL, 
    WS_CHILD | ES_WANTRETURN | WS_VISIBLE, 
    66, 220, 385, 35, hwndMainWindow, 
    (HMENU)TextBox3, hInstance, NULL); 

SetWindowFont(hwnd_TextBox3, MSSansSerif_8pt, TRUE); 

return; 
} 



HWND GetItem(int nIDDlgItem) 
{ 
switch(nIDDlgItem) 
{ 
    case -1: 
     return GetParent(hwnd_Label1); 
    case Label1: 
     return hwnd_Label1; 
    case Label2: 
     return hwnd_Label2; 
    case TextBox1: 
     return hwnd_TextBox1; 
    case TextBox2: 
     return hwnd_TextBox2; 
    case CommandButton1: 
     return hwnd_CommandButton1; 
    case TextBox3: 
     return hwnd_TextBox3; 
    default: return NULL; 
} 
} 



void Form_Unload(HWND hMainWnd) 
{ 
DeleteFont(MSSansSerif_8pt); 
return; 
} 

Lo intenté muchas veces, pero fallé. Incluso si ustedes me dan enlaces de buenos sitios, entonces estaré agradecido.

+0

¿En realidad cuál es la pregunta? –

+0

cómo escanear valores de TEXTBOX1 y TEXTBOX2 al hacer clic en COMMANDBUTTON1 y visualizar la salida en TEXTBOX3? – Santosh

+0

¿cuál es el constructor de GUI que está usando? –

Respuesta

7

Está buscando un buen libro sobre la programación de Win32 API con C. Y tiene suerte, hay un gran libro que casi todo el mundo usa para aprenderlo. Está escrito por Charles Petzold, y se llama (bastante bien) Programming Windows. Desea la quinta edición, que es la versión más reciente que analiza la programación de Win32.

También hay varios tutoriales disponibles en línea si busca "Programación Win32". Sin embargo, algunos de ellos contienen algunos errores y malentendidos (como la diferencia entre cadenas ANSI y Unicode), y los buenos son bastante cortos e incompletos. No aprenderá todo lo que necesita saber para escribir un programa no trivial a partir de tutoriales en línea, pero debería poder obtener algo realmente simple en la pantalla. This one by theForger es uno que he visto recomendado muchas veces.

Se advirtió, sin embargo, que la escritura de código GUI (especialmente en un nivel tan bajo) tiende a ser mucho más prolija de simplemente obtener el texto en la pantalla de un programa de consola. Vas a terminar escribiendo un montón de código que se usa solo para hacer que la GUI funcione y no tiene nada que ver con la lógica de tu programa. Es mucho más fácil si primero aprende el lenguaje C, y eso se hace mejor a través de programas sencillos de tipo consola y texto.


cuanto a su pregunta específica, ha creado tres controles de cuadro de texto en la pantalla, llamada hwnd_TextBoxX, donde X es un número entre 1 y 3. Como probablemente ya saben, hwnd indica un mango a una window (wnd), y esas variables mantienen los controles en las ventanas del cuadro de texto.

La API de Win32 proporciona un GetWindowText function, que puede usar para recuperar el texto de una ventana en particular. Pasas un controlador a la ventana deseada (hWnd), un puntero a un búfer de caracteres y un valor entero que indica la longitud de tu búfer. Ya surge la naturaleza fea del lenguaje C: debe comprender cómo funcionan las cadenas en C para llamar a la función correctamente.

Una vez que haya recuperado la cadena que se muestra en uno de los cuadros de texto, para poder visualizarlo en otra ventana de texto utilizando el SetWindowText function similares, que tiene sólo el identificador de ventana (hWnd) y un puntero al buffer que contiene la cadena.

El código sería algo como esto:

// Get the text displayed in textbox 1 
TCHAR szBuffer[100]; 
GetWindowText(hwnd_TextBox1, szBuffer, 100); 

// Display that text in textbox 3 
SetWindowText(hwnd_TextBox3, szBuffer); 

Para hacer esto en respuesta a un clic de un botón, usted necesita aprender sobre el equivalente de Win32 de "eventos" mensajes -window. Las ventanas secundarias, como los controles de botones, envían mensajes de notificación a su ventana principal (es decir, un cuadro de diálogo) cuando sucede algo potencialmente interesante, como que el usuario haga clic en ellos.

En particular, un control de botón envía a su padre un BN_CLICKED notification a través del WM_COMMAND message. Al manejar el mensaje WM_COMMAND en procedimiento de ventana de la ventana principal (WndProc) método, se puede comprobar que el parámetro lParam coincide con identificador de ventana de su botón de control (hWnd) y que el HIWORD(wParam) coincide con el código BN_CLICKED notificación.

Definitivamente necesita un buen libro que contenga código de ejemplo paso a paso para ese. Es un poco difícil de explicar a fondo en una respuesta de desbordamiento de pila.

+0

gracias por escribir ... aunque desarrollé el principal "código funcional" que leía los valores de la tabla de vapor del archivo .csv, no sabía el código GUI ... y yah ... también he ordenado el libro. – Santosh

1

Escribir una aplicación GUI utilizando solo la API de Win32 es algo divertido, pero también tedioso. Es mucho más fácil utilizar un marco de algún tipo. Esto no significa que sea imposible. Aquí hay una descripción general rápida de cómo lo hace.

Primero, reemplace la rutina main con WinMain. Esta rutina es el nuevo punto de entrada de su aplicación. Será responsable de crear las ventanas y configurar un bucle de envío de mensajes.

Observe que dije "ventanas" y no solo una "ventana". En WinAPI, cada "control" que ve en el "formulario" es una "ventana". La "forma" en sí misma también es una ventana. Cada ventana tiene un identificador de ventana (HWND). Puede crear una ventana de aplicación usando CreateWindow. Esto le proporciona un identificador de ventana que puede pasar a la función CreateChildWindows que el constructor de la GUI creó para usted. Esto agregará ventanas secundarias (los controles) a la ventana de la aplicación.

Ahora necesita programar todas estas ventanas. Lo haces procesando mensajes. Cuando crea la ventana de la aplicación, debe proporcionar un procedimiento de ventana . Este procedimiento responderá a los mensajes a medida que ingresen. Por ejemplo, un clic de botón da como resultado un mensaje WM_COMMAND que deberá manejar. Lo último que hace WinMain es iniciar un ciclo de procesamiento de mensajes que llama repetidamente a su WndProc para cualquier mensaje entrante.

Todo esto comenzará a tener sentido una vez que trabaje con el tutorial vinculado en la otra respuesta. Entonces probablemente te cansarás de esto y recogerás un GUI toolkit :)

+0

GUI toolkit (por favor deme algunos nombres o enlaces)? Usé el constructor de GUI y este código fue generado automáticamente. Pero estaba pensando en cómo combinar el código GUI con el código funcional que escribí. – Santosh

+0

Estaba pensando en algo como GTK +, que es un juego de herramientas GUI de nivel superior. También tiene la ventaja de ser multiplataforma, mientras que WinAPI lo vinculará a Windows. –

+0

Desafortunadamente, GTK + lo vinculará a la creación de terribles aplicaciones de Windows. :-) –

Cuestiones relacionadas