Dos 下的Message?

請問如何產生子畫面並跑出Message如The is OK..., 的語法。

註: C 語言,DOS 下。 謝謝

2 Answers

Rating
  • 1 decade ago
    Favorite Answer

    對於Jacob Lee的意見, 我想到用Windows API來解決, 行數少很多.

    以下程式要自己輸入開始的座標, 是因為預設的大少是80*300, 我不知道正在顯示的畫面左上角座標是什麼.

    以下程式沒有考慮multi-thread問題, 如有需要請自行用互斥處理,

    還有, 以下用的Windows API只支援Windows 2000以上的NT系統.

    可以在MSDN看更多console上用的API

    http://msdn2.microsoft.com/en-us/library/ms682073(...

    #include <stdio.h>

    #include <string.h>

    #include <windows.h>

    void msgBox(HANDLE, char[], COORD);

    int main(void)

    {

    int i;

    HANDLE hcon = GetStdHandle(STD_OUTPUT_HANDLE);

    for(i = 0; i<560; i++){ //只是給你看還原的效果用

    putchar('a');

    }

    msgBox(hcon, "The is OK...", (COORD){10, 3});

    getch(); //把程式停一下..

    return 0;

    }

    void msgBox(HANDLE hcon, char msg[], COORD from)

    {

    int i;

    SMALL_RECT sr;

    int lines = 0;

    int longest = 0;

    int last_len = 0;

    for(i = 0; i <= strlen(msg); i++){ //計'\0'在內

    if(msg[i] == '\n' || msg[i] == '\0'){

    lines ;

    longest = max(longest, i-last_len); //max()已在windows.h中定義

    last_len = i;

    }

    }

    COORD size = (COORD) {longest 2, lines 2};

    CHAR_INFO ci[size.X*size.Y]; //包括border (我沒有畫邊框)

    CHAR_INFO mask[size.X*size.Y]; //遮蔽

    sr = (SMALL_RECT) {from.X, from.Y, from.X size.X-1, from.Y size.Y-1};

    ReadConsoleOutput(hcon, mask, size, (COORD) {0, 0}, &sr); //取得遮蔽

    for(i = 0; i<size.X*size.Y; i++){ //清除

    ci[i].Attributes = 15*16 5; //顏色: 背景*16 字 (16色)

    ci[i].Char.AsciiChar = ' ';

    }

    lines = 0;

    last_len = 0;

    for(i = 0; i<strlen(msg); i++){ //不計'\0'在內

    if(msg[i] != '\n'){

    ci[size.X*(lines 1) 1 last_len].Char.AsciiChar = msg[i];

    last_len ;

    }else{

    lines ;

    last_len = 0;

    }

    }

    sr = (SMALL_RECT) {from.X, from.Y, from.X size.X-1, from.Y size.Y-1};

    WriteConsoleOutput(hcon, (PCHAR_INFO) ci, size, (COORD) {0, 0}, &sr); //畫出message

    getch(); //按任意鍵關閉 (把程式停一下)

    sr = (SMALL_RECT) {from.X, from.Y, from.X size.X-1, from.Y size.Y-1};

    WriteConsoleOutput(hcon, (PCHAR_INFO) mask, size, (COORD) {0, 0}, &sr); //畫出遮蔽

    }

    2008-01-02 14:33:12 補充:

    嗯.. console的畫面就是一個表格, 所以其實讀取及寫入console是不是「在」GUI? (我覺得GUI都是一個表格, 我分不到〝像〞GUI和〝在〞GUI )

    (因為我試過在console畫出GUI介面, 當application的那樣畫, 那這是〝像〞GUI或是〝在〞GUI)

    請Jacob Lee指點一下(我是新手)

    還有我在想MS-Editor在DOS時是怎樣寫的...

    2008-01-03 19:34:59 補充:

    這個可真是麻煩.

    如果是不支援conio.h的話, 那C還有沒有方法可以控制浮標的位置等等的console function?

    2008-03-01 00:32:01 補充:

    剛剛發現

    ci[i].Attributes = 15*16+5; //顏色: 背景*16+字 (16色)

    的"+"給吃掉了

    2008-03-01 00:32:57 補充:

    還有...

    ci[size.X*(lines+1)+1+last_len].Char.AsciiChar = msg[i];

    又吃了.

    算了... 自己加上去吧.

  • 1 decade ago

    子畫面不是標準 C 的東東。

    一個方法是:用

    ┌─────┐

    │ This is Ok.. │

    └─────┘

    另一個方法是用 conio.h

    不過,看到它,你就知道:要看 compiler了!

    2008-01-01 00:09:17 補充:

    如果你是要像 GUI 那樣出子畫面→移除後顯示原畫面,

    那有兩大類不同的做法:(都要用到 conio.h)

    一、程式自行備份覆蓋前的文字幕內容:〝簡單〞〝好寫〞(約100多列的程式碼!)。

      (這個方法我寫過。)

    二、〝系統〞處理:又可分兩大類!不管用哪一類,都要約1萬列以上的程式碼!

     (這樣知道為何我前面那個〝簡單〞〝好寫〞要加〝〞了吧!?)

    2008-01-01 23:51:42 補充:

    我指的是(如版大所言 DOS 下):不用 API。

    我寫的是〝像〞GUI,不是〝在〞GUI

    2008-01-02 23:13:53 補充:

    #include

    就已經不能在純 DOS 下跑了!

    它只是能模擬像 DOS 下的東東。

    在純 DOS 下,沒這些工具可用!

    一切請程式師自己動手。

    好險,IBM 相容電腦的 BIOS Call 有點基本的服務。

    但:

     1. 很陽春!

     2. 標準的 C 沒支援(Turbo C 有)

    所以,你要自己寫個像我在意見 002 寫的介面,

    以後才會好用。

    2008-01-02 23:20:42 補充:

    吃字王又吃字了!

    #include <windows.h>

    2008-01-06 07:37:08 補充:

    請參考敝人論壇的這篇 http://www.phpbbserver.com/graphicsparalle/viewtop...

    裡面有非標準的 VC, TC, GNU C, 和 Dev C 的控制游標的方法。

    哪天有空,我再把 TC 更快、不過,更非標準的方法補上。 ^_^

Still have questions? Get your answers by asking now.