EasyX鼠标函数和MBCS、Unicode编码

来源:互联网 发布:卡二的网络不好 编辑:程序博客网 时间:2024/06/06 01:41

O、函数

 kbhit() MouseHit()

MOUSEMSG m;
m = GetMouseMsg();

 solidpolygon((POINT*)p, 3); putpixel(p[3][0],p[3][1],0xee00ee); outtextxy(296, 310, _T("BestAns")); setwritemode(R2_XORPEN);

SYSTEMTIME ti;
GetLocalTime(&ti);

一、鼠标

   获取按键:               获取鼠标:
   char c;                    MOUSEMSG m;  if (kbhit())               if (MouseHit())      c = getch();               m = GetMouseMsg();
struct MOUSEMSG{    UINT uMsg;      // 当前鼠标消息    bool mkCtrl;    // Ctrl 键是否按下    bool mkShift;   // Shift 键是否按下    bool mkLButton; // 鼠标左键是否按下    bool mkMButton; // 鼠标中键是否按下    bool mkRButton; // 鼠标右键是否按下    int x;          // 当前鼠标 x 坐标    int y;          // 当前鼠标 y 坐标    int wheel;      // 鼠标滚轮滚动值};
  其中,“当前鼠标消息”可以是以下值:
//每个值类似于头文件中定义的宏,为4位十六进制数WM_MOUSEMOVE     鼠标移动消息WM_MOUSEWHEEL    鼠标滚轮拨动消息WM_LBUTTONDOWN   左键按下消息WM_LBUTTONUP     左键弹起消息WM_LBUTTONDBLCLK 左键双击消息WM_MBUTTONDOWN   中键按下消息WM_MBUTTONUP     中键弹起消息WM_MBUTTONDBLCLK 中键双击消息WM_RBUTTONDOWN   右键按下消息WM_RBUTTONUP     右键弹起消息WM_RBUTTONDBLCLK 右键双击消息
 例如,判断获取的消息是否是鼠标左键按下,可以用:
if (m.uMsg == WM_LBUTTONDOWN)
...

练习:(a ^ b) ^ b = a

#include <graphics.h>#include <conio.h>void main(){    // 初始化图形窗口    initgraph(640, 480);    int p[3][2];    setwritemode(R2_XORPEN);    MOUSEMSG m;                     // 定义鼠标消息    while(true)    {        for(int i=0;i<3;)        {            m = GetMouseMsg();  // 获取一条鼠标消息            if (m.uMsg == WM_LBUTTONDOWN)            {                p[i][0]=m.x;                p[i][1]=m.y;                putpixel(m.x,m.y,RED);                i++;            }        }        solidpolygon((POINT*)p, 3);        /*        switch(m.uMsg)        {            case WM_MOUSEMOVE:      // 鼠标移动的时候画红色的小点                putpixel(m.x, m.y, RED);                break;            case WM_LBUTTONDOWN:    // 如果点左键的同时按下了 Ctrl 键                if (m.mkCtrl)       // 画一个大方块                    rectangle(m.x-10, m.y-10, m.x+10, m.y+10);                else                // 画一个小方块                    rectangle(m.x-5, m.y-5, m.x+5, m.y+5);                break;            case WM_RBUTTONUP:                return;             // 按鼠标右键退出程序        }*/    }    // 关闭图形窗口    closegraph();}

这里写图片描述
二、随机数

srand((unsigned) time(NULL))n=rand()%p;

三、知识
(1)

outtextxy(10, 20, "Hello World");error C2665: 'outtextxy' : none of the 2 overloads could convert all the argument types

原因:

字符串常见的编码有两种:MBCS 和 Unicode。

VC6 默认使用的 MBCS 编码,而 VC2008 及高版本 VC 默认使用的 Unicode 编码。以下详细解释这个问题:

用 char 表示字符时,英文占用一个字节,中文站用两个字节。这样有一个严重的问题:两个连续字节,究竟是两个英文字符,还是一个中文字符?为了解决这个问题,Unicode 编码诞生了。Unicode 编码不管中文英文都用两个字节表示。对于 MBCS 编码,字符变量用 char 定义。对于 Unicode 编码中,字符变量用 wchar_t 定义。

为了提高代码的自适应性,微软在 tchar.h 里面定义了 TCHAR,而 TCHAR 会根据项目定义的编码,自动展开为 char 或 wchar_t。

 在 Windows API 和 EasyX 里面的大多数字符串指针都用的 LPCTSTR 或 LPTSTR 类型,LPCTSTR / LPTSTR 就是“Long Point (Const) Tchar STRing”的缩写。所以可以认为,LPCTSTR 就是 const TCHAR *,LPTSTR 就是 TCHAR * 。

解决:1.

(2)

error"The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _getch."
已经过时请使用 _getch.
原创粉丝点击