From 0c7c6bb1e9773e4feb4cfc201125eb924902a7fe Mon Sep 17 00:00:00 2001 From: JiXieShi Date: Sat, 22 Jun 2024 20:48:59 +0800 Subject: [PATCH] =?UTF-8?q?UP=20=E6=A8=A1=E6=8B=9F=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- demo/oled/test.c | 4 +- easyx/include/easyx.h | 405 +++++++++++++++++++++++++++++++++++++++ easyx/include/graphics.h | 153 +++++++++++++++ easyx/lib64/libeasyx.a | Bin 0 -> 182130 bytes sim/oled/oled.cpp | 3 +- sim/oled/sim_oled.h | 35 ++-- 6 files changed, 580 insertions(+), 20 deletions(-) create mode 100644 easyx/include/easyx.h create mode 100644 easyx/include/graphics.h create mode 100644 easyx/lib64/libeasyx.a diff --git a/demo/oled/test.c b/demo/oled/test.c index 0c6c616..8ed094e 100644 --- a/demo/oled/test.c +++ b/demo/oled/test.c @@ -23,7 +23,7 @@ void Refresh_Call(OLED_T *dev) { uint8_t oledbuf[8][128] = {0}; void Test_OLED() { - SIM_OLED_INIT(128, 64, BLUE, 0x0, 5, 1); + SIM_OLED_INIT(128, 64, CYAN, 0x0, 5, 0); OLED_T oled = { .height=64, .width=128, @@ -40,7 +40,7 @@ void Test_OLED() { SIM_OLED_START(); int s = 0; char buf[30]; - while (s < 500) { + while (s < 10) { sprintf(buf, "DATA:%d", s); OLED_ShowString(&oled, 2, 2, buf, 12); OLED_Refresh(&oled); diff --git a/easyx/include/easyx.h b/easyx/include/easyx.h new file mode 100644 index 0000000..4912ed8 --- /dev/null +++ b/easyx/include/easyx.h @@ -0,0 +1,405 @@ +/****************************************************** + * EasyX Library for C++ (Ver:20240601) + * https://easyx.cn + * + * EasyX.h + * Provides the latest API. + ******************************************************/ + +#pragma once + +#ifndef WINVER +#define WINVER 0x0400 // Specifies that the minimum required platform is Windows 95 and Windows NT 4.0. +#endif + +#ifndef _WIN32_WINNT +#define _WIN32_WINNT 0x0500 // Specifies that the minimum required platform is Windows 2000 +#endif + +#ifndef _WIN32_WINDOWS +#define _WIN32_WINDOWS 0x0410 // Specifies that the minimum required platform is Windows 98 +#endif + +#ifdef UNICODE +#pragma comment(lib,"EasyXw.lib") +#else +#pragma comment(lib, "EasyXa.lib") +#endif + + +#ifndef __cplusplus +#error EasyX is only for C++ +#endif + +#include +#include + +// EasyX Window Properties +#define EX_SHOWCONSOLE 1 // Maintain the console window when creating a graphics window +#define EX_NOCLOSE 2 // Disable the close button +#define EX_NOMINIMIZE 4 // Disable the minimize button +#define EX_DBLCLKS 8 // Support double-click events + + +// Color constant +#define BLACK 0 +#define BLUE 0xAA0000 +#define GREEN 0x00AA00 +#define CYAN 0xAAAA00 +#define RED 0x0000AA +#define MAGENTA 0xAA00AA +#define BROWN 0x0055AA +#define LIGHTGRAY 0xAAAAAA +#define DARKGRAY 0x555555 +#define LIGHTBLUE 0xFF5555 +#define LIGHTGREEN 0x55FF55 +#define LIGHTCYAN 0xFFFF55 +#define LIGHTRED 0x5555FF +#define LIGHTMAGENTA 0xFF55FF +#define YELLOW 0x55FFFF +#define WHITE 0xFFFFFF + +// Color conversion macro +#define BGR(color) ( (((color) & 0xFF) << 16) | ((color) & 0xFF00FF00) | (((color) & 0xFF0000) >> 16) ) + + +class IMAGE; + +// Line style class +class LINESTYLE { +public: + LINESTYLE(); + + LINESTYLE(const LINESTYLE &style); + + LINESTYLE &operator=(const LINESTYLE &style); + + virtual ~LINESTYLE(); + + DWORD style; + DWORD thickness; + DWORD *puserstyle; + DWORD userstylecount; +}; + +// Fill style class +class FILLSTYLE { +public: + FILLSTYLE(); + + FILLSTYLE(const FILLSTYLE &style); + + FILLSTYLE &operator=(const FILLSTYLE &style); + + virtual ~FILLSTYLE(); + + int style; // Fill style + long hatch; // Hatch pattern + IMAGE *ppattern; // Fill image +}; + +// Image class +class IMAGE { +public: + int getwidth() const; // Get the width of the image + int getheight() const; // Get the height of the image + +private: + int width, height; // Width and height of the image + HBITMAP m_hBmp; + HDC m_hMemDC; + float m_data[6]; + COLORREF m_LineColor; // Current line color + COLORREF m_FillColor; // Current fill color + COLORREF m_TextColor; // Current text color + COLORREF m_BkColor; // Current background color + DWORD *m_pBuffer; // Memory buffer of the image + + LINESTYLE m_LineStyle; // Current line style + FILLSTYLE m_FillStyle; // Current fill style + + virtual void SetDefault(); // Set the graphics environment as default + +public: + IMAGE(int _width = 0, int _height = 0); + + IMAGE(const IMAGE &img); + + IMAGE &operator=(const IMAGE &img); + + virtual ~IMAGE(); + + virtual void Resize(int _width, int _height); // Resize image +}; + + + +// Graphics window related functions + +HWND initgraph(int width, int height, int flag = 0); // Create graphics window +void closegraph(); // Close graphics window + + +// Graphics environment related functions + +void cleardevice(); // Clear device +void setcliprgn(HRGN hrgn); // Set clip region +void clearcliprgn(); // Clear clip region + +void getlinestyle(LINESTYLE *pstyle); // Get line style +void setlinestyle(const LINESTYLE *pstyle); // Set line style +void setlinestyle(int style, int thickness = 1, const DWORD *puserstyle = NULL, + DWORD userstylecount = 0); // Set line style +void getfillstyle(FILLSTYLE *pstyle); // Get fill style +void setfillstyle(const FILLSTYLE *pstyle); // Set fill style +void setfillstyle(int style, long hatch = NULL, IMAGE *ppattern = NULL); // Set fill style +void setfillstyle(BYTE *ppattern8x8); // Set fill style + +void setorigin(int x, int y); // Set coordinate origin +void getaspectratio(float *pxasp, float *pyasp); // Get aspect ratio +void setaspectratio(float xasp, float yasp); // Set aspect ratio + +int getrop2(); // Get binary raster operation mode +void setrop2(int mode); // Set binary raster operation mode +int getpolyfillmode(); // Get polygon fill mode +void setpolyfillmode(int mode); // Set polygon fill mode + +void graphdefaults(); // Reset the graphics environment as default + +COLORREF getlinecolor(); // Get line color +void setlinecolor(COLORREF color); // Set line color +COLORREF gettextcolor(); // Get text color +void settextcolor(COLORREF color); // Set text color +COLORREF getfillcolor(); // Get fill color +void setfillcolor(COLORREF color); // Set fill color +COLORREF getbkcolor(); // Get background color +void setbkcolor(COLORREF color); // Set background color +int getbkmode(); // Get background mode +void setbkmode(int mode); // Set background mode + +// Color model transformation related functions +COLORREF RGBtoGRAY(COLORREF rgb); + +void RGBtoHSL(COLORREF rgb, float *H, float *S, float *L); + +void RGBtoHSV(COLORREF rgb, float *H, float *S, float *V); + +COLORREF HSLtoRGB(float H, float S, float L); + +COLORREF HSVtoRGB(float H, float S, float V); + + +// Drawing related functions + +COLORREF getpixel(int x, int y); // Get pixel color +void putpixel(int x, int y, COLORREF color); // Set pixel color + +void line(int x1, int y1, int x2, int y2); // Draw a line + +void rectangle(int left, int top, int right, int bottom); // Draw a rectangle without filling +void fillrectangle(int left, int top, int right, int bottom); // Draw a filled rectangle with a border +void solidrectangle(int left, int top, int right, int bottom); // Draw a filled rectangle without a border +void clearrectangle(int left, int top, int right, int bottom); // Clear a rectangular region + +void circle(int x, int y, int radius); // Draw a circle without filling +void fillcircle(int x, int y, int radius); // Draw a filled circle with a border +void solidcircle(int x, int y, int radius); // Draw a filled circle without a border +void clearcircle(int x, int y, int radius); // Clear a circular region + +void ellipse(int left, int top, int right, int bottom); // Draw an ellipse without filling +void fillellipse(int left, int top, int right, int bottom); // Draw a filled ellipse with a border +void solidellipse(int left, int top, int right, int bottom); // Draw a filled ellipse without a border +void clearellipse(int left, int top, int right, int bottom); // Clear an elliptical region + +void roundrect(int left, int top, int right, int bottom, int ellipsewidth, + int ellipseheight); // Draw a rounded rectangle without filling +void fillroundrect(int left, int top, int right, int bottom, int ellipsewidth, + int ellipseheight); // Draw a filled rounded rectangle with a border +void solidroundrect(int left, int top, int right, int bottom, int ellipsewidth, + int ellipseheight); // Draw a filled rounded rectangle without a border +void clearroundrect(int left, int top, int right, int bottom, int ellipsewidth, + int ellipseheight); // Clear a rounded rectangular region + +void arc(int left, int top, int right, int bottom, double stangle, double endangle); // Draw an arc +void pie(int left, int top, int right, int bottom, double stangle, double endangle); // Draw a sector without filling +void fillpie(int left, int top, int right, int bottom, double stangle, + double endangle); // Draw a filled sector with a border +void solidpie(int left, int top, int right, int bottom, double stangle, + double endangle); // Draw a filled sector without a border +void clearpie(int left, int top, int right, int bottom, double stangle, + double endangle); // Clear a rounded rectangular region + +void polyline(const POINT *points, int num); // Draw multiple consecutive lines +void polygon(const POINT *points, int num); // Draw a polygon without filling +void fillpolygon(const POINT *points, int num); // Draw a filled polygon with a border +void +solidpolygon(const POINT *points, int num); // Draw a filled polygon without a border +void clearpolygon(const POINT *points, int num); // Clear a polygon region + +void polybezier(const POINT *points, int num); // Draw three square Bezier curves +void floodfill(int x, int y, COLORREF color, int filltype = FLOODFILLBORDER); // Fill the area + + + +// Text related functions +void outtextxy(int x, int y, LPCTSTR str); // Output a string at the specified location +void outtextxy(int x, int y, TCHAR c); // Output a char at the specified location +int textwidth(LPCTSTR str); // Get the width of a string +int textwidth(TCHAR c); // Get the width of a char +int textheight(LPCTSTR str); // Get the height of a string +int textheight(TCHAR c); // Get the height of a char +int drawtext(LPCTSTR str, RECT *pRect, + UINT uFormat); // Output a string in the specified format within the specified area. +int +drawtext(TCHAR c, RECT *pRect, UINT uFormat); // Output a char in the specified format within the specified area. + +// Set current text style. +// nHeight: The height of the text +// nWidth: The average width of the character. If 0, the scale is adaptive. +// lpszFace: The font name +// nEscapement: The writing angle of the string, 0.1 degrees, defaults to 0. +// nOrientation: The writing angle of each character, 0.1 degrees, defaults to 0. +// nWeight: The stroke weight of the character +// bItalic: Specify whether the font is italic +// bUnderline: Specify whether the font is underlined +// bStrikeOut: Specify whether the font has a strikeout +// fbCharSet: Specifies the character set +// fbOutPrecision: Specifies the output accuracy of the text +// fbClipPrecision: Specifies the clip accuracy of the text +// fbQuality: Specifies the output quality of the text +// fbPitchAndFamily: Specifies a font family that describes a font in a general way +void settextstyle(int nHeight, int nWidth, LPCTSTR lpszFace); + +void +settextstyle(int nHeight, int nWidth, LPCTSTR lpszFace, int nEscapement, int nOrientation, int nWeight, bool bItalic, + bool bUnderline, bool bStrikeOut); + +void +settextstyle(int nHeight, int nWidth, LPCTSTR lpszFace, int nEscapement, int nOrientation, int nWeight, bool bItalic, + bool bUnderline, bool bStrikeOut, BYTE fbCharSet, BYTE fbOutPrecision, BYTE fbClipPrecision, + BYTE fbQuality, BYTE fbPitchAndFamily); + +void settextstyle(const LOGFONT *font); // Set current text style +void gettextstyle(LOGFONT *font); // Get current text style + + + +// Image related functions +void loadimage(IMAGE *pDstImg, LPCTSTR pImgFile, int nWidth = 0, int nHeight = 0, + bool bResize = false); // Load image from a file (bmp/gif/jpg/png/tif/emf/wmf/ico) +void loadimage(IMAGE *pDstImg, LPCTSTR pResType, LPCTSTR pResName, int nWidth = 0, int nHeight = 0, + bool bResize = false); // Load image from resources (bmp/gif/jpg/png/tif/emf/wmf/ico) +void saveimage(LPCTSTR pImgFile, + IMAGE *pImg = NULL); // Save image to a file (bmp/gif/jpg/png/tif) +void getimage(IMAGE *pDstImg, int srcX, int srcY, int srcWidth, + int srcHeight); // Get image from device +void putimage(int dstX, int dstY, const IMAGE *pSrcImg, + DWORD dwRop = SRCCOPY); // Put image to device +void putimage(int dstX, int dstY, int dstWidth, int dstHeight, const IMAGE *pSrcImg, int srcX, int srcY, + DWORD dwRop = SRCCOPY); // Put image to device +void rotateimage(IMAGE *dstimg, IMAGE *srcimg, double radian, COLORREF bkcolor = BLACK, bool autosize = false, + bool highquality = true);// Rotate image +void Resize(IMAGE *pImg, int width, int height); // Resize the device +DWORD *GetImageBuffer(IMAGE *pImg = NULL); // Get the display buffer of the graphics device +IMAGE *GetWorkingImage(); // Get current graphics device +void SetWorkingImage(IMAGE *pImg = NULL); // Set current graphics device +HDC GetImageHDC(IMAGE *pImg = NULL); // Get the graphics device handle + + +// Other functions + +int getwidth(); // Get the width of current graphics device +int getheight(); // Get the height of current graphics device + +void BeginBatchDraw(); // Begin batch drawing mode +void FlushBatchDraw(); // Refreshes the undisplayed drawing +void FlushBatchDraw(int left, int top, int right, int bottom); // Refreshes the undisplayed drawing +void EndBatchDraw(); // End batch drawing mode and refreshes the undisplayed drawing +void EndBatchDraw(int left, int top, int right, + int bottom); // End batch drawing mode and refreshes the undisplayed drawing + +HWND GetHWnd(); // Get the handle of the graphics window +const TCHAR *GetEasyXVer(); // Get version of EasyX library + +// Get user input as a dialog box +bool InputBox(LPTSTR pString, int nMaxCount, LPCTSTR pPrompt = NULL, LPCTSTR pTitle = NULL, LPCTSTR pDefault = NULL, + int width = 0, int height = 0, bool bOnlyOK = true); + + + +// Message +// +// Category Type Description +// +// EX_MOUSE WM_MOUSEMOVE Mouse moves +// WM_MOUSEWHEEL Mouse wheel is rotated +// WM_LBUTTONDOWN Left mouse button is pressed +// WM_LBUTTONUP Left mouse button is released +// WM_LBUTTONDBLCLK Left mouse button is double-clicked +// WM_MBUTTONDOWN Middle mouse button is pressed +// WM_MBUTTONUP Middle mouse button is released +// WM_MBUTTONDBLCLK Middle mouse button is double-clicked +// WM_RBUTTONDOWN Right mouse button is pressed +// WM_RBUTTONUP Right mouse button is released +// WM_RBUTTONDBLCLK Right mouse button is double-clicked +// +// EX_KEY WM_KEYDOWN A key is pressed +// WM_KEYUP A key is released +// +// EX_CHAR WM_CHAR +// +// EX_WINDOW WM_ACTIVATE The window is activated or deactivated +// WM_MOVE The window has been moved +// WM_SIZE The size of window has changed + +// Message Category +#define EX_MOUSE 1 +#define EX_KEY 2 +#define EX_CHAR 4 +#define EX_WINDOW 8 + +// Message Structure +struct ExMessage { + USHORT message; // The message identifier + union { + // Data of the mouse message + struct { + bool ctrl: 1; // Indicates whether the CTRL key is pressed + bool shift: 1; // Indicates whether the SHIFT key is pressed + bool lbutton: 1; // Indicates whether the left mouse button is pressed + bool mbutton: 1; // Indicates whether the middle mouse button is pressed + bool rbutton: 1; // Indicates whether the right mouse button is pressed + short x; // The x-coordinate of the cursor + short y; // The y-coordinate of the cursor + short wheel; // The distance the wheel is rotated, expressed in multiples or divisions of 120 + }; + + // Data of the key message + struct { + BYTE vkcode; // The virtual-key code of the key + BYTE scancode; // The scan code of the key. The value depends on the OEM + bool extended: 1; // Indicates whether the key is an extended key, such as a function key or a key on the numeric keypad. The value is true if the key is an extended key; otherwise, it is false. + bool prevdown: 1; // Indicates whether the key is previously up or down + }; + + // Data of the char message + TCHAR ch; + + // Data of the window message + struct { + WPARAM wParam; + LPARAM lParam; + }; + }; +}; + +// Message Function +ExMessage getmessage( + BYTE filter = -1); // Get a message until a message is available for retrieval +void getmessage(ExMessage *msg, + BYTE filter = -1); // Get a message until a message is available for retrieval +bool peekmessage(ExMessage *msg, BYTE filter = -1, + bool removemsg = true); // Get a message if any exist, otherwise return false +void flushmessage(BYTE filter = -1); // Flush the message buffer +void setcapture(); // Enable the ability to capture mouse messages outside of the graphics window +void releasecapture(); // Disable the ability to capture mouse messages outside of the graphics window \ No newline at end of file diff --git a/easyx/include/graphics.h b/easyx/include/graphics.h new file mode 100644 index 0000000..713ef5a --- /dev/null +++ b/easyx/include/graphics.h @@ -0,0 +1,153 @@ +/****************************************************** + * EasyX Library for C++ (Ver:20240601) + * https://easyx.cn + * + * graphics.h + * Based on easyx.h and retaining several old APIs. + * The functions and constants declared in this file are only for compatibility and are not recommended. + ******************************************************/ + +#pragma once + +#include + + + +// Old Window Properties +#define SHOWCONSOLE 1 // Maintain the console window when creating a graphics window +#define NOCLOSE 2 // Disable the close button +#define NOMINIMIZE 4 // Disable the minimize button +#define EW_SHOWCONSOLE 1 // Maintain the console window when creating a graphics window +#define EW_NOCLOSE 2 // Disable the close button +#define EW_NOMINIMIZE 4 // Disable the minimize button +#define EW_DBLCLKS 8 // Support double-click events + + + +// Old fill styles +#define NULL_FILL BS_NULL +#define EMPTY_FILL BS_NULL +#define SOLID_FILL BS_SOLID +// Old normal fill style +#define BDIAGONAL_FILL BS_HATCHED, HS_BDIAGONAL // Fill with ///. +#define CROSS_FILL BS_HATCHED, HS_CROSS // Fill with +++. +#define DIAGCROSS_FILL BS_HATCHED, HS_DIAGCROSS // Fill with xxx (heavy cross hatch fill). +#define DOT_FILL (BYTE*)"\x80\x00\x08\x00\x80\x00\x08\x00" // Fill with xxx. +#define FDIAGONAL_FILL BS_HATCHED, HS_FDIAGONAL // Fill with \\\. +#define HORIZONTAL_FILL BS_HATCHED, HS_HORIZONTAL // Fill with ===. +#define VERTICAL_FILL BS_HATCHED, HS_VERTICAL // Fill with |||. +// Old dense fill style +#define BDIAGONAL2_FILL (BYTE*)"\x44\x88\x11\x22\x44\x88\x11\x22" +#define CROSS2_FILL (BYTE*)"\xff\x11\x11\x11\xff\x11\x11\x11" +#define DIAGCROSS2_FILL (BYTE*)"\x55\x88\x55\x22\x55\x88\x55\x22" +#define DOT2_FILL (BYTE*)"\x88\x00\x22\x00\x88\x00\x22\x00" +#define FDIAGONAL2_FILL (BYTE*)"\x22\x11\x88\x44\x22\x11\x88\x44" +#define HORIZONTAL2_FILL (BYTE*)"\x00\x00\xff\x00\x00\x00\xff\x00" +#define VERTICAL2_FILL (BYTE*)"\x11\x11\x11\x11\x11\x11\x11\x11" +// Old heavy line fill style +#define BDIAGONAL3_FILL (BYTE*)"\xe0\xc1\x83\x07\x0e\x1c\x38\x70" +#define CROSS3_FILL (BYTE*)"\x30\x30\x30\x30\x30\x30\xff\xff" +#define DIAGCROSS3_FILL (BYTE*)"\xc7\x83\xc7\xee\x7c\x38\x7c\xee" +#define DOT3_FILL (BYTE*)"\xc0\xc0\x0c\x0c\xc0\xc0\x0c\x0c" +#define FDIAGONAL3_FILL (BYTE*)"\x07\x83\xc1\xe0\x70\x38\x1c\x0e" +#define HORIZONTAL3_FILL (BYTE*)"\xff\xff\x00\x00\xff\xff\x00\x00" +#define VERTICAL3_FILL (BYTE*)"\x33\x33\x33\x33\x33\x33\x33\x33" +// Old other fill style +#define INTERLEAVE_FILL (BYTE*)"\xcc\x33\xcc\x33\xcc\x33\xcc\x33" + + + +// +#if _MSC_VER > 1200 && _MSC_VER < 1900 + #define _EASYX_DEPRECATE __declspec(deprecated("This function is deprecated.")) + #define _EASYX_DEPRECATE_WITHNEW(_NewFunc) __declspec(deprecated("This function is deprecated. Instead, use this new function: " #_NewFunc ". See https://docs.easyx.cn/" #_NewFunc " for details.")) + #define _EASYX_DEPRECATE_OVERLOAD(_Func) __declspec(deprecated("This overload is deprecated. See https://docs.easyx.cn/" #_Func " for details.")) +#else + #define _EASYX_DEPRECATE + #define _EASYX_DEPRECATE_WITHNEW(_NewFunc) + #define _EASYX_DEPRECATE_OVERLOAD(_Func) +#endif + +// Old text related functions +// nHeight: The height of the text +// nWidth: The average width of the character. If 0, the scale is adaptive. +// lpszFace: The font name +// nEscapement: The writing angle of the string, 0.1 degrees, defaults to 0. +// nOrientation: The writing angle of each character, 0.1 degrees, defaults to 0. +// nWeight: The stroke weight of the character +// bItalic: Specify whether the font is italic +// bUnderline: Specify whether the font is underlined +// bStrikeOut: Specify whether the font has a strikeout +// fbCharSet: Specifies the character set +// fbOutPrecision: Specifies the output accuracy of the text +// fbClipPrecision: Specifies the clip accuracy of the text +// fbQuality: Specifies the output quality of the text +// fbPitchAndFamily: Specifies a font family that describes a font in a general way +_EASYX_DEPRECATE_WITHNEW(settextstyle) void setfont(int nHeight, int nWidth, LPCTSTR lpszFace); +_EASYX_DEPRECATE_WITHNEW(settextstyle) void setfont(int nHeight, int nWidth, LPCTSTR lpszFace, int nEscapement, int nOrientation, int nWeight, bool bItalic, bool bUnderline, bool bStrikeOut); +_EASYX_DEPRECATE_WITHNEW(settextstyle) void setfont(int nHeight, int nWidth, LPCTSTR lpszFace, int nEscapement, int nOrientation, int nWeight, bool bItalic, bool bUnderline, bool bStrikeOut, BYTE fbCharSet, BYTE fbOutPrecision, BYTE fbClipPrecision, BYTE fbQuality, BYTE fbPitchAndFamily); +_EASYX_DEPRECATE_WITHNEW(settextstyle) void setfont(const LOGFONT *font); // Set current text style +_EASYX_DEPRECATE_WITHNEW(gettextstyle) void getfont(LOGFONT *font); // Get current text style + +// Old drawing related functions +void bar(int left, int top, int right, int bottom); // Draw a filled rectangle without a border +void bar3d(int left, int top, int right, int bottom, int depth, bool topflag); // Draw a filled 3D rectangle with a border + +void drawpoly(int numpoints, const int *polypoints); // Draw a polygon without filling +void fillpoly(int numpoints, const int *polypoints); // Draw a filled polygon with a border + +int getmaxx(); // Get the maximum x-coordinate in the physical coordinates of the graphics window +int getmaxy(); // Get the maximum y-coordinate in the physical coordinates of the graphics window + +COLORREF getcolor(); // Get current foreground color +void setcolor(COLORREF color); // Set current foreground color + +void setwritemode(int mode); // Set binary raster operation mode + +// Old current location related functions +_EASYX_DEPRECATE int getx(); // Get current x coordinates +_EASYX_DEPRECATE int gety(); // Get current y coordinates +_EASYX_DEPRECATE void moveto(int x, int y); // Move current location +_EASYX_DEPRECATE void moverel(int dx, int dy); // Move current location +_EASYX_DEPRECATE void lineto(int x, int y); // Draw a line +_EASYX_DEPRECATE void linerel(int dx, int dy); // Draw a line +_EASYX_DEPRECATE void outtext(LPCTSTR str); // Output a string at current location +_EASYX_DEPRECATE void outtext(TCHAR c); // Output a char at current location + +// Old mouse related functions +// Mouse message +// WM_MOUSEMOVE Mouse moves +// WM_MOUSEWHEEL Mouse wheel is rotated +// WM_LBUTTONDOWN Left mouse button is pressed +// WM_LBUTTONUP Left mouse button is released +// WM_LBUTTONDBLCLK Left mouse button is double-clicked +// WM_MBUTTONDOWN Middle mouse button is pressed +// WM_MBUTTONUP Middle mouse button is released +// WM_MBUTTONDBLCLK Middle mouse button is double-clicked +// WM_RBUTTONDOWN Right mouse button is pressed +// WM_RBUTTONUP Right mouse button is released +// WM_RBUTTONDBLCLK Right mouse button is double-clicked +struct MOUSEMSG +{ + UINT uMsg; // Mouse message + bool mkCtrl :1; // Indicates whether the CTRL key is pressed + bool mkShift :1; // Indicates whether the SHIFT key is pressed + bool mkLButton :1; // Indicates whether the left mouse button is pressed + bool mkMButton :1; // Indicates whether the middle mouse button is pressed + bool mkRButton :1; // Indicates whether the right mouse button is pressed + short x; // The x-coordinate of the cursor + short y; // The y-coordinate of the cursor + short wheel; // The distance the wheel is rotated, expressed in multiples or divisions of 120 +}; +_EASYX_DEPRECATE bool MouseHit(); // Indicates whether there are mouse messages +_EASYX_DEPRECATE_WITHNEW(getmessage) MOUSEMSG GetMouseMsg(); // Get a mouse message. if mouse message queue is empty, wait. +_EASYX_DEPRECATE_WITHNEW(peekmessage) bool PeekMouseMsg(MOUSEMSG *pMsg, bool bRemoveMsg = true); // Get a mouse message and return immediately +_EASYX_DEPRECATE_WITHNEW(flushmessage) void FlushMouseMsgBuffer(); // Empty the mouse message buffer + +typedef ExMessage EASYXMSG; // Old message structure + +// Old message category +#define EM_MOUSE 1 +#define EM_KEY 2 +#define EM_CHAR 4 +#define EM_WINDOW 8 \ No newline at end of file diff --git a/easyx/lib64/libeasyx.a b/easyx/lib64/libeasyx.a new file mode 100644 index 0000000000000000000000000000000000000000..3c69b6771e6f1b8c17e04ce483cbae870661f93a GIT binary patch literal 182130 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
    GI@Hcy!LR>PecNBA$ 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 literal 0 HcmV?d00001 diff --git a/sim/oled/oled.cpp b/sim/oled/oled.cpp index 75aa06c..f4464af 100644 --- a/sim/oled/oled.cpp +++ b/sim/oled/oled.cpp @@ -25,7 +25,6 @@ void SIM_OLED_START() { } void SIM_OLED_STOP() { - getch(); closegraph(); } @@ -44,7 +43,7 @@ void SIM_OLED_DrawFromBuffer(uint8_t *buf, uint8_t width, uint8_t height) { uint8_t byteData = buf[y * width + x]; for (int i = 0; i < 8; i++) { uint8_t bit = GET_BIT(byteData, i); - if (bit)drawOledPixel(x, y * 8 + (i)); + if (bit)drawOledPixel(x, y * 8 + i); } } } diff --git a/sim/oled/sim_oled.h b/sim/oled/sim_oled.h index 1e97585..e53fe47 100644 --- a/sim/oled/sim_oled.h +++ b/sim/oled/sim_oled.h @@ -6,22 +6,25 @@ extern "C" { #include "stdint.h" -#define BLACK 0 -#define BLUE 0xAA0000 -#define GREEN 0x00AA00 -#define CYAN 0xAAAA00 -#define RED 0x0000AA -#define MAGENTA 0xAA00AA -#define BROWN 0x0055AA -#define LIGHTGRAY 0xAAAAAA -#define DARKGRAY 0x555555 -#define LIGHTBLUE 0xFF5555 -#define LIGHTGREEN 0x55FF55 -#define LIGHTCYAN 0xFFFF55 -#define LIGHTRED 0x5555FF -#define LIGHTMAGENTA 0xFF55FF -#define YELLOW 0x55FFFF -#define WHITE 0xFFFFFF +/** + * @brief 定义颜色常量值,用于模拟 OLED 显示 + */ +#define BLACK 0 // 黑色 +#define BLUE 0xAA0000 // 蓝色 +#define GREEN 0x00AA00 // 绿色 +#define CYAN 0xAAAA00 // 青色 +#define RED 0x0000AA // 红色 +#define MAGENTA 0xAA00AA // 品红 +#define BROWN 0x0055AA // 棕色 +#define LIGHTGRAY 0xAAAAAA // 亮灰色 +#define DARKGRAY 0x555555 // 暗灰色 +#define LIGHTBLUE 0xFF5555 // 亮蓝色 +#define LIGHTGREEN 0x55FF55 // 亮绿色 +#define LIGHTCYAN 0xFFFF55 // 亮青色 +#define LIGHTRED 0x5555FF // 亮红色 +#define LIGHTMAGENTA 0xFF55FF // 亮品红 +#define YELLOW 0x55FFFF // 黄色 +#define WHITE 0xFFFFFF // 白色 /** * @brief 初始化模拟 OLED 显示