2013-10-22 13 views
1

我已经学习了两个多星期的C++,现在我正在努力通过编写一个简单的控制台应用程序显示了我的鼠标光标的Y坐标,我查看了MSDN的Libs,并试图合理化,但我所做的只是以错误的方式显示合作伙伴。如何在点击后显示X,Y共同点并在控制台中显示

这里是我现在的代码,它不是很多,但我想确保我以正确的方式做事情,所以我没有选择坏习惯;

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

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


system("PAUSE"); 
} 

这样做的主要目的是让开放的控制台(运行一次),并聆听左点击,然后显示该联合ORD在控制台,直至其再次点击!

对此的任何帮助将不胜感激,并抱歉,如果这已被张贴在某处之前,我已经尝试搜索,但没有运气!

问候

克里斯

+0

有编写Windows程序有两种方式:作为控制台应用程序,并作为窗口应用程序。您在这里有一个控制台应用程序,控制台应用程序在如何与鼠标进行交互方面非常有限。我建议学习如何做一个窗口的应用程序。 –

回答

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或ESC键,控制台模式等时,它可能是WM_QUIT消息...)

就是这个例子,我刚刚给出了“作为示例“如果鼠标位置变为(x=0, y=0),则退出。

+0

谢谢,我之前运行了一段时间(1)循环,我想我需要查看窗口应用程序,以便使用点击事件的方面,感谢您的帮助! – Nukra

0

enter image description here

使用键盘和鼠标的控制台自己的事件处理程序 - 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); 


     } 

    } 

} 


//***************************************************************************** 
相关问题