2011-07-25 6 views
13

सादे सी का उपयोग करते हुए, विंडोज के तहत कंसोल विंडो में ymax और xmax को कैसे जांचें?खिड़कियों के लिए सी में टर्मिनल आकार प्राप्त करना?

#include <stdio.h> 
#include <sys/ioctl.h> 
int main (void) 
{ 
    struct winsize max; 
    ioctl(0, TIOCGWINSZ , &max); 
    printf ("lines %d\n", max.ws_row); 
    printf ("columns %d\n", max.ws_col); 
} 

अब मुझे आश्चर्य है कि कैसे मैं खिड़कियों के लिए एक ही कर सकते हैं:

लिनक्स के लिए कोड के इस टुकड़े नहीं है। मैंने winioctl.h की कोशिश की लेकिन यह struct winsize और न ही किसी अन्य नाम को परिभाषित नहीं करता है।

कोई सुझाव? धन्यवाद।

पीएस। लिनक्स में आप getenv("LINES"); का उपयोग कर कंसोल आकार भी पा सकते हैं। खिड़कियों के नीचे एक समान चर है?

पीपीएस। साथ ही, हमेशा ncurses.h होता है, जो मुझे लगता है कि दोनों प्रणालियों का काम है, लेकिन मैं इसे अन्य पुस्तकालयों के साथ संघर्ष के कारण टालना चाहता हूं।

पीपीपीएस। इस प्रश्न पर Getting terminal width in C? में बहुत सारी युक्तियां हैं, इसलिए इसे दोहराने की कोई आवश्यकता नहीं है।

उत्तर

3

(आंशिक जवाब)

इस कोड:

CONSOLE_SCREEN_BUFFER_INFO csbi; 
int ret; 
ret = GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&csbi); 
if(ret) 
{ 
    printf("Console Buffer Width: %d\n", csbi.dwSize.X); 
    printf("Console Buffer Height: %d\n", csbi.dwSize.Y); 
} 

बफर के आकार देता है। एकमात्र समस्या यह है कि dwSize.Y वास्तव में स्क्रीन का आकार नहीं है (25 लाइनों के बजाय यहां 300)। लेकिन dwSize.X कॉलम की संख्या से मेल खाता है। काम करने के लिए केवल windows.h की आवश्यकता है।

21

यह कंसोल के आकार प्रिंट, नहीं बफर:

#include <windows.h> 

int main(int argc, char *argv[]) { 
    CONSOLE_SCREEN_BUFFER_INFO csbi; 
    int columns, rows; 

    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi); 
    columns = csbi.srWindow.Right - csbi.srWindow.Left + 1; 
    rows = csbi.srWindow.Bottom - csbi.srWindow.Top + 1; 

    printf("columns: %d\n", columns); 
    printf("rows: %d\n", rows); 
    return 0; 
} 

इस कोड काम करता है क्योंकि srWindow "प्रदर्शन विंडो के ऊपरी-बाएं और नीचे दाएं कोने में सांत्वना स्क्रीन बफर निर्देशांक शामिल है" , और MS12N के अनुसार SMALL_RECT संरचना "स्क्रीन-बफर वर्ण कक्षों की पंक्तियों और स्तंभों को निर्दिष्ट करें"। मैंने कंसोल विंडो के आकार को प्राप्त करने के लिए समानांतर पक्षों को घटा दिया। चूंकि मुझे वास्तविक मूल्य से 1 कम मिला, इसलिए मैंने एक जोड़ा।

+0

मैं परीक्षण करने के लिए समय पर छोटा हूं, लेकिन ऐसा लगता है कि यह सवाल का सही जवाब है। क्या आप इस उत्तर के बीच के अंतर को इंगित करेंगे और वर्तमान में स्वीकार किए गए एक को बफर आकार दिखाता है? धन्यवाद! –

+0

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

संबंधित मुद्दे