2012-08-02 7 views
5

Ich habe den Dampftabellen-Gleichungslöser in der C-Sprache entwickelt ... aber die Eingabe der Werte in die schwarze Bildschirmkonsole ist langweilig.simple c programming gui

Also wollte ich streng einfachen GUI in C.

ich für hallo Welt Codes gesucht schaffen, die alle ziemlich lang waren. Aber das war die einzige, die ich verstanden habe. die Ausgabe in TextBox3

#include <windows.h> 

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

Durch einen GUI-Builder für C verwenden, ich habe diesen Code, jetzt dachte ich, wie man Scan Werte von Textbox1 und TextBox2 auf Anklicken von CommandButton1 und Anzeige?

#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; 
} 

Ich habe viele Male versucht, aber gescheitert. Auch wenn Sie mir Links von guten Seiten geben, dann werde ich dankbar sein.

+0

eigentlich, was die Frage ist? –

+0

Wie scannt man Werte von TEXTBOX1 und TEXTBOX2 beim Klicken auf COMMANDBUTTON1 und zeigt die Ausgabe in TEXTBOX3 an? – Santosh

+0

Was ist der GUI-Builder, den Sie verwenden? –

Antwort

7

Sie suchen ein gutes Buch über Win32-API-Programmierung mit C. Und Sie haben Glück, es gibt ein tolles Buch, das so ziemlich jeder benutzt, um es zu lernen. Es ist von Charles Petzold geschrieben, und es heißt (passend) Programming Windows. Sie möchten die 5. Ausgabe, die die neueste Version ist, die Win32-Programmierung behandelt.

Es gibt auch verschiedene Tutorials online zur Verfügung, wenn Sie nach "Win32-Programmierung" suchen. Einige von ihnen enthalten jedoch einige Fehler und Missverständnisse (wie der Unterschied zwischen ANSI- und Unicode-Strings), und die guten sind eher kurz und unvollständig. Sie werden nicht alles lernen, was Sie wissen müssen, um ein nicht-triviales Programm aus Online-Tutorials zu schreiben, aber Sie sollten in der Lage sein, etwas wirklich einfaches auf dem Bildschirm zu bekommen. This one by theForger ist eine, die ich schon oft gesehen habe.

Seien Sie jedoch gewarnt, dass das Schreiben von GUI-Code (vor allem bei einem so niedrigen Niveau) tendenziell viel ausführlicher ist als einfach Text auf den Bildschirm für ein Konsolenprogramm zu bekommen. Sie werden am Ende einen Haufen Code schreiben, der nur dazu dient, die GUI zum Laufen zu bringen und nichts mit der Logik Ihres Programms zu tun hat. Es ist viel einfacher, wenn Sie zuerst die C-Sprache lernen, und das wird am besten durch einfache reine Text-Programme erledigt.


Was Ihre Frage, können Sie drei Textbox Steuerelemente auf dem Bildschirm erstellt haben, mit dem Namen hwnd_TextBoxX, wo X eine Zahl zwischen 1 und 3. Wie Sie wahrscheinlich bereits wissen, gibt hwnd einen Griff ein window (wnd), und so halten diese Variablen Griffe zu den Textfenster.

Die Win32-API bietet eine GetWindowText function, die Sie verwenden können, um den Text aus einem bestimmten Fenster abzurufen. Sie übergeben ein Handle an das gewünschte Fenster (hWnd), einen Zeiger auf einen Zeichenpuffer und einen ganzzahligen Wert, der die Länge Ihres Puffers angibt. Schon jetzt taucht die hässliche Natur der C-Sprache auf - Sie müssen verstehen, wie Strings in C funktionieren, um die Funktion korrekt aufzurufen.

Sobald Sie die Zeichenfolge in einem der Textfelder angezeigt abgerufen haben, können Sie es in einem anderen Textfenster angezeigt werden, die ähnlich SetWindowText function verwenden, die nur den Fenstergriff nimmt (hWnd) und einen Zeiger auf den Puffer, der die Zeichenfolge enthält.

Der Code würde wie folgt aussehen:

// 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); 

