From 740201fded63aadaec73f3786156133c6fabd785 Mon Sep 17 00:00:00 2001 From: werelone <569629550@qq.com> Date: Mon, 18 Sep 2017 23:59:08 +0800 Subject: [PATCH] Easy2D v1.0.3 --- Easy2D/App.cpp | 21 ++++++- Easy2D/Easy2D.vcxproj | 1 + Easy2D/Easy2D.vcxproj.filters | 3 + Easy2D/FreePool.cpp | 2 +- Easy2D/Msg/KeyMsg.cpp | 90 +++++++++++++++++++++--------- Easy2D/Msg/MouseMsg.cpp | 2 +- Easy2D/Node/Button/ImageButton.cpp | 6 ++ Easy2D/Node/Button/TextButton.cpp | 6 ++ Easy2D/Node/Image.cpp | 40 +++++++++---- Easy2D/Node/Layer.cpp | 28 ++++++++++ Easy2D/Node/MouseNode.cpp | 18 ++++-- Easy2D/Node/Shape/Shape.cpp | 14 +++-- Easy2D/Scene.cpp | 8 +++ Easy2D/Style/FontStyle.cpp | 16 ++++-- Easy2D/easy2d.h | 73 ++++++++++++++++++------ 15 files changed, 258 insertions(+), 70 deletions(-) create mode 100644 Easy2D/Node/Layer.cpp diff --git a/Easy2D/App.cpp b/Easy2D/App.cpp index b834aa5d..dee43bb6 100644 --- a/Easy2D/App.cpp +++ b/Easy2D/App.cpp @@ -153,10 +153,18 @@ void App::_initGraph() void App::_mainLoop() { - // 进入下一场景 + // 下一场景指针不为空时,切换场景 if (m_nextScene) { + // 执行当前场景的 onExit 函数 + if (m_currentScene) + { + m_currentScene->onExit(); + } + // 进入下一场景 _enterNextScene(); + // 执行当前场景的 onEnter 函数 + m_currentScene->onEnter(); } // 断言当前场景非空 assert(m_currentScene); @@ -252,6 +260,17 @@ void App::backScene() m_bSaveScene = false; } +void App::clearScene() +{ + // 清空场景栈 + while (m_sceneStack.size()) + { + auto temp = m_sceneStack.top(); + SAFE_DELETE(temp); + m_sceneStack.pop(); + } +} + void App::setBkColor(COLORREF color) { setbkcolor(color); diff --git a/Easy2D/Easy2D.vcxproj b/Easy2D/Easy2D.vcxproj index c95d3354..240d2245 100644 --- a/Easy2D/Easy2D.vcxproj +++ b/Easy2D/Easy2D.vcxproj @@ -344,6 +344,7 @@ + diff --git a/Easy2D/Easy2D.vcxproj.filters b/Easy2D/Easy2D.vcxproj.filters index fc9489b6..7d904b78 100644 --- a/Easy2D/Easy2D.vcxproj.filters +++ b/Easy2D/Easy2D.vcxproj.filters @@ -114,6 +114,9 @@ 婧愭枃浠禱Node\Button + + 婧愭枃浠禱Node + diff --git a/Easy2D/FreePool.cpp b/Easy2D/FreePool.cpp index 924a189d..0a95e706 100644 --- a/Easy2D/FreePool.cpp +++ b/Easy2D/FreePool.cpp @@ -1,7 +1,7 @@ #include "easy2d.h" // FreePool 释放池的实现机制: -/// Object 类中的引用计数(m_nRef)引用计数保证了指针的使用安全 +/// Object 类中的引用计数(m_nRef)保证了指针的使用安全 /// 它记录了对象被使用的次数,当计数为 0 时,FreePool 会自动释放这个对象 /// 所有的 Object 对象都应在被使用时(例如 Text 添加到了场景中) /// 调用 retain 函数保证该对象不被删除,并在不再使用时调用 release 函数 diff --git a/Easy2D/Msg/KeyMsg.cpp b/Easy2D/Msg/KeyMsg.cpp index 6fb0ddd8..eb483847 100644 --- a/Easy2D/Msg/KeyMsg.cpp +++ b/Easy2D/Msg/KeyMsg.cpp @@ -5,21 +5,6 @@ // 按键监听回调函数的容器 static std::vector s_vKeyMsg; -// 虚拟键值的容器 -static std::vector s_vKeys = { - KeyMsg::A, KeyMsg::B, KeyMsg::C, KeyMsg::D, KeyMsg::E, KeyMsg::F, KeyMsg::G, KeyMsg::H, KeyMsg::I, KeyMsg::J, - KeyMsg::K, KeyMsg::L, KeyMsg::M, KeyMsg::N, KeyMsg::O, KeyMsg::P, KeyMsg::Q, KeyMsg::R, KeyMsg::S, KeyMsg::T, - KeyMsg::U, KeyMsg::V, KeyMsg::W, KeyMsg::X, KeyMsg::Y, KeyMsg::Z, - KeyMsg::NUM_1, KeyMsg::NUM_2, KeyMsg::NUM_3, KeyMsg::NUM_4, KeyMsg::NUM_5, - KeyMsg::NUM_6, KeyMsg::NUM_7, KeyMsg::NUM_8, KeyMsg::NUM_9, KeyMsg::NUM_0, - KeyMsg::NUMPAD_1, KeyMsg::NUMPAD_2, KeyMsg::NUMPAD_3, KeyMsg::NUMPAD_4, KeyMsg::NUMPAD_5, - KeyMsg::NUMPAD_6, KeyMsg::NUMPAD_7, KeyMsg::NUMPAD_8, KeyMsg::NUMPAD_9, KeyMsg::NUMPAD_0, - KeyMsg::Enter, KeyMsg::Space, KeyMsg::Up, KeyMsg::Down, KeyMsg::Left, KeyMsg::Right, KeyMsg::Esc, - KeyMsg::Decimal, KeyMsg::Shift, KeyMsg::LShift, KeyMsg::RShift, KeyMsg::Ctrl, KeyMsg::LCtrl, KeyMsg::RCtrl, - KeyMsg::F1, KeyMsg::F2, KeyMsg::F3, KeyMsg::F4, KeyMsg::F5, KeyMsg::F6, - KeyMsg::F7, KeyMsg::F8, KeyMsg::F9, KeyMsg::F10, KeyMsg::F11, KeyMsg::F12 -}; - // 虚拟键值的定义 const VK_KEY KeyMsg::A = 'A'; const VK_KEY KeyMsg::B = 'B'; @@ -69,7 +54,6 @@ const VK_KEY KeyMsg::NUMPAD_8 = VK_NUMPAD8; const VK_KEY KeyMsg::NUMPAD_9 = VK_NUMPAD9; const VK_KEY KeyMsg::Enter = VK_RETURN; const VK_KEY KeyMsg::Space = VK_SPACE; -const VK_KEY KeyMsg::Decimal = VK_DECIMAL; const VK_KEY KeyMsg::Ctrl = VK_CONTROL; const VK_KEY KeyMsg::LCtrl = VK_LCONTROL; const VK_KEY KeyMsg::RCtrl = VK_RCONTROL; @@ -94,6 +78,8 @@ const VK_KEY KeyMsg::F10 = VK_F10; const VK_KEY KeyMsg::F11 = VK_F11; const VK_KEY KeyMsg::F12 = VK_F12; +static VK_KEY convert(int ascii); + KeyMsg::KeyMsg(tstring name, const KEY_CALLBACK & callback) { m_sName = name; @@ -111,17 +97,13 @@ void KeyMsg::onKbHit(VK_KEY key) void KeyMsg::__exec() { - if (_kbhit()) // 获取键盘消息 + if (_kbhit()) // 检测有无按键消息 { - for (VK_KEY key : s_vKeys) // 循环遍历所有的虚拟键值 + VK_KEY key = convert(_getch()); // 获取键盘消息 + + for (auto k : s_vKeyMsg) // 分发该消息 { - if (GetAsyncKeyState(key) & 0x8000) // 判断该键是否按下 - { - for (auto k : s_vKeyMsg) // 分发该按键消息 - { - k->onKbHit(key); // 执行按键回调函数 - } - } + k->onKbHit(key); // 执行按键回调函数 } } } @@ -134,7 +116,7 @@ void KeyMsg::addListener(tstring name, const KEY_CALLBACK & callback) s_vKeyMsg.push_back(key); } -bool KeyMsg::delListener(tstring name) +bool KeyMsg::deleteListener(tstring name) { // 创建迭代器 std::vector::iterator iter; @@ -169,4 +151,60 @@ bool KeyMsg::isKeyDown(VK_KEY key) { // 获取 key 的按下情况 return (GetAsyncKeyState(key) & 0x8000); +} + + +VK_KEY convert(int ascii) +{ + if (ascii >= 'a' && ascii <= 'z' || ascii >= 'A' && ascii <= 'Z') + { + return VK_KEY(ascii); + } + else if (ascii >= '0' && ascii <= '9') + { + return VK_KEY(ascii); + } + else if (ascii == 0x0D || ascii == 0x20 || ascii == 0x1B) + { + return VK_KEY(ascii); + } + else if (ascii == 0 || ascii == 0xE0) + { + switch (_getch()) + { + case 72: + return KeyMsg::Up; + case 75: + return KeyMsg::Left; + case 77: + return KeyMsg::Right; + case 80: + return KeyMsg::Down; + case 59: + return KeyMsg::F1; + case 60: + return KeyMsg::F2; + case 61: + return KeyMsg::F3; + case 62: + return KeyMsg::F4; + case 63: + return KeyMsg::F5; + case 64: + return KeyMsg::F6; + case 65: + return KeyMsg::F7; + case 66: + return KeyMsg::F8; + case 67: + return KeyMsg::F9; + case 133: + return KeyMsg::F10; + case 134: + return KeyMsg::F11; + default: + return 0; + } + } + return 0; } \ No newline at end of file diff --git a/Easy2D/Msg/MouseMsg.cpp b/Easy2D/Msg/MouseMsg.cpp index 6a3084d9..f4d459a0 100644 --- a/Easy2D/Msg/MouseMsg.cpp +++ b/Easy2D/Msg/MouseMsg.cpp @@ -54,7 +54,7 @@ void MouseMsg::addListener(tstring name, const MOUSE_CALLBACK & callback) s_vMouseMsg.push_back(mouse); } -bool MouseMsg::delListener(tstring name) +bool MouseMsg::deleteListener(tstring name) { // 创建迭代器 std::vector::iterator iter; diff --git a/Easy2D/Node/Button/ImageButton.cpp b/Easy2D/Node/Button/ImageButton.cpp index 08fe608c..566b6d06 100644 --- a/Easy2D/Node/Button/ImageButton.cpp +++ b/Easy2D/Node/Button/ImageButton.cpp @@ -11,6 +11,12 @@ ImageButton::ImageButton() : m_nHeight = 0; } +ImageButton::ImageButton(LPCTSTR image) : + ImageButton() +{ + setNormal(new Image(image)); // 设置按钮在正常状态时的图片 +} + ImageButton::ImageButton(Image * image) : ImageButton() { diff --git a/Easy2D/Node/Button/TextButton.cpp b/Easy2D/Node/Button/TextButton.cpp index 941f18ac..dc474bc3 100644 --- a/Easy2D/Node/Button/TextButton.cpp +++ b/Easy2D/Node/Button/TextButton.cpp @@ -11,6 +11,12 @@ TextButton::TextButton() : m_nHeight = 0; } +TextButton::TextButton(tstring text) : + TextButton() +{ + setNormal(new Text(text)); // 设置按钮在正常状态时的文字 +} + TextButton::TextButton(Text * text) : TextButton() { diff --git a/Easy2D/Node/Image.cpp b/Easy2D/Node/Image.cpp index 2ceab9a0..8b39fdda 100644 --- a/Easy2D/Node/Image.cpp +++ b/Easy2D/Node/Image.cpp @@ -14,7 +14,7 @@ Image::Image(LPCTSTR ImageFile, int x, int y, int width, int height) : m_fScaleX(1), m_fScaleY(1) { - setImageFile(ImageFile, x, y, width, height); // 设置图片资源和裁剪大小 + setImage(ImageFile, x, y, width, height); // 设置图片资源和裁剪大小 } Image::~Image() @@ -52,7 +52,7 @@ float Image::getScaleY() const return m_fScaleY; } -bool Image::setImageFile(LPCTSTR ImageFile, int x, int y, int width, int height) +bool Image::setImage(LPCTSTR ImageFile) { //判断图片路径是否存在 if (!PathFileExists(ImageFile)) @@ -67,7 +67,7 @@ bool Image::setImageFile(LPCTSTR ImageFile, int x, int y, int width, int height) // 加载图片 m_Image.Load(ImageFile); // 加载失败 - if (m_Image.IsNull()) + if (m_Image.IsNull()) { return false; } @@ -80,14 +80,25 @@ bool Image::setImageFile(LPCTSTR ImageFile, int x, int y, int width, int height) m_Image.AlphaBlend(GetImageHDC(), 15, 30); } // 设置目标矩形(即绘制到窗口的位置和大小) - m_rDest.SetRect(0, 0, m_Image.GetWidth(), m_Image.GetHeight()); + m_rDest.SetRect(m_nX, m_nY, m_nX + m_Image.GetWidth(), m_nY + m_Image.GetHeight()); + m_rSrc.SetRect(0, 0, m_Image.GetWidth(), m_Image.GetHeight()); + + return true; +} + +bool Image::setImage(LPCTSTR ImageFile, int x, int y, int width, int height) +{ + if (!setImage(ImageFile)) + { + return false; + } // 裁剪图片大小 crop(x, y, width, height); return true; } -bool Image::setImageRes(LPCTSTR pResName, int x, int y, int width, int height) +bool Image::setImageFromRes(LPCTSTR pResName) { // 从资源加载图片(不支持 PNG) m_Image.LoadFromResource(GetModuleHandle(NULL), pResName); @@ -96,10 +107,19 @@ bool Image::setImageRes(LPCTSTR pResName, int x, int y, int width, int height) { return false; } - // 重置缩放属性 - m_fScaleX = 0, m_fScaleY = 0; // 设置目标矩形(即绘制到窗口的位置和大小) - m_rDest.SetRect(0, 0, m_Image.GetWidth(), m_Image.GetHeight()); + m_rDest.SetRect(m_nX, m_nY, m_nX + m_Image.GetWidth(), m_nY + m_Image.GetHeight()); + m_rSrc.SetRect(0, 0, m_Image.GetWidth(), m_Image.GetHeight()); + + return true; +} + +bool Image::setImageFromRes(LPCTSTR pResName, int x, int y, int width, int height) +{ + if (!setImageFromRes(pResName)) + { + return false; + } // 裁剪图片大小 crop(x, y, width, height); @@ -131,8 +151,8 @@ void Image::stretch(int width, int height) void Image::scale(float scaleX, float scaleY) { - m_fScaleX = min(max(scaleX, 0), 1.0f); - m_fScaleY = min(max(scaleY, 0), 1.0f); + m_fScaleX = max(scaleX, 0); + m_fScaleY = max(scaleY, 0); m_rDest.SetRect( m_nX, m_nY, m_nX + int(m_Image.GetWidth() * scaleX), diff --git a/Easy2D/Node/Layer.cpp b/Easy2D/Node/Layer.cpp new file mode 100644 index 00000000..8e0ba550 --- /dev/null +++ b/Easy2D/Node/Layer.cpp @@ -0,0 +1,28 @@ +#include "..\easy2d.h" + + +Layer::Layer() : + m_bBlock(true) +{ +} + +Layer::~Layer() +{ +} + +int Layer::getBlock() const +{ + return m_bBlock; +} + +void Layer::setBlock(bool block) +{ + m_bBlock = block; +} + +bool Layer::_exec(bool active) +{ + BatchNode::_exec(active); + // 若图层阻塞消息,则永远取得画面焦点 + return m_bBlock; +} diff --git a/Easy2D/Node/MouseNode.cpp b/Easy2D/Node/MouseNode.cpp index a648b327..6c67c3d9 100644 --- a/Easy2D/Node/MouseNode.cpp +++ b/Easy2D/Node/MouseNode.cpp @@ -18,11 +18,17 @@ MouseNode::~MouseNode() bool MouseNode::_exec(bool active) { - // 若画面已取得焦点,或 display 属性为 false,退出函数 - if (!active || !m_bDisplay) + // 若 display 属性为 false,退出函数 + if (!m_bDisplay) { return false; } + // 若画面已取得焦点,重置按钮属性并退出 + if (!active) + { + reset(); + return false; + } // 判断节点当前的状态 // 若节点未取得焦点,则重新判断节点状态 if (!m_bTarget) @@ -38,8 +44,8 @@ bool MouseNode::_exec(bool active) m_bTarget = true; // 取得焦点标记 _setStatus(SELECTED); // 状态设为 SELECTED } - // 若节点不阻塞鼠标消息,则取得画面焦点 - if (!m_bBlock) return true; + // 若节点阻塞鼠标消息,则取得画面焦点 + if (m_bBlock) return true; } else { @@ -58,8 +64,8 @@ bool MouseNode::_exec(bool active) } reset(); // 恢复默认状态 } - // 若节点不阻塞鼠标消息,则取得画面焦点 - if (!m_bBlock) return true; + // 若节点阻塞鼠标消息,则取得画面焦点 + if (m_bBlock) return true; } return false; } diff --git a/Easy2D/Node/Shape/Shape.cpp b/Easy2D/Node/Shape/Shape.cpp index daf6bd61..6a1c66ec 100644 --- a/Easy2D/Node/Shape/Shape.cpp +++ b/Easy2D/Node/Shape/Shape.cpp @@ -3,7 +3,8 @@ Shape::Shape() : lineColor(Color::black), - fillColor(Color::white) + fillColor(Color::white), + m_eStyle(SOLID) { } @@ -23,15 +24,15 @@ void Shape::_onDraw() setfillcolor(fillColor); // 根据形状的样式进行不同的绘制 - if (_style == Shape::STYLE::round) + if (m_eStyle == Shape::STYLE::ROUND) { roundShape(); } - else if (_style == Shape::STYLE::solid) + else if (m_eStyle == Shape::STYLE::SOLID) { solidShape(); } - else if (_style == Shape::STYLE::fill) + else if (m_eStyle == Shape::STYLE::FILL) { fillShape(); } @@ -56,3 +57,8 @@ void Shape::setLineColor(COLORREF color) { lineColor = color; } + +void Shape::setStyle(STYLE style) +{ + m_eStyle = style; +} diff --git a/Easy2D/Scene.cpp b/Easy2D/Scene.cpp index 93099331..dca60aa6 100644 --- a/Easy2D/Scene.cpp +++ b/Easy2D/Scene.cpp @@ -35,6 +35,14 @@ void Scene::_onDraw() } } +void Scene::onEnter() +{ +} + +void Scene::onExit() +{ +} + void Scene::add(Node * child, int zOrder) { // 断言添加的节点非空 diff --git a/Easy2D/Style/FontStyle.cpp b/Easy2D/Style/FontStyle.cpp index 6d9b6921..40617cca 100644 --- a/Easy2D/Style/FontStyle.cpp +++ b/Easy2D/Style/FontStyle.cpp @@ -14,13 +14,19 @@ const LONG FontWeight::extraBold = 800; const LONG FontWeight::black = 900; const LONG FontWeight::heavy = 900; -// 默认字体 -static const FontStyle s_defaultFont(_T(""), 18, FontWeight::normal); - FontStyle::FontStyle() { - m_font = s_defaultFont.m_font; + setFontFamily(_T("")); + m_font.lfWeight = 18; + m_font.lfHeight = 0; + m_font.lfWidth = 0; + m_font.lfItalic = 0; + m_font.lfUnderline = 0; + m_font.lfStrikeOut = 0; + m_font.lfEscapement = 0; + m_font.lfOrientation = 0; + setQuality(true); } FontStyle::FontStyle(LPCTSTR fontfamily, LONG height, LONG weight, LONG width, bool italic, bool underline, bool strikeout, LONG escapement, LONG orientation, bool quality) @@ -43,7 +49,7 @@ FontStyle::~FontStyle() FontStyle * FontStyle::getDefault() { - return new FontStyle(s_defaultFont); + return new FontStyle(_T(""), 18, FontWeight::normal); } void FontStyle::setHeight(LONG value) diff --git a/Easy2D/easy2d.h b/Easy2D/easy2d.h index 9b4f4af6..33160c48 100644 --- a/Easy2D/easy2d.h +++ b/Easy2D/easy2d.h @@ -1,5 +1,5 @@ /****************************************************** -* Easy2D Game Engine (v1.0.2) +* Easy2D Game Engine (v1.0.3) * http://www.easy2d.cn * * Depends on EasyX (Ver:20170827(beta)) @@ -11,8 +11,8 @@ #error Easy2D is only for C++ #endif -#if _MSC_VER < 1600 - #error Do Visual Studio 2010/2013/2015/2017 specific stuff +#if _MSC_VER < 1900 + #error Do Visual Studio 2015/2017 specific stuff #endif @@ -72,6 +72,7 @@ class FileUtils; // 对象 class Object; class Node; +class Layer; class BatchNode; class MouseNode; class Image; @@ -84,7 +85,6 @@ class TextButton; class ImageButton; -typedef BatchNode Layer; typedef unsigned int VK_KEY; typedef std::function CLICK_CALLBACK; typedef std::function TIMER_CALLBACK; @@ -149,6 +149,8 @@ public: void enterScene(Scene *scene, bool save = true); // 返回上一场景 void backScene(); + // 清空之前保存的所有场景 + void clearScene(); // 修改窗口背景色 void setBkColor(COLORREF color); // 设置帧率 @@ -193,6 +195,10 @@ public: Scene(); ~Scene(); + // 重写这个函数,它将在进入这个场景时自动执行 + virtual void onEnter(); + // 重写这个函数,它将在离开这个场景时自动执行 + virtual void onExit(); // 添加子成员到场景 void add(Node * child, int zOrder = 0); // 删除子成员 @@ -233,7 +239,7 @@ public: // 添加键盘监听 static void addListener(tstring name, const MOUSE_CALLBACK& callback); // 删除键盘监听 - static bool delListener(tstring name); + static bool deleteListener(tstring name); // 删除所有键盘监听 static void clearAllListener(); @@ -289,7 +295,7 @@ public: // 数字键值 static const VK_KEY NUM_1, NUM_2, NUM_3, NUM_4, NUM_5, NUM_6, NUM_7, NUM_8, NUM_9, NUM_0; // 小数字键盘值 - static const VK_KEY NUMPAD_1, NUMPAD_2, NUMPAD_3, NUMPAD_4, NUMPAD_5, NUMPAD_6, NUMPAD_7, NUMPAD_8, NUMPAD_9, NUMPAD_0, Decimal; + static const VK_KEY NUMPAD_1, NUMPAD_2, NUMPAD_3, NUMPAD_4, NUMPAD_5, NUMPAD_6, NUMPAD_7, NUMPAD_8, NUMPAD_9, NUMPAD_0; // 控制键值 static const VK_KEY Enter, Space, Up, Down, Left, Right, Esc, Shift, LShift, RShift, Ctrl, LCtrl, RCtrl; // F 键值 @@ -312,7 +318,7 @@ public: // 添加键盘监听 static void addListener(tstring name, const KEY_CALLBACK& callback); // 删除键盘监听 - static bool delListener(tstring name); + static bool deleteListener(tstring name); // 删除所有键盘监听 static void clearAllListener(); // 判断键是否被按下,按下返回true @@ -614,6 +620,26 @@ public: }; +class Layer : + public virtual BatchNode +{ +protected: + bool m_bBlock; + +protected: + virtual bool _exec(bool active) override; + +public: + Layer(); + virtual ~Layer(); + + // 图层是否阻塞消息 + int getBlock() const; + // 设置图层是否阻塞消息 + void setBlock(bool block); +}; + + class Image : public virtual Node { @@ -648,23 +674,33 @@ public: float getScaleY() const; /** - * 从图片文件获取图像(png/bmp/jpg/gif/emf/wmf/ico) - * 参数:图片文件名,图片裁剪坐标,图片裁剪宽度和高度 + * 从图片文件获取图像 (png/bmp/jpg/gif/emf/wmf/ico) * 返回值:图片加载是否成功 */ - bool setImageFile(LPCTSTR ImageFile, int x = 0, int y = 0, int width = 0, int height = 0); + bool setImage(LPCTSTR ImageFile); + /** + * 从图片文件获取图像 (png/bmp/jpg/gif/emf/wmf/ico) + * 参数:图片文件名,图片裁剪起始坐标,图片裁剪宽度和高度 + * 返回值:图片加载是否成功 + */ + bool setImage(LPCTSTR ImageFile, int x, int y, int width, int height); + /** + * 从资源文件获取图像,不支持 png (bmp/jpg/gif/emf/wmf/ico) + * 返回值:图片加载是否成功 + */ + bool setImageFromRes(LPCTSTR pResName); /** * 从资源文件获取图像,不支持 png (bmp/jpg/gif/emf/wmf/ico) * 参数:资源名称,图片裁剪坐标,图片裁剪宽度和高度 * 返回值:图片加载是否成功 */ - bool setImageRes(LPCTSTR pResName, int x = 0, int y = 0, int width = 0, int height = 0); + bool setImageFromRes(LPCTSTR pResName, int x, int y, int width, int height); // 裁剪图片(裁剪后会恢复 stretch 拉伸) - void crop(int x = 0, int y = 0, int width = 0, int height = 0); + void crop(int x, int y, int width, int height); // 将图片拉伸到固定宽高 void stretch(int width = 0, int height = 0); - // 按比例拉伸图片(0 ~ 1.0f) - void scale(float scaleX, float scaleY); + // 按比例拉伸图片 + void scale(float scaleX = 1.0f, float scaleY = 1.0f); // 设置图片位置 void setPos(int x, int y) override; // 移动图片 @@ -827,6 +863,7 @@ protected: public: TextButton(); + TextButton(tstring text); TextButton(Text * text); virtual ~TextButton(); @@ -869,6 +906,7 @@ protected: public: ImageButton(); + ImageButton(LPCTSTR image); ImageButton(Image * image); virtual ~ImageButton(); @@ -894,8 +932,6 @@ class Shape : public virtual Node { protected: - enum STYLE { round, solid, fill }; // 形状填充样式 - STYLE _style; COLORREF fillColor; COLORREF lineColor; @@ -905,6 +941,9 @@ protected: virtual void fillShape() = 0; virtual void roundShape() = 0; +public: + enum STYLE { ROUND, SOLID, FILL } m_eStyle; // 形状填充样式 + public: Shape(); virtual ~Shape(); @@ -917,6 +956,8 @@ public: void setFillColor(COLORREF color); // 设置线条颜色 void setLineColor(COLORREF color); + // 设置填充样式 + void setStyle(STYLE style); };