2012-08-02 17 views
5

मैंने सी भाषा में स्टीम टेबल समीकरण सॉल्वर विकसित किया है ... लेकिन ब्लैक स्क्रीन कंसोल में मान इनपुट करना उबाऊ है।सरल सी प्रोग्रामिंग gui

तो मैं सख्ती से, सी

में सरल GUI बनाने के लिए

मैं हैलो दुनिया कोड के लिए खोज करना चाहता था सब बहुत लंबे थे। लेकिन यह एकमात्र ऐसा था जिसे मैं समझ गया था।

#include <windows.h> 

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

सी के लिए एक GUI बिल्डर का उपयोग करके, मैं इस कोड, अब मैं TEXTBOX1 और TextBox2 से 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

वास्तव में सवाल क्या है? –

+0

COMMANDBUTTON1 पर क्लिक करने और TEXTBOX3 में आउटपुट प्रदर्शित करने के लिए TEXTBOX1 और TEXTBOX2 से मूल्यों को स्कैन कैसे करें? – Santosh

+0

आप जिस जीयूआई निर्माता का उपयोग कर रहे हैं वह क्या है? –

उत्तर

7

आप सी का उपयोग कर Win32 एपीआई प्रोग्रामिंग पर एक अच्छी किताब की तलाश में हैं। और आप भाग्यशाली हैं, एक महान किताब है जो हर कोई इसे सीखने के लिए उपयोग करती है। यह चार्ल्स पेटज़ोल्ड द्वारा लिखा गया है, और इसे (उपयुक्त पर्याप्त) Programming Windows कहा जाता है। आप 5 वें संस्करण चाहते हैं, जो सबसे हालिया संस्करण है जो Win32 प्रोग्रामिंग पर चर्चा करता है।

यदि आप "Win32 प्रोग्रामिंग" खोजते हैं तो ऑनलाइन उपलब्ध कई ट्यूटोरियल भी उपलब्ध हैं। हालांकि, उनमें से कई में कुछ त्रुटियां और गलतफहमीएं हैं (जैसे एएनएसआई और यूनिकोड तारों के बीच अंतर), और अच्छे लोग छोटे और अपूर्ण हैं। आप ऑनलाइन ट्यूटोरियल से एक गैर-मामूली प्रोग्राम लिखने के लिए जो कुछ भी जानना चाहते हैं उसे नहीं सीखेंगे, लेकिन आपको स्क्रीन पर वास्तव में कुछ आसान करने में सक्षम होना चाहिए। This one by theForger एक है जिसे मैंने कई बार अनुशंसित देखा है।

चेतावनी दी जानी चाहिए कि, जीयूआई कोड (विशेष रूप से इस तरह के निम्न स्तर पर) लिखना एक कंसोल प्रोग्राम के लिए स्क्रीन पर टेक्स्ट प्राप्त करने की तुलना में लॉट अधिक वर्बोज़ होता है। आप कोड का एक गुच्छा लिखने जा रहे हैं जिसका उपयोग केवल जीयूआई काम करने के लिए किया जाता है और आपके प्रोग्राम के तर्क से कोई लेना-देना नहीं है। यदि आप पहले सी भाषा सीखते हैं तो यह बहुत आसान है, और यह सरल कंसोल-प्रकार, टेक्स्ट-केवल प्रोग्राम के माध्यम से किया जाता है।


अपने विशिष्ट प्रश्न के लिए के रूप में, आप स्क्रीन पर तीन पाठ बॉक्स नियंत्रण बना लिया है hwnd_TextBoxX, जहां X 1 और 3 आप शायद पहले से ही जानते हैं के बीच एक संख्या है नाम है, hwnd एक करने के लिए एक संभाल इंगित करता है विंडो (WND), और इसलिए वे चर टेक्स्टबॉक्स विंडो पर हैंडल करते हैं।

Win32 API GetWindowText function प्रदान करता है, जिसे आप किसी विशेष विंडो से टेक्स्ट पुनर्प्राप्त करने के लिए उपयोग कर सकते हैं। आप इसे वांछित विंडो (hWnd), एक वर्ण बफर के लिए एक सूचक, और आपके बफर की लंबाई को इंगित करने वाला एक पूर्णांक मान को एक हैंडल पास करते हैं। पहले से ही, सी भाषा की बदसूरत प्रकृति बढ़ती है-आपको यह समझना होगा कि फ़ंक्शन को सही तरीके से कॉल करने के लिए तारों में तार कैसे काम करते हैं।

एक बार जब आप स्ट्रिंग बक्सें में से एक में दिखाया गया है लिया गया है, तो आप यह समान 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); 

एक बटन पर क्लिक करने पर में ऐसा करने के लिए, आप "घटनाओं" -window संदेशों के Win32 बराबर के बारे में जानने की आवश्यकता होगी। बाल नियंत्रण, जैसे कि बटन नियंत्रण, कुछ संभावित रूप से दिलचस्प होने पर अधिसूचना संदेश भेजते हैं (जैसे, एक संवाद), जैसे कि उपयोगकर्ता उन पर क्लिक करता है।