dies auf eine Schaltfläche, um einen Klick in Reaktion zu tun, müssen Sie über die Win32-Äquivalent von „Ereignissen“ -Fenster Meldungen lernen. Untergeordnete Fenster, wie Schaltflächensteuerelemente, senden Benachrichtigungsnachrichten an ihr übergeordnetes Fenster (d. H. Einen Dialog), wenn etwas potentiell Interessantes passiert, wie der Benutzer darauf klickt.

Insbesondere ein Button-Steuerelement sendet seine Eltern eine BN_CLICKED notification durch die WM_COMMAND message. Indem Sie die Nachricht WM_COMMAND in der Fensterprozedur des Hauptfensters (WndProc) bearbeiten, können Sie überprüfen, ob der lParam Parameter mit dem Fensterhandle Ihres Schaltflächensteuerelements übereinstimmt (hWnd) und dass der HIWORD(wParam) dem BN_CLICKED Benachrichtigungscode entspricht.

Sie brauchen auf jeden Fall ein gutes Buch, das Schritt-für-Schritt-Beispielcode für diesen enthält. Es ist etwas zu schwierig, dies in einer Stack Overflow-Antwort zu erklären.

+0

danke für das Schreiben ... obwohl ich den wichtigsten "Funktionscode" entwickelt, der die Steam-Tabelle Werte aus .csv-Datei gelesen habe, wusste ich nicht der GUI-Code ... und yah ... Ich habe auch das Buch bestellt. – Santosh

1

Schreiben einer GUI-Anwendung mit nur der Win32-API ist ein bisschen Spaß, aber auch langweilig. Es ist viel einfacher, ein Framework irgendeiner Art zu verwenden. Dies bedeutet jedoch nicht, dass es unmöglich ist. Hier ist ein kurzer Überblick, wie Sie es tun.

Zuerst ersetzen Sie die main Routine durch WinMain. Diese Routine ist der neue Einstiegspunkt Ihrer Anwendung. Es wird für das Erstellen der Fenster und das Einrichten einer Nachrichtenverteilungsschleife verantwortlich sein.

Beachten Sie, dass ich "Windows" und nicht nur ein "Fenster" sagte. In WinAPI ist jedes "Steuerelement", das Sie auf dem "Formular" sehen, ein "Fenster". Die "Form" selbst ist auch ein Fenster. Jedes Fenster hat einen Fenstergriff (HWND). Sie können ein Anwendungsfenster mit CreateWindow erstellen. Dadurch erhalten Sie eine Fensterkennung, die Sie an die CreateChildWindows-Funktion übergeben können, die der GUI-Builder für Sie erstellt hat. Dadurch werden untergeordnete Fenster (die Steuerelemente) zum Anwendungsfenster hinzugefügt.

Jetzt müssen Sie alle diese Fenster programmieren. Sie tun das, indem Sie Nachrichten verarbeiten. Wenn Sie Ihr Anwendungsfenster erstellen, müssen Sie eine Fensterprozedur bereitstellen. Diese Prozedur reagiert auf eingehende Nachrichten. Beispielsweise führt ein Klick auf die Schaltfläche zu einer Nachricht, die Sie behandeln müssen. Das letzte, was WinMain tut, ist eine Nachrichtenverarbeitungsschleife zu starten, die wiederholt Ihre WndProc für jede eingehende Nachricht aufruft.

Dies wird alles Sinn ergeben, sobald Sie das Tutorial in der anderen Antwort durcharbeiten. Dann werden Sie wahrscheinlich davon müde sein und ein GUI-Toolkit abholen :)

+0

GUI Toolkit (bitte geben Sie mir einige Namen oder Links)? Ich habe den GUI-Builder verwendet und dieser Code wurde automatisch generiert. Aber ich habe darüber nachgedacht, wie ich den GUI-Code mit dem Funktionscode, den ich geschrieben habe, kombinieren kann. – Santosh

+0

Ich habe über etwas wie GTK + nachgedacht, was ein GUI-Toolkit auf höherer Ebene ist. Es hat auch den Vorteil, plattformübergreifend zu sein, während WinAPI Sie an Windows bindet. –

+0

Leider wird GTK + Sie an die Erstellung von schrecklich aussehenden Windows-Anwendungen binden. :-) –