2016-07-13 9 views
1

こんにちは私はWriteConsoleOutputAで出力しようとしています。 私はこのコードを持っている:WriteConsoleOutputAでコンソールに出力

CHAR_INFO letterA; 
letterA.Char.AsciiChar = 'A'; 

letterA.Attributes = 
    FOREGROUND_RED | FOREGROUND_INTENSITY | 
    BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_INTENSITY; 
    //Set up the positions: 
    COORD charBufSize = { 1, 1}; 
    COORD characterPos = { 0, 0 }; 
    SMALL_RECT writeArea = { 0,0,0,0 }; 

    //Write the character 
    WriteConsoleOutputA(wHnd, &letterA, charBufSize, characterPos, &writeArea); 

だから、この時点では、黄色の背景に赤のAを書き込みますが、私はAは、座標(5,5)に表示されたい場合は、たとえば、それが印刷されませんSMALL_RECT{0, 0, 10, 10}に変更しても

または私はこれで最初の1に別のA右側を書きたい場合:このグラフィカルコンソールモードで始まる

WriteConsoleOutputA(wHnd, &letterA, charBufSize, characterPos, &writeArea); 
WriteConsoleOutputA(wHnd, &letterA, charBufSize, { 0, 1 }, &writeArea); 

は - 私誰かがどのように私に言うことができれば、それは非常に参考になりますそのキャラクターを私が望む座標にプリントする。

は、私はこのような座標何かを変え、それを変更しようとしています:

COORD charBufSize = { 5, 10}; 
COORD characterPos = { 3, 2 }; 
SMALL_RECT writeArea = { 0,0,5,10 }; 

をしかし、それはすべてのバッファ5 * 10に奇妙な文字や他の色を印刷します。

ありがとう

セザール

答えて

3

WriteConsoleOutput(..)は、慎重に扱う必要がある複雑な機能です。

dwBufferSizeパラメータは、(=あなたのcharBufSizelpBufferパラメータのサイズ指定(=あなたのletterA)以外の何ものでもありません。 letterAのサイズが1であることを単に伝えるのではなく、2軸に分割することで、テキストブロックの幅と高さをletterA文字で指定することができます。しかし、letterAのサイズはcharBufSize.X * charBufSize.Yでなければならないことに注意してください。そうでなければ、WriteConsoleOutputは初期化されていないメモリを使用するので奇妙なことをするでしょう。

パラメータ(= characterPos)は、letterAの範囲内で、コンソールに書き込まれる文字を読み取る場所を定義します。したがって、単にインデックスオフセットを定義します。あなたの例では、letterAは1文字に過ぎないので、常に(これはletterA[0]と同じです)にする必要があります。

lpWriteRegionパラメータ(=あなたのwriteArea)はすべての魔法を実行します。呼び出しによって書き込まれる領域の位置、幅、高さを指定します。書き込まれるデータは、前のパラメータによって定義されます。

だから、次の操作を実行し、特定の場所x, yに文字を書くために:

COORD charBufSize = {1, 1}; 
COORD characterPos = {0, 0}; 
SMALL_RECT writeArea = {x, y, x, y}; 

WriteConsoleOutputA(wHnd, &letterA, charBufSize, characterPos, &writeArea); 

少し良く理解するために、次の例を使用してcharBufSizecharacterPoswriteAreaの値で少し遊ぶ:

int i; 
CHAR_INFO charInfo[10 * 10]; 

/* play with these values */ 
COORD charBufSize = {10, 10}; /* do not exceed x*y=100 !!! */ 
COORD characterPos = {5, 0}; /* must be within 0 and x*y=100 */ 
SMALL_RECT writeArea = {2, 2, 12, 12}; 


for (i = 0; i < (10 * 10); i++) 
{ 
    charInfo[i].Char.AsciiChar = 'A' + (i % 26); 
    charInfo[i].Attributes = FOREGROUND_RED | FOREGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_INTENSITY; 
} 

WriteConsoleOutputA(wHnd, charInfo, charBufSize, characterPos, &writeArea); 

コンソールと変数を示す上記の例のパラメータのスクリーンショットです。これでもう少し明確になることを願っています。

Parameter example

+0

こんにちはルーカスは、どうもありがとうございました、これはその関数についてもう少し理解するために私を助け、とても役に立ちました。 –

関連する問題