2011-12-12 49 views
6

Tôi đang phát xung quanh với một số OpenGL, sử dụng SDL để xử lý cửa sổ/đầu vào, v.v. Hiện tại tôi đang hiển thị bất kỳ thông tin nào tôi muốn xem cho HUD. Vâng, điều này là nhận được quá cồng kềnh, và tôi đã tự hỏi nếu có một cách đơn giản để mở ra một cửa sổ giao diện điều khiển riêng biệt để báo cáo thông tin này cho tôi. Tôi vẫn còn mới để C + + vì vậy hãy dễ dàng trên tôi nếu điều này là một rõ ràng nhất.Gỡ lỗi C++/SDL với cửa sổ bảng điều khiển

Trả lời

4

Trong trình liên kết -> Hệ thống trong thuộc tính của dự án của bạn, hãy kiểm tra xem Hệ thống con là "Console (/ SUBSYSTEM: CONSOLE)". Điều đó gây ra một cửa sổ giao diện điều khiển riêng biệt được đưa lên khi bạn chạy chương trình của bạn. Nếu điểm nhập hiện tại của bạn không phải là main, thì bạn sẽ cần phải thay đổi điểm đó nếu bạn thực hiện điều này.

+0

Làm thế nào điều này áp dụng nếu tôi, ví dụ, mã ứng dụng của tôi trong một trình soạn thảo văn bản và sau đó tạo một tệp thực thi thông qua Cmake? – Speldosa

+0

@Speldosa: Bạn cần phải tìm tùy chọn CMake cho phép bạn chuyển cờ liên kết và sau đó chuyển "/ SUBSYSTEM: CONSOLE" đến trình liên kết. –

+0

set_target_properties (youapplication PROPERTIES LINK_FLAGS "/ SUBSYSTEM: CONSOLE") hoặc làm: set (CMAKE_EXE_LINKER_FLAGS "/ SUBSYSTEM: CONSOLE") làm cài đặt chung. –

0

Nếu bạn đang chạy từ một dòng lệnh và sử dụng printf(), bạn sẽ thấy thông báo đăng xuất vào cửa sổ đầu cuối của mình. Nếu không, bạn có thể đăng nhập vào một tệp và sử dụng tail -f trên các hộp kiểu * nix để xem đầu ra khi nó xuất hiện.

Bạn đang sử dụng môi trường nào? Hầu hết các IDE sẽ hiển thị đầu ra này trong các cửa sổ đầu ra gỡ lỗi của chúng.

+0

Làm cách nào để tạo cửa sổ bảng điều khiển này? Hiện tại tôi đang làm việc với một cửa sổ được tạo bởi SDL. – grep

+0

Bạn đang làm việc trên nền tảng nào? Nếu đó là cửa sổ, chỉ cần chạy cmd.exe và chạy chương trình của bạn từ đó, trên Mac sử dụng Terminal hoặc trên linux bất kỳ thiết bị đầu cuối của sự lựa chọn của bạn. –

6

Mã sau đây dành cho Windows. Tôi luôn nhận thấy có ích để giữ xung quanh khả năng để tạo ra một cửa sổ giao diện điều khiển theo yêu cầu:

int hConHandle; 
    intptr_t lStdHandle; 
    CONSOLE_SCREEN_BUFFER_INFO coninfo; 
    FILE *fp; 

    // allocate a console for this app 
    AllocConsole(); 

    // set the screen buffer to be big enough to let us scroll text 
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo); 
    coninfo.dwSize.Y = 500; 
    SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize); 

    // redirect unbuffered STDOUT to the console 
    lStdHandle = (intptr_t)GetStdHandle(STD_OUTPUT_HANDLE); 
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); 
    fp = _fdopen(hConHandle, "w"); 
    *stdout = *fp; 
    setvbuf(stdout, NULL, _IONBF, 0); 

    // redirect unbuffered STDIN to the console 
    lStdHandle = (intptr_t)GetStdHandle(STD_INPUT_HANDLE); 
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); 
    fp = _fdopen(hConHandle, "r"); 
    *stdin = *fp; 
    setvbuf(stdin, NULL, _IONBF, 0); 

    // redirect unbuffered STDERR to the console 
    lStdHandle = (intptr_t)GetStdHandle(STD_ERROR_HANDLE); 
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); 
    fp = _fdopen(hConHandle, "w"); 
    *stderr = *fp; 
    setvbuf(stderr, NULL, _IONBF, 0); 

    // make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog point to console as well 
    std::ios::sync_with_stdio(); 

    //Keep our window in focus 
    SetForegroundWindow(m_hWnd);      // Slightly Higher Priority 
    SetFocus(m_hWnd);         // Sets Keyboard Focus To The Window 

Mã này giả định rằng các HWND là trong một biến gọi là m_hWnd; nó được sao chép từ một trình bao bọc lớp mà tôi sử dụng. Tuy nhiên, cách bạn nhận được số HWND từ SDL tùy thuộc vào bạn.

Để giải phóng giao diện điều khiển, gọi đây là:

FreeConsole(); 

AllocConsoleFreeConsole là hàm API Win32.

Các vấn đề liên quan