| SourceCode/Bond/Servo/Servo.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/ServoDlg.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/ServoGraph.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/ServoGraph.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/stdafx.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
SourceCode/Bond/Servo/Servo.cpp
@@ -7,7 +7,6 @@ #include "ServoDlg.h" #include "ServoGraph.h" using namespace Gdiplus; // 声明全局变量,用于管理 GDI+ 初始化 ULONG_PTR g_diplusToken; GdiplusStartupInput g_diplusStartupInput; SourceCode/Bond/Servo/ServoDlg.cpp
@@ -552,33 +552,46 @@ void CServoDlg::RotateRobot(float angleInDegrees) { return; // 将角度转换为弧度 float angleInRadians = angleInDegrees * (std::acos(-1) / 180.0f); float angleInRadians = static_cast<float>(std::acos(-1)) / 180.0f * angleInDegrees; // 获取机器人图片的当前坐标和中心 auto* pImage = m_pGraph->GetImage(IMAGE_ROBOT); if (!pImage) return; // 更新 Rotate 图片的角度,确保角度保持在 [0, 360) 范围内 m_pGraph->UpdateImageAngle(IMAGE_ROBOT, static_cast<float>(fmod(pImage->angle + angleInDegrees + 360, 360))); int cx = pImage->x + pImage->bmWidth / 2; // 图片中心 X int cy = pImage->y + pImage->bmHeight / 2; // 图片中心 Y // m_pGraph->UpdateImageAngle(IMAGE_ROBOT, angleInDegrees); // 旋转指示框的坐标 auto* pRobot1 = m_pGraph->GetIndicateBox(INDICATE_ROBOT_ARM1); auto* pRobot2 = m_pGraph->GetIndicateBox(INDICATE_ROBOT_ARM2); // 旋转指示框的坐标 int newArmX1 = static_cast<int>(cx + (pRobot1->x - cx) * cos(angleInRadians) - (pRobot1->y - cy) * sin(angleInRadians)); int newArmY1 = static_cast<int>(cy + (pRobot1->x - cx) * sin(angleInRadians) + (pRobot1->y - cy) * cos(angleInRadians)); if (pRobot1 && pRobot2) { int newArmX1 = pImage->x + 20; int newArmY1 = 294; int newArmX2 = static_cast<int>(cx + (pRobot2->x - cx) * cos(angleInRadians) - (pRobot2->y - cy) * sin(angleInRadians)); int newArmY2 = static_cast<int>(cy + (pRobot2->x - cx) * sin(angleInRadians) + (pRobot2->y - cy) * cos(angleInRadians)); int newArmX2 = pImage->x + 73; int newArmY2 = 294; if (angleInDegrees != 0.0f) { // 计算指示框1的新坐标 newArmX1 = static_cast<int>(cx + (pRobot1->x - cx) * cos(angleInRadians) - (pRobot1->y - cy) * sin(angleInRadians)); newArmY1 = static_cast<int>(cy + (pRobot1->x - cx) * sin(angleInRadians) + (pRobot1->y - cy) * cos(angleInRadians)); // 计算指示框2的新坐标 newArmX2 = static_cast<int>(cx + (pRobot2->x - cx) * cos(angleInRadians) - (pRobot2->y - cy) * sin(angleInRadians)); newArmY2 = static_cast<int>(cy + (pRobot2->x - cx) * sin(angleInRadians) + (pRobot2->y - cy) * cos(angleInRadians)); } // 更新指示框的位置 m_pGraph->UpdateIndicateBoxCoordinates(INDICATE_ROBOT_ARM1, newArmX1, newArmY1); m_pGraph->UpdateIndicateBoxCoordinates(INDICATE_ROBOT_ARM2, newArmX2, newArmY2); } // 强制重绘界面 Invalidate(); } SourceCode/Bond/Servo/ServoGraph.cpp
@@ -306,29 +306,9 @@ // 画IMAGE HDC hDCTemp = ::CreateCompatibleDC(hMemDC); for (auto& item : m_images) { // 载入BMP if (item.hBitmap == nullptr) { item.hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(), item.szPath, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE); if (item.hBitmap != nullptr) { BITMAP bitmap; ::GetObject(item.hBitmap, sizeof(BITMAP), &bitmap); item.bmWidth = bitmap.bmWidth; item.bmHeight = bitmap.bmHeight; DrawImage(hMemDC, item); } } if (item.hBitmap != nullptr) { ::SelectObject(hDCTemp, item.hBitmap); ::BitBlt(hMemDC, item.x, item.y, item.bmWidth, item.bmHeight, hDCTemp, 0, 0, SRCCOPY); } } ::DeleteDC(hDCTemp); // 画背景指示 @@ -368,7 +348,7 @@ } // text ::DrawText(hMemDC, item.szText, strlen(item.szText), ::DrawText(hMemDC, item.szText, static_cast<int>(strlen(item.szText)), &rcItem, DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS); } @@ -645,3 +625,53 @@ pIndicateBox->y = newY; } } void CServoGraph::UpdateImageAngle(int id, float angle) { IMAGE* pImage = GetImage(id); if (pImage != nullptr) { pImage->angle = angle; } } void CServoGraph::DrawImage(HDC hMemDC, IMAGE& item) { // 载入BMP if (item.hBitmap == nullptr) { item.hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(), item.szPath, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE); if (item.hBitmap != nullptr) { BITMAP bitmap; ::GetObject(item.hBitmap, sizeof(BITMAP), &bitmap); item.bmWidth = bitmap.bmWidth; item.bmHeight = bitmap.bmHeight; } } if (item.hBitmap != nullptr) { // 使用 GDI+ 加载位图,并创建GDI+ Graphics 对象 Bitmap bitmap(item.hBitmap, nullptr); Graphics graphics(hMemDC); // 如果图像需要旋转 if (item.angle != 0.0f) { // 角度转换为弧度 float angleInRadians = item.angle; // 获取图像中心 REAL cx = static_cast<REAL>(item.x + item.bmWidth / 2); // 将中心X转换为REAL类型 REAL cy = static_cast<REAL>(item.y + item.bmHeight / 2); // 将中心Y转换为REAL类型 // 创建旋转矩阵 Matrix rotateMatrix; rotateMatrix.RotateAt(angleInRadians, PointF(cx, cy)); // 应用旋转矩阵到图形 graphics.SetTransform(&rotateMatrix); } graphics.DrawImage(&bitmap, item.x, item.y); graphics.ResetTransform(); } } SourceCode/Bond/Servo/ServoGraph.h
@@ -75,6 +75,7 @@ HBITMAP hBitmap; int bmWidth; int bmHeight; float angle; } IMAGE; @@ -168,6 +169,10 @@ HWND GetSafeWnd(); void UpdateImageCoordinates(int id, int newX, int newY); void UpdateIndicateBoxCoordinates(int id, int newX, int newY); void UpdateImageAngle(int id, float angle); private: void DrawImage(HDC hMemDC, IMAGE& item); private: HWND m_hWnd; SourceCode/Bond/Servo/stdafx.h
@@ -35,6 +35,7 @@ // GDI+ #include <gdiplus.h> using namespace Gdiplus; #include "..\RxWindows1.0\include\RxWindowsLib.h" #include "..\HSMSSDK\Include\HSMSSDK.h"