विशेष रूप से, एक बटन नियंत्रण के माध्यम से अपने माता-पिता को BN_CLICKED notification भेजता है। अपनी मुख्य विंडो की विंडो प्रक्रिया (WndProc) विधि में WM_COMMAND संदेश को संभालने से, आप जांच सकते हैं कि lParam पैरामीटर आपके बटन नियंत्रण की विंडो हैंडल (hWnd) से मेल खाता है और HIWORD(wParam)BN_CLICKED अधिसूचना कोड से मेल खाता है।

आपको निश्चित रूप से एक अच्छी किताब की आवश्यकता है जिसमें उस के लिए चरण-दर-चरण नमूना कोड शामिल है। स्टैक ओवरफ़्लो उत्तर में पूरी तरह से व्याख्या करना थोड़ा मुश्किल है।

+0

लेखन के लिए धन्यवाद ... हालांकि मैंने मुख्य "कार्यात्मक कोड" विकसित किया जो .csv फ़ाइल से भाप तालिका मानों को पढ़ता है, मुझे नहीं पता था जीयूआई कोड ... और हाँ ... मैंने पुस्तक का आदेश भी दिया है। – Santosh

1

केवल Win32 API का उपयोग करके एक जीयूआई एप्लीकेशन लिखना कुछ मजेदार है, लेकिन यह भी कठिन है। किसी प्रकार के ढांचे का उपयोग करना बहुत आसान है। इसका मतलब यह नहीं है कि यह असंभव है। यहां एक त्वरित अवलोकन है कि आप इसे कैसे करते हैं।

सबसे पहले, आप main दिनचर्या को WinMain के साथ प्रतिस्थापित करते हैं। यह दिनचर्या आपके आवेदन का नया प्रवेश बिंदु है। यह विंडोज़ बनाने और एक संदेश प्रेषण पाश स्थापित करने के लिए जिम्मेदार होगा।

ध्यान दें कि मैंने "विंडोज़" और सिर्फ एक "खिड़की" नहीं कहा है। WinAPI में, "फ़ॉर्म" पर दिखाई देने वाले प्रत्येक "नियंत्रण" एक "विंडो" है। "फॉर्म" स्वयं एक खिड़की भी है। प्रत्येक विंडो में एक विंडो हैंडल (HWND) है। आप CreateWindow का उपयोग कर एक एप्लिकेशन विंडो बना सकते हैं। यह आपको एक विंडो हैंडल देता है जिसे आप CreateChildWindows फ़ंक्शन पर भेज सकते हैं जो आपके लिए जीयूआई बिल्डर बनाया गया है। यह एप्लिकेशन विंडो में बाल विंडो (नियंत्रण) जोड़ देगा।

अब आपको इन सभी विंडोज़ को प्रोग्राम करने की आवश्यकता है। आप संदेश संसाधित करके ऐसा करते हैं। जब आप अपनी एप्लिकेशन विंडो बनाते हैं, तो आपको विंडो प्रक्रिया की आपूर्ति करने की आवश्यकता होती है। यह प्रक्रिया संदेशों के जवाब देने के बाद प्रतिक्रिया देगी। उदाहरण के लिए, एक बटन WM_COMMAND संदेश में परिणाम क्लिक करता है जिसे आपको संभालना होगा। आखिरी बात WinMain एक संदेश प्रसंस्करण लूप शुरू करता है जो किसी भी आने वाले संदेश के लिए बार-बार आपके WndProc पर कॉल करता है।

एक बार जब आप दूसरे उत्तर में जुड़े ट्यूटोरियल के माध्यम से काम करते हैं तो यह सब समझने लगेगा। तो आप शायद इससे थक जाएंगे और एक जीयूआई टूलकिट उठाएंगे :)

+0

जीयूआई टूलकिट (कृपया मुझे कुछ नाम या लिंक दें)? मैंने जीयूआई बिल्डर का इस्तेमाल किया और यह कोड ऑटो जेनरेट किया गया था। लेकिन मैं सोच रहा था कि जीयूआई कोड को मेरे द्वारा लिखे गए कार्यात्मक कोड के साथ कैसे जोड़ा जाए। – Santosh

+0

मैं जीटीके + जैसे कुछ के बारे में सोच रहा था, जो उच्च स्तर की जीयूआई टूलकिट है। क्रॉस-प्लेटफ़ॉर्म होने का भी लाभ है, जबकि WinAPI आपको विंडोज़ से जोड़ देगा। –

+0

दुर्भाग्यवश, जीटीके + आपको विंडोज अनुप्रयोगों को देखने के लिए भयानक भयानक बनाने के लिए तैयार करेगा। :-) –