1

我已经学习 c++ 两个多星期了,我正在尝试通过编写一个简单的控制台应用程序来练习我必须练习的知识,该应用程序显示了我的鼠标光标的 X 和 Y 坐标,我查看了 MSDN Libs 并试图理解,但我所做的只是以错误的方式显示坐标。

这是我现在拥有的代码,虽然不多,但我想确保我以正确的方式做事,这样我就不会养成坏习惯;

#include <iostream>
#include <Windows.h>

int main() 
{
POINT cursorPos;
GetCursorPos(&cursorPos);
printf("X %d    Y %d\n", cursorPos.x, cursorPos.y);


system("PAUSE");
}

这样做的主要目标是打开控制台(一旦运行)并监听左键单击,然后在控制台中显示该 Co-ord 直到再次单击!

对此的任何帮助将不胜感激,如果在我尝试搜索但没有运气之前已将其发布在某个地方,我们深表歉意!

问候

克里斯

4

2 回答 2

3

尝试这样的事情:

#include <iostream>
#include <Windows.h>

int main() 
{
    POINT cursorPos;

    do
    {
        GetCursorPos( &cursorPos );
        printf("X %d    Y %d\n", cursorPos.x, cursorPos.y);
        Sleep( 100 );
    }
    while ( cursorPos.x != 0 || cursorPos.y != 0 );

    // just "for fun", as an example,
    // you have to set your mouse to X=0, Y=0 to exit!

    return 0;
}

问题是:程序只是一系列操作,所以“如果它完成了它所做的......它就会死!”

当程序保持活动状态时,这意味着它实际上是在“事件循环”中运行。这意味着一个“使程序保持活力”的循环。它有很多名称,具体取决于您正在使用的系统/平台(例如,在 OS X 中,它称为 RunLoops),但它们的想法都是一样的。

这个“事件循环”的基本和大体思想基本上总是一样的:观察用户输入,观察系统输入,根据输入做一些动作(很多时候,动作只是“睡觉!”)

用这个方法。您的程序将永远保持活力!直到它响应意味着“关闭它”的输入。(例如,在 Windows 中,当您使用 Windows 时,它可能是 WM_QUIT 消息,或者只是一个 ESC 键,在控制台模式等...)

上面是这个例子吗,我只是给出了“作为例子”来退出,如果鼠标位置转到(x=0, y=0).

于 2013-10-22T21:30:03.340 回答
0

在此处输入图像描述

使用控制台自己的键盘和鼠标事件处理程序 - ReadConsoleInput( )

在这里阅读更多https://msdn.microsoft.com/en-us/library/windows/desktop/ms685035(v=vs.85).aspx

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

void gotoxy(int x, int y);
void setcolor(WORD color);
void setForeGroundAndBackGroundColor(int ForeGroundColor,int BackGroundColor);
void clearscreen();
void drawpixel( unsigned char x, unsigned char y, unsigned char Color);
void drawpixel2( unsigned char x, unsigned char y, unsigned char Color, char character);
void drawcircle(int x, int y, int a, int b, int color);
void drawline(int x0, int y0, int x1, int y1, int color);
void drawfilledrectangle(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2,unsigned char bkcol);
void drawframe(unsigned x,unsigned y,unsigned sx,unsigned sy,unsigned char col,unsigned char col2,char text_[]);
void drawwindow(unsigned x,unsigned y,unsigned sx,unsigned sy,unsigned char col,unsigned char col2,unsigned char bkcol,char text_[]);

