2012-08-02 191 views
5

我用C語言開發了蒸汽表方程求解器......但是在黑屏控制檯中輸入值是無聊的。簡單的c編程gui

所以我就想嚴格在C

創建簡單的GUI

我搜索的hello world代碼,全部是相當長的。但這是我所瞭解的唯一一個。

#include <windows.h> 

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

通過使用針對c GUI Builder中,我得到這個代碼,現在我是從textBox1的1和TextBox上點擊CommandButton1的顯示在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; 
} 

我嘗試了很多次,但都失敗了。即使你們給了我很好的網站鏈接,那我也會很棒。

+0

究竟是什麼問題是? – 2012-08-02 03:38:47

+0

單擊COMMANDBUTTON1時如何從TEXTBOX1和TEXTBOX2掃描值並在TEXTBOX3中顯示輸出? – Santosh 2012-08-02 03:42:00

+0

什麼是您正在使用的GUI生成器? – 2012-08-02 03:45:53

回答

7

您正在尋找一本關於使用C語言編寫的Win32 API編程的好書。而且運氣好的話,幾乎每個人都用它來學習它。它由Charles Petzold編寫,它被稱爲(合適的)​​。您需要第5版,這是討論Win32編程的最新版本。

如果您搜索「Win32編程」,還可以在線獲得各種教程。然而,它們中的一些包含一些錯誤和誤解(如ANSI和Unicode字符串之間的差異),並且好的很短而且不完整。你不會從在線教程中學到一些你需要知道的非常重要的程序,但是你應該能夠在屏幕上獲得一些非常簡單的東西。 This one by theForger是我見過的很多次推薦的。

儘管如此,編寫GUI代碼(特別是在如此低的級別)往往會比簡單地在控制檯程序屏幕上顯示文本更加冗長。你最終會寫一堆只用於使GUI工作的代碼,並且與程序的邏輯無關。如果你首先學習C語言,這將變得更加容易,而這最好是通過簡單的控制檯類型的純文本程序完成。


關於你提到的具體問題,你已經創建了三個文本框控件在屏幕上,一個名爲hwnd_TextBoxX,其中X爲1和3。正如你可能已經知道的數字,hwnd表示句柄窗口(wnd),所以這些變量擁有文本框窗口的句柄。

Win32 API提供了一個GetWindowText function,您可以使用它來從特定窗口中檢索文本。您將它傳遞給所需窗口的句柄(hWnd),指向字符緩衝區的指針以及指示緩衝區長度的整數值。 C語言醜陋的本質已經出現 - 你必須瞭解C中的字符串是如何工作的,才能正確調用函數。

一旦檢索在文本框的一個上顯示的字符串中,可以在使用類似SetWindowText function另一文本框窗口,這隻需窗口句柄(hWnd)和一個指向包含該字符串的緩衝區中顯示它。

的代碼會是這個樣子:

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

爲了響應上點擊一個按鈕做到這一點,你需要了解的Win32相當於「事件」 -window消息。像用戶點擊它們一樣,子窗口就像按鈕控件一樣,在發生可能有趣的事情時向其父窗口(即對話框)發送通知消息。

特別是,按鈕控件通過WM_COMMAND message發送其父母BN_CLICKED notification。通過在主窗口的窗口過程(WndProc)中處理WM_COMMAND消息的方法,可以檢查lParam參數是否與您的按鈕控件的窗口句柄(hWnd)匹配,並且HIWORD(wParam)BN_CLICKED通知代碼相匹配。

你絕對需要一本好書,其中包含了一個分步示例代碼。在堆棧溢出的答案中進行徹底解釋有點太難。

+0

感謝您的寫作...雖然我開發了主要的「功能代碼」,從.csv文件讀取蒸汽表值,但我不知道GUI代碼...和耶...我也訂購了這本書。 – Santosh 2012-08-02 04:09:38

1

使用Win32 API編寫GUI應用程序有點有趣,但也很乏味。使用某種框架要容易得多。這並不意味着它是不可能的。以下簡要介紹一下你是如何做到的。

首先,您將main例程替換爲WinMain。這個例程是你的應用程序的新入口點。它將負責創建窗口並設置消息分發循環。

請注意,我說「窗戶」,而不只是一個「窗口」。在WinAPI中,您在「表單」中看到的每個「控件」都是一個「窗口」。 「形式」本身也是一個窗口。每個窗口都有一個窗口句柄(HWND)。您可以使用CreateWindow製作應用程序窗口。這會爲您提供一個窗口句柄,您可以將它傳遞給GUI構建器爲您製作的CreateChildWindows函數。這會將子窗口(控件)添加到應用程序窗口。

現在你需要編程所有這些窗口。你通過處理消息來做到這一點。當你創建你的應用程序窗口時,你需要提供一個窗口程序。此過程將在消息進入時對其進行響應。例如,按鈕單擊會導致必須處理的WM_COMMAND消息。 WinMain所做的最後一件事是啓動一個消息處理循環,該循環反覆調用您的WndProc以接收任何傳入消息。

這一切都將開始有意義,一旦你通過其他答案鏈接教程的工作。那麼你可能會厭倦這個,拿起一個GUI工具包:)

+0

GUI工具包(請給我一些名字或鏈接)?我使用了GUI構建器,並且此代碼是自動生成的。但我正在考慮如何將GUI代碼與我編寫的功能代碼結合起來。 – Santosh 2012-08-02 04:12:20

+0

我正在考慮像GTK +這樣的更高級別的GUI工具包。它還具有跨平臺的優勢,而WinAPI將使您與Windows結合。 – 2012-08-02 04:15:02

+0

不幸的是,GTK +會讓你創建一個看起來很糟糕的Windows應用程序。 :-) – 2012-08-02 04:24:57