2016-10-26 7 views
1
#include <iostream> 
#include <curses.h> 
#include "SourceFiles/generalFunc.h" 

int main() 
{ 

    initscr(); 
    int x = resize_term(51, 79); 
    sleepMilli(5000); //sleep for 5 seconds 
    endwin(); 
    std::cout << x << " " << int(ERR) << " " << int(OK); 

} 

画面を動作しているようですが、私のコンピュータ上で、バックx戻り0indicating the resizing was successful)という事実にもかかわらず、この場合にはリサイズされていません。元のターミナルウィンドウと同じサイズのままです。しかし、79から80を増やすか、51から50を減らすと、画面は通常のように画面のサイズが変更されます。私の画面は、これらのサイズを1マイル単位で調整するのに十分な大きさです.80から79に変更するとウィンドウサイズが減少しますが、何らかの理由でそれが機能しません。特定のアスペクト比を下回るのは好きではないようです。Pdcurses' resize_termがランダム

これらの数値が画面の制限値に近づいていないにもかかわらず、私ができるサイズ変更に制限があるように思われる理由は何ですか?これは64ビットWindows上のpdcursesです。

+0

もしあなたがWin64を使っているのであれば、いくつかのunix-portの代わりに標準のコンソール機能を使うのはなぜですか? – BitTickler

答えて

2

resize_termはncurses関数です。

resize_term機能は、端末のサイズを変更しません。 ncursesは、とするサイズを変更します。

cursesによって何も表示されず(notes in the manual pageを参照)、あなたの例ではgetchはありません。変更としてcursesには何も表示されません。

興味深いことに、PDCursesは、同じ名前(ncursesに触発されています:これらの中にいくつかあります)が異なる方法で実装されています。 pdcurses/initscr.cのコメントからの引用:

​​

と関数は、このことから始まる:

今度はWindowsコンソールのためにこれを呼び出す
int resize_term(int nlines, int ncols) 
{ 
    PDC_LOG(("resize_term() - called: nlines %d\n", nlines)); 

    if (!stdscr || PDC_resize_screen(nlines, ncols) == ERR) 
     return ERR; 

    SP->lines = PDC_get_rows(); 
    LINES = SP->lines - SP->linesrippedoff - SP->slklines; 
    SP->cols = COLS = PDC_get_columns(); 

int PDC_resize_screen(int nlines, int ncols) 
{ 
    SMALL_RECT rect; 
    COORD size, max; 

    if (nlines < 2 || ncols < 2) 
     return ERR; 

    max = GetLargestConsoleWindowSize(pdc_con_out); 

    rect.Left = rect.Top = 0; 
    rect.Right = ncols - 1; 

    if (rect.Right > max.X) 
     rect.Right = max.X; 

    rect.Bottom = nlines - 1; 

    if (rect.Bottom > max.Y) 
     rect.Bottom = max.Y; 

    size.X = rect.Right + 1; 
    size.Y = rect.Bottom + 1; 

    _fit_console_window(pdc_con_out, &rect); 
    SetConsoleScreenBufferSize(pdc_con_out, size); 
    _fit_console_window(pdc_con_out, &rect); 
    SetConsoleScreenBufferSize(pdc_con_out, size); 
    SetConsoleActiveScreenBuffer(pdc_con_out); 

    return OK; 
} 

あなたが見ることができるように結果は互換性のない関数です。 (同様のSDLへのポートがあります)。 PDCursesの行動に関連するいくつかの質問があります。

しかし、PDCursesは通常のcurses(またはncursesベース)との相違点を示すために<xcurses.h>として、そのヘッダファイルをインストールします。私は質問がncursesベースについてだったと仮定し、問題はライブラリ関数が何をするかについて混乱がある:

、それは同じ2つのコールを二回作るということ奇妙です

/* Calls SetConsoleWindowInfo with the given parameters, but fits them 
    if a scoll bar shrinks the maximum possible value. The rectangle 
    must at least fit in a half-sized window. */ 

static BOOL _fit_console_window(HANDLE con_out, CONST SMALL_RECT *rect) 
{ 
    SMALL_RECT run; 
    SHORT mx, my; 

    if (SetConsoleWindowInfo(con_out, TRUE, rect)) 
     return TRUE; 

    run = *rect; 
    run.Right /= 2; 
    run.Bottom /= 2; 

    mx = run.Right; 
    my = run.Bottom; 

    if (!SetConsoleWindowInfo(con_out, TRUE, &run)) 
     return FALSE; 

    for (run.Right = rect->Right; run.Right >= mx; run.Right--) 
     if (SetConsoleWindowInfo(con_out, TRUE, &run)) 
      break; 

    if (run.Right < mx) 
     return FALSE; 

    for (run.Bottom = rect->Bottom; run.Bottom >= my; run.Bottom--) 
     if (SetConsoleWindowInfo(con_out, TRUE, &run)) 
      return TRUE; 

    return FALSE; 
} 

コードが見えます...奇数、二度同じことをやってほか:かない - PDCurses機能は、彼らが収まるまで、与えられた値を減らし、おそらくいくつかの試みになります。SetConsoleWindowInfoというMSDNの説明を参照すると、rectangleパラメータはで、パラメータ(変更されていません)です。パラメータを通して続き、それが要求されたサイズを取って、そして

  1. 要求されたサイズを設定、または
  2. は半分の初期サイズにまで列を削減しながら、要求されたラインを設定し、または
  3. セットに続いてしようとしています要求された列を削除しながら、行を初期サイズの半分に縮小します。

多分これが2回実行されるのは、コンソールAPIに不確定な動作があるからです。コード内のコメントは役に立たない。

+0

申し訳ありませんが、私は十分に明確ではありませんでした。質問は、64ビットWindows上のPDcursesについてです。私は私のOPを編集します。 – SergeantPenguin

関連する問題