EasyX 提供的鼠標操作需要結合 Windows API 使用, 比較簡陋。官方示例用法是在 // https://codebus.cn/yangw/mouse-operation。
Raylib 可以提供強大的多的鼠標操作。不過爲了程序遷移的無痛感, 這裏用 Raylib 重新實現了 "鼠標操作“ 這個例子程序。主要不同點是, Raylib 直接在背景上繪製會出現頻繁的閃爍, 需要改爲創建 texture 作爲 canvas(鑲嵌在窗口上), 然後每一幀在 canvas 上繪製。
基於 EasyX
// 程序名稱:鼠標操作演示
// 編譯環境:Visual C++ 6.0~2022,EasyX_20220901
// https://easyx.cn
//
#include <graphics.h>
int main()
{
// 初始化圖形窗口
initgraph(640, 480);
ExMessage m; // 定義消息變量
while(true)
{
// 獲取一條鼠標或按鍵消息
m = getmessage(EX_MOUSE | EX_KEY);
switch(m.message)
{
case WM_MOUSEMOVE:
// 鼠標移動的時候畫紅色的小點
putpixel(m.x, m.y, RED);
break;
case WM_LBUTTONDOWN:
// 如果點左鍵的同時按下了 Ctrl 鍵
if (m.ctrl)
// 畫一個大方塊
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_KEYDOWN:
if (m.vkcode == VK_ESCAPE)
return 0; // 按 ESC 鍵退出程序
}
}
// 關閉圖形窗口
closegraph();
return 0;
}
基於 Raylib
// https://codebus.cn/yangw/mouse-operation
#include "raylib.h"
#include "raylib_helper.hpp"
#include <stdio.h>
#define WIDTH 640
#define HEIGHT 480
class Action
{
public:
Vector2 d; // mouse delta
Vector2 m; // mouse position
bool is_control_pressed;
bool is_mouse_left_button_pressed;
void init()
{
d = GetMouseDelta();
m = GetMousePosition();
is_mouse_left_button_pressed = IsMouseButtonPressed(MOUSE_BUTTON_LEFT);
is_control_pressed = IsKeyDown(KEY_LEFT_CONTROL);
}
void draw(RenderTexture2D target)
{
BeginTextureMode(target);
if (d.x != 0 || d.y != 0)
{
DrawPixel(m.x, m.y, RED);
}
else if (is_mouse_left_button_pressed)
{
if (is_control_pressed) // big rect
{
DrawRectangleLines(m.x - 10, m.y - 10, 20, 20, WHITE);
}
else // small rect
{
DrawRectangleLines(m.x - 5, m.y - 5, 10, 10, WHITE);
}
}
EndTextureMode();
}
};
int main()
{
InitWindow(WIDTH, HEIGHT, "Mouse Operation");
// Create a RenderTexture2D to use as a canvas
RenderTexture2D target = LoadRenderTexture(WIDTH, HEIGHT);
// Clear render texture before entering the game loop
BeginTextureMode(target);
ClearBackground(BLACK);
EndTextureMode();
SetTargetFPS(120);
int cnt = 0;
while (!WindowShouldClose())
{
cnt++;
Action act;
act.init();
BeginDrawing();
{
ClearBackground(BLACK);
DrawTextureRec(target.texture, make_rectangle(0, 0, (float)target.texture.width, (float)-target.texture.height),
make_vector(0, 0),
WHITE
);
act.draw(target);
}
EndDrawing();
}
UnloadRenderTexture(target); // Unload render texture
CloseWindow();
return 0;
}