int main()
{
    gotoxy(1,23);
    setcolor(7);
    clearscreen();

    cout<<"click anywhere in console window to write - hello world -\n\n\n\n\n\n\n\n\n\n\n\n\n"
    "Press Ctrl+C to Exit";

        HANDLE hout= GetStdHandle(STD_OUTPUT_HANDLE);
        HANDLE hin = GetStdHandle(STD_INPUT_HANDLE);
        INPUT_RECORD InputRecord;
        DWORD Events;
        COORD coord;
        CONSOLE_CURSOR_INFO cci;
        cci.dwSize = 25;
        cci.bVisible = FALSE;
        SetConsoleCursorInfo(hout, &cci);
        SetConsoleMode(hin, ENABLE_PROCESSED_INPUT | ENABLE_MOUSE_INPUT);
        bool EXITGAME = false;
        int buttonX=1, buttonY=1;

        drawpixel(buttonX,buttonY ,1);
        gotoxy(buttonX+2,buttonY);
        setcolor(3);
        cout<<"<----- a button \n";


    while( !EXITGAME )
    {

        ReadConsoleInput(hin, &InputRecord, 1, &Events);


        switch ( InputRecord.EventType ){
                case KEY_EVENT: // keyboard input 


                    switch (InputRecord.Event.KeyEvent.wVirtualKeyCode)
                    {
                        case VK_ESCAPE:
                           EXITGAME = TRUE;
                         break;

                        case VK_SPACE:

                         break;


                        case VK_RETURN:

                         break;

                        case VK_LEFT:
                            // left key   move player left
                            cout<<"VK_LEFT   = "<<InputRecord.Event.KeyEvent.wVirtualKeyCode <<" \n";

                         break;

                        case VK_RIGHT:
                            // right key   move player right
                            cout<<"VK_RIGHT   = "<<InputRecord.Event.KeyEvent.wVirtualKeyCode <<" \n";

                         break;

                        case VK_UP:
                            // up key   move player up
                            cout<<"VK_UP   = "<<InputRecord.Event.KeyEvent.wVirtualKeyCode <<" \n";


                         break;

                        case VK_DOWN:
                            // up key   move player down
                            cout<<"VK_DOWN   = "<<InputRecord.Event.KeyEvent.wVirtualKeyCode <<" \n";


                         break;



                    }//switch

                    //---------------------------------------------------------------------------------
                    break; 

                case MOUSE_EVENT: // mouse input 

                    if(InputRecord.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)
                    {
                        coord.X = InputRecord.Event.MouseEvent.dwMousePosition.X;
                        coord.Y = InputRecord.Event.MouseEvent.dwMousePosition.Y;
                        SetConsoleCursorPosition(hout,coord);
                        SetConsoleTextAttribute(hout,rand() %7+9);

                        if ( (InputRecord.Event.MouseEvent.dwMousePosition.X == buttonX ) && 
                            ( InputRecord.Event.MouseEvent.dwMousePosition.Y == buttonY) ){

                            clearscreen();
                            gotoxy(1,1);
                            setcolor(7);
                            drawpixel(buttonX,buttonY ,1);
                            setcolor(3);
                            cout<<" mybutton was pressed \n";
                            setcolor(7);
                            Sleep(500);
                            drawpixel(buttonX,buttonY ,1);
                            gotoxy(buttonX+2,buttonY);
                            setcolor(3);
                            cout<<"<----- a button      \n";


                        }

                        cout<<"Hello world at "<< InputRecord.Event.MouseEvent.dwMousePosition.X <<" x "<< InputRecord.Event.MouseEvent.dwMousePosition.Y<<" ";

                    }// mouse 

                    break; 

                case WINDOW_BUFFER_SIZE_EVENT: // scrn buf. resizing 
                     ; 
                    break; 

                case FOCUS_EVENT:  // disregard focus events 

                case MENU_EVENT:   // disregard menu events 

                    break; 

                default: 
                    cout<<"Unknown event type \n"; 
                    break; 
        }



        FlushConsoleInputBuffer(hin);
    }
    gotoxy(1,23);
    setcolor(7);
    clearscreen();
    cout<<"\n";
    return 0;

}



void gotoxy(int x, int y){
    COORD coord;
    coord.X = x; coord.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
    return;
}

//*****************************************************************************

void setcolor(WORD color){
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color);
    return;
}

//*****************************************************************************


//
//     colors:
//     0 = Black
//     1 = Blue
//     2 = Green
//     3 = Cyan
//     4 = Red
//     5 = Magenta
//     6 = Yellow
//     7 = LightGray
//     8 = DarkGray
//     9 = LightBlue
//     10 = LightGreen
//     11 = LightCyan
//     12 = LightRed
//     13 = LightMagenta
//     14 = LightYellow
//     15 = White


//

//*****************************************************************************

void setForeGroundAndBackGroundColor(int ForeGroundColor,int BackGroundColor){
   int color=16*BackGroundColor+ForeGroundColor;
   setcolor(color);
}

//*****************************************************************************

void clearscreen(){
    COORD coordScreen = { 0, 0 };
    DWORD cCharsWritten;
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    DWORD dwConSize;
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

    GetConsoleScreenBufferInfo(hConsole, &csbi);
    dwConSize = csbi.dwSize.X * csbi.dwSize.Y;
    FillConsoleOutputCharacter(hConsole, TEXT(' '), dwConSize, coordScreen, &cCharsWritten);
    GetConsoleScreenBufferInfo(hConsole, &csbi);
    FillConsoleOutputAttribute(hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten);
    SetConsoleCursorPosition(hConsole, coordScreen);
    return;
}

//*****************************************************************************

void drawpixel( unsigned char x, unsigned char y, unsigned char Color){
        setcolor(Color);
        gotoxy(x,y);printf("Û");
}
//*****************************************************************************

void drawpixel2( unsigned char x, unsigned char y, unsigned char Color, char character){
        setcolor(Color);
        gotoxy(x,y);printf("%c",character);
}

//*****************************************************************************

void drawcircle(int x, int y, int a, int b, int color){
    int wx, wy;
    int thresh;
    int asq = a * a;
    int bsq = b * b;
    int xa, ya;

    drawpixel(x, y+b, color);
    drawpixel(x, y-b, color);

    wx = 0;
    wy = b;
    xa = 0;
    ya = asq * 2 * b;
    thresh = asq / 4 - asq * b;

    for (;;) {
        thresh += xa + bsq;

        if (thresh >= 0) {
            ya -= asq * 2;
            thresh -= ya;
            wy--;
        }

        xa += bsq * 2;
        wx++;

        if (xa >= ya)
          break;


        drawpixel(x+wx, y-wy, color);
        drawpixel(x-wx, y-wy, color);
        drawpixel(x+wx, y+wy, color);
        drawpixel(x-wx, y+wy, color);
    }

    drawpixel(x+a, y, color);
    drawpixel(x-a, y, color);

    wx = a;
    wy = 0;
    xa = bsq * 2 * a;

    ya = 0;
    thresh = bsq / 4 - bsq * a;

    for (;;) {
        thresh += ya + asq;

        if (thresh >= 0) {
            xa -= bsq * 2;
            thresh = thresh - xa;
            wx--;
        }

        ya += asq * 2;
        wy++;

        if (ya > xa)
          break;

        drawpixel(x+wx, y-wy, color);
        drawpixel(x-wx, y-wy, color);
        drawpixel(x+wx, y+wy, color);
        drawpixel(x-wx, y+wy, color);
    }
}

//*****************************************************************************

void drawline(int x0, int y0, int x1, int y1, int color){
    int pix = color;
    int dy = y1 - y0;
    int dx = x1 - x0;
    int stepx, stepy;

    if (dy < 0) { dy = -dy;  stepy = -1; } else { stepy = 1; }
    if (dx < 0) { dx = -dx;  stepx = -1; } else { stepx = 1; }
    dy <<= 1;                                                  // dy is now 2*dy
    dx <<= 1;                                                  // dx is now 2*dx

  drawpixel( x0, y0,pix);
    if (dx > dy) {
        int fraction = dy - (dx >> 1);                         // same as 2*dy - dx
        while (x0 != x1) {
            if (fraction >= 0) {
                y0 += stepy;
                fraction -= dx;                                // same as fraction -= 2*dx
            }
            x0 += stepx;
            fraction += dy;                                    // same as fraction -= 2*dy
            drawpixel( x0, y0,pix);
        }
    } else {
        int fraction = dx - (dy >> 1);
        while (y0 != y1) {
            if (fraction >= 0) {
                x0 += stepx;
                fraction -= dy;
            }
            y0 += stepy;
            fraction += dx;
            drawpixel( x0, y0,pix);
        }
    }
}

//*****************************************************************************


void drawframe(unsigned x,unsigned y,unsigned sx,unsigned sy,unsigned char col,unsigned char col2,char text_[]){
    unsigned i,j,m;{

       m=(sx-x);                       //differential
       j=m/8;                          //adjust
       j=j-1;                          //more adjustment
       gotoxy(x,y);printf("É");       //Top left corner of drawframe
       gotoxy(sx,y);printf("»");      //Top right corner of drawframe
       gotoxy(x,sy);printf("È");      //Bottom left corner of drawframe
       gotoxy(sx,sy);printf("¼");     //Bottom right corner of drawframe

       for (i=x+1;i<sx;i++){
          gotoxy(i,y);printf("Í");     // Top horizontol line
          gotoxy(i,sy);printf("Í");    // Bottom Horizontal line
       }

       for (i=y+1;i<sy;i++){
          gotoxy(x,i);printf("º");     //Left Vertical line
          gotoxy(sx,i);printf("º");    //Right Vertical Line
       }

          gotoxy(x+j,y);printf(text_); //put Title
          gotoxy(1,24);
    }
}

 //*****************************************************************************

void drawfilledrectangle(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2,unsigned char bkcol){
    int x,y;
    setcolor(bkcol);                       //Set to color bkcol

    for (y=y1;y<y2;y++){                    //Fill Y Region Loop
        for (x=x1;x<x2;x++) {              //Fill X region Loop
          gotoxy(x,y);printf(" ");       //Draw Solid space
        }
    }
}

//*****************************************************************************

void drawwindow(unsigned x,unsigned y,unsigned sx,unsigned sy,
         unsigned char col, unsigned char col2,unsigned char bkcol,char text_[]){
    drawfilledrectangle(x,y,sx,sy,bkcol);
    drawframe(x,y,sx,sy,col,col2,text_);
}

//*****************************************************************************


void drawcolorpalette(){
    for (int i=0;i<16;i++){
        for (int j=0;j<16;j++){
            setForeGroundAndBackGroundColor(i,j);
            gotoxy(i*4,j);printf("%d",(i*j)+1);


        }

    }

}


//*****************************************************************************
于 2016-08-31T06:11:03.140 回答