青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

我住包子山

this->blog.MoveTo("blog.baozishan.in")

Win32 Console Applications - Part 3 of 6 form adrianxw.dk

Win32 Console Applications - Part 3.

I recommend you compile and run this program. It will display the printable characters available to your console. If your console is a different size from mine, you may need to adjust the values for x and y, but this should be trivial. The rest of the tutorial assumes your character map is the same as mine - it should be, but it is possible if you have a different language set loaded into your system the positions of some of these characters may be different, run this, check them and modify the values used later accordingly, (frankly, I've worked with several language settings and never seen the character map to be different, but I'm told it is possible!).

#include <windows.h>
#include <iostream>
using namespace std;

int main()
{
    HANDLE hOut;
    int i;
    int x = 0;
    int y = 0;
    COORD Position;

    hOut = GetStdHandle(STD_OUTPUT_HANDLE);

    for (i=32; i<=255; i++)
    {
        Position.X = x;
        Position.Y = y;
        SetConsoleCursorPosition(hOut,
                                 Position);

        cout.width(3);
        cout << i << " " << (unsigned char)i << flush;

        ++y;
        if(y > 20)
        {
            y = 0;
            x += 6;
        }
    }

    Position.X = 0;
    Position.Y = 22;
    SetConsoleCursorPosition(hOut,
                             Position);
    return 0;
}

Of particular interest to this part of the tutorial are the values between 179 and 218. Shown below is the relevent part of the output from the program.

Char Map

If you remember part 1 of this tutorial, I said the "normal" characters in the console font filled a 7x11 grid in a larger 8x12 character cell which had the top and row and right column blank to allow for spacing. As you can see from the picture above, these are not normal characters, some have already merged with those above and below them to give some strange glyphs that look like a cross between sanskrit and klingon! Here is the same character range more spread out and easier to see.

Char Map2

Unlike the normal alpha-numerics, (0-9, A-Z, a-z), and puntuation characters, where space between the individual characters is important for clarity, these characters do not have space above and to the right, they run all the way to the edge of their character cell and are designed to be merged. With these characters one can draw lines, boxes and grids. Have a look at this program output for some idea of what you can do.

Boxes

The figures look a little stupid when drawn this size, but I have done this to keep the size of the image files down, so they load faster, you can make them any size, and if you inspect the character map, you will see that these are not the only possibilities.

To draw these examples, I wrote a very crude function which draws a character at a specified location on the screen, it is shown here.

void At(int x, int y, unsigned char What)
{
    static HANDLE hOut;
    static bool First = TRUE;
    COORD Position;

    if(First)
    {
        hOut = GetStdHandle(STD_OUTPUT_HANDLE);
        First = FALSE;
    }

    Position.X = x;
    Position.Y = y;
    
    SetConsoleCursorPosition(hOut,
                             Position);
    
    cout << What << flush;

    return;
}

As you can see, there is no error or range checking, it simply assumes you know what you are doing. The function retrieves the standard output handle and stores it statically the first time the it is invoked.

This code snippet shows the calls necessary to draw the first box.

    At(9, 0, (unsigned char) 218);
    At(10, 0, (unsigned char) 196);
    At(11, 0, (unsigned char) 191);
    At(9, 1, (unsigned char) 179);
    At(10, 1, (unsigned char) 32);
    At(11, 1, (unsigned char) 179);
    At(9, 2, (unsigned char) 192);
    At(10, 2, (unsigned char) 196);
    At(11, 2, (unsigned char) 217);

Given the character table above and this simple example, (32 is the space character by the way), you should have enough information to create all kinds of boxes, grids, mazes, forms etc. The very playable adventure game "Caverns of Moria" known to many VAX/VMS and UNIX users had a user interface that could easily be copied using these simple graphics.

----------

Whilst drawing boxes or at any time it becomes appropriate, you may want to hide or modify the appearance of the cursor. You can do this with another API routine, SetConsoleCursorInfo(). This takes 2 parameters, the standard output handle, and a pointer to a CONSOLE_CURSOR_INFO structure. This is another relatively simple Windows defined structure. It is looks like this.

typedef struct _CONSOLE_CURSOR_INFO {
    DWORD  dwSize; 
    BOOL   bVisible; 
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO; 

The first value is a simple integer in the range 1-100, it specifies how much of the character cell the cursor occupies is filled. The program here sets the cursor size to 50. The 3 pictures below show the sizes 1, 50 and 100, you can, of course, use any integer in the range. Note the use of the "&" in front of the ConCurInf, remember, the routine expects a pointer to the structure you have declared.

#include <windows.h>

int main()
{
    HANDLE hOut;
    CONSOLE_CURSOR_INFO ConCurInf;

    hOut = GetStdHandle(STD_OUTPUT_HANDLE);

    SetConsoleTitle("Size 50");

    ConCurInf.dwSize = 50;
    ConCurInf.bVisible = TRUE;

    SetConsoleCursorInfo(hOut,
                         &ConCurInf);

    return 0;
}
Cursor1

Cursor50

Cursor100

The other value is a boolean field and indicates whether the cursor is visible or not. A value of TRUE, (the default), means the cursor is visible, FALSE and it is invisible. The followng program turns the cursor off.

#include <windows.h>

int main()
{
    HANDLE hOut;
    CONSOLE_CURSOR_INFO ConCurInf;

    hOut = GetStdHandle(STD_OUTPUT_HANDLE);

    SetConsoleTitle("No Cursor");

    ConCurInf.dwSize = 10;
    ConCurInf.bVisible = FALSE;

    SetConsoleCursorInfo(hOut,
                         &ConCurInf);

    return 0;
}
CursorOff

To turn the cursor back on, call the function again with the bVisible member set TRUE.

It is a good idea to set up both values, especially the first time you call the function. If you set up bVisible but leave dwSize uninitialised, the unspecified value may be zeroed, or contain a random value, in either case, it could be out of the range 1-100, and the routine will fail. Similaly, if you want to change the size of the cursor, and don't set bVisible to be TRUE, your compiler may have zeroed the uninitialised field and the cursor will disappear instead of changing size. As always, if you check the return value of the call, you will see if any errors have happened along the way.

Remember, the cursor is there to show where the character insertion point is. Setting the cursor to invisible does not change that. Remember also, the cursor is very useful, it shows your user "where they are" on your screen, if you take it away, you must be sure you have other means available that enable your user to navigate the screen.

In the next part of this tutorial, we'll explore the colour issues.

posted on 2006-07-20 22:49 Gohan 閱讀(410) 評論(0)  編輯 收藏 引用 所屬分類: C++

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产免费观看久久| 欧美激情综合五月色丁香| 欧美视频免费看| 在线视频免费在线观看一区二区| 亚洲国产美国国产综合一区二区| 久久免费视频网| 亚洲黄色av一区| 亚洲精品日日夜夜| 欧美日韩综合另类| 欧美一级免费视频| 久久久不卡网国产精品一区| 亚洲福利在线视频| 亚洲美女啪啪| 国产精品最新自拍| 欧美gay视频激情| 欧美精品福利| 欧美一区二区成人| 久久人体大胆视频| 亚洲视频在线视频| 欧美在线高清| 亚洲精品一二三| 亚洲欧美在线观看| 亚洲国产日韩在线一区模特| 一区二区欧美在线| 国产最新精品精品你懂的| 亚洲高清免费在线| 国产日产亚洲精品系列| 欧美激情一区二区三区全黄| 国产精品第一页第二页第三页| 久久久久久久久久久成人| 欧美高清在线播放| 久久精品系列| 欧美日韩在线播| 免费一级欧美片在线观看| 欧美日韩在线一区二区| 蜜乳av另类精品一区二区| 国产精品vip| 欧美激情一区二区三区不卡| 国产日韩一区二区三区| 亚洲啪啪91| 亚洲成色精品| 欧美制服丝袜第一页| 亚洲天堂网在线观看| 免费永久网站黄欧美| 欧美一区二区日韩一区二区| 欧美精品乱码久久久久久按摩| 久久久久久久综合日本| 国产精品久久久久久妇女6080| 欧美黄色aa电影| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲一二三四久久| 宅男在线国产精品| 免费欧美网站| 欧美成人综合在线| 一区二区三区无毛| 久久激情视频免费观看| 欧美一区二区三区男人的天堂| 欧美日韩一视频区二区| 欧美激情一区二区三区成人| 精品999在线播放| 久久国产精品久久久久久电车| 午夜在线电影亚洲一区| 国产精品久久午夜| 一区二区冒白浆视频| 亚洲一区日韩| 欧美性大战xxxxx久久久| 日韩视频精品在线观看| 亚洲视频在线播放| 国产精品久久久久久久久久ktv | 国产日韩视频| 亚洲天堂成人| 欧美一区二区久久久| 国产日韩精品一区二区三区在线| 亚洲一级黄色av| 久久国产一区二区| 好看的日韩av电影| 毛片基地黄久久久久久天堂| 欧美激情第9页| 99热精品在线| 国产精品红桃| 午夜伦欧美伦电影理论片| 久久九九电影| 激情五月婷婷综合| 欧美福利影院| 亚洲午夜三级在线| 久久国产手机看片| 亚洲国产欧美在线| 欧美日韩免费看| 亚洲欧美日韩一区在线| 欧美va天堂在线| 这里只有精品丝袜| 国产伦精品免费视频 | 亚洲黄网站在线观看| 一本到12不卡视频在线dvd| 欧美色网一区二区| 久久精品九九| 99在线精品视频在线观看| 欧美在线资源| 日韩一级精品| 国内精品久久久久久久影视麻豆 | 一区二区三欧美| 久久久不卡网国产精品一区| 亚洲精品影视在线观看| 国产精品狼人久久影院观看方式| 久久久另类综合| 一本一本久久a久久精品综合麻豆| 久久不见久久见免费视频1| 亚洲电影免费观看高清完整版在线观看| 欧美福利一区二区| 久久xxxx| 一区二区三区福利| 欧美国产日韩一区| 欧美一区二区女人| 9色国产精品| 精品成人在线视频| 国产精品青草综合久久久久99| 美国成人直播| 欧美在线|欧美| 一本色道久久综合亚洲精品婷婷| 蜜桃av一区二区三区| 亚洲欧美激情诱惑| 亚洲精品中文字幕有码专区| 国产一区 二区 三区一级| 欧美电影在线| 久久精品女人| 亚洲欧美精品| 亚洲一二区在线| 亚洲精品免费在线观看| 久久综合激情| 久久久精品国产99久久精品芒果| 一本色道婷婷久久欧美| 亚洲精品国产精品国自产观看浪潮 | 免费亚洲一区| 久久久美女艺术照精彩视频福利播放 | 国产精品国产三级国产aⅴ入口| 久久久午夜电影| 久久精品国产第一区二区三区| 亚洲一区二区高清| 日韩一级网站| 日韩一区二区精品在线观看| 亚洲第一天堂av| 亚洲成人在线免费| 一本色道久久88精品综合| 欧美承认网站| 欧美高清在线一区| 免费黄网站欧美| 六月婷婷一区| 女同一区二区| 欧美顶级少妇做爰| 欧美激情小视频| 亚洲国内自拍| 亚洲日本中文字幕区| 亚洲黑丝在线| 日韩一级免费| 在线亚洲精品| 亚洲在线观看视频网站| 亚洲女人av| 久久成人一区| 麻豆av一区二区三区| 欧美成人黑人xx视频免费观看| 欧美国产视频日韩| 欧美日韩另类综合| 国产伦精品一区二区| 激情av一区| 亚洲精品综合精品自拍| 亚洲天堂av图片| 欧美在线视频观看| 久久久久久久尹人综合网亚洲| 欧美阿v一级看视频| 亚洲精品国久久99热| 亚洲私人影院在线观看| 欧美一区二区视频97| 欧美成人精品在线观看| 欧美午夜免费影院| 亚洲最新视频在线播放| 亚洲欧美日韩精品在线| 久久精品一区二区三区不卡牛牛| 久久综合国产精品台湾中文娱乐网| 欧美99在线视频观看| 国产精品久久久久久久久久直播 | 国产精品资源在线观看| 好看的日韩av电影| 99精品欧美一区| 欧美在线观看一二区| 亚洲电影在线播放| 亚洲免费一在线| 欧美福利影院| 国产一区二区三区精品欧美日韩一区二区三区| 一色屋精品亚洲香蕉网站| 亚洲系列中文字幕| 老司机免费视频久久| 中文欧美日韩| 久久一本综合频道| 国产麻豆精品久久一二三| 亚洲欧洲日本国产| 久久综合99re88久久爱| 亚洲视屏在线播放| 欧美高清在线一区| 在线看欧美日韩| 久久激情五月丁香伊人|