LAPTOP-SNT8I5JK\Boounion
2025-01-10 fc19ffcf4d130b2ef7788475f4b7d7846f56eecd
SourceCode/Bond/Servo/ServoDlg.cpp
@@ -6,6 +6,9 @@
#include "Servo.h"
#include "ServoDlg.h"
#include "afxdialogex.h"
#include "Common.h"
#include "Log.h"
#ifdef _DEBUG
#define new DEBUG_NEW
@@ -68,13 +71,16 @@
   : CDialogEx(IDD_SERVO_DIALOG, pParent)
{
   m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
   m_crBkgnd = RGB(255, 255, 255);
   m_crBkgnd = APPDLG_BACKGROUND_COLOR;
   m_hbrBkgnd = nullptr;
   m_bShowLogWnd = FALSE;
   m_pLogDlg = nullptr;
}
void CServoDlg::DoDataExchange(CDataExchange* pDX)
{
   CDialogEx::DoDataExchange(pDX);
   DDX_Control(pDX, IDC_BUTTON_LOG, m_btnLog);
}
BEGIN_MESSAGE_MAP(CServoDlg, CDialogEx)
@@ -85,6 +91,22 @@
   ON_BN_CLICKED(IDCANCEL, &CServoDlg::OnBnClickedCancel)
   ON_WM_CTLCOLOR()
   ON_WM_DESTROY()
   ON_BN_CLICKED(IDC_BUTTON_LOG, &CServoDlg::OnBnClickedButtonLog)
   ON_WM_SIZE()
   ON_WM_CLOSE()
   ON_MESSAGE(ID_MSG_LOGDLG_HIDE, &CServoDlg::OnLogDlgHide)
   ON_WM_MOVING()
   ON_WM_MOVE()
   ON_COMMAND(ID_MENU_FILE_EXIT, &CServoDlg::OnMenuFileExit)
   ON_UPDATE_COMMAND_UI(ID_MENU_FILE_EXIT, &CServoDlg::OnUpdateMenuFileExit)
   ON_COMMAND(ID_MENU_FILE_SETTINGS, &CServoDlg::OnMenuFileSettings)
   ON_UPDATE_COMMAND_UI(ID_MENU_FILE_SETTINGS, &CServoDlg::OnUpdateMenuFileSettings)
   ON_COMMAND(ID_MENU_FILE_SECSTEST, &CServoDlg::OnMenuFileSecsTest)
   ON_UPDATE_COMMAND_UI(ID_MENU_FILE_SECSTEST, &CServoDlg::OnUpdateMenuFileSecsTest)
   ON_COMMAND(ID_MENU_WND_LOG, &CServoDlg::OnMenuWndLog)
   ON_UPDATE_COMMAND_UI(ID_MENU_WND_LOG, &CServoDlg::OnUpdateMenuWndLog)
   ON_COMMAND(ID_MENU_HELP_ABOUT, &CServoDlg::OnMenuHelpAbout)
   ON_WM_INITMENUPOPUP()
END_MESSAGE_MAP()
@@ -118,6 +140,13 @@
   //  执行此操作
   SetIcon(m_hIcon, TRUE);         // 设置大图标
   SetIcon(m_hIcon, FALSE);      // 设置小图标
                           // 菜单
   CMenu menu;
   menu.LoadMenu(IDR_MENU_APP);
   SetMenu(&menu);
   // ͼʾ
@@ -200,6 +229,20 @@
   m_pGraph->SetBoxText(INDICATE_MEASUREMENT, "13", "Measurement");
   // 调整初始窗口位置
   CRect rcWnd;
   GetWindowRect(&rcWnd);
   int width = GetSystemMetrics(SM_CXSCREEN);
   int height = GetSystemMetrics(SM_CYSCREEN);
   MoveWindow((width - rcWnd.Width()) / 2, 0, rcWnd.Width(), rcWnd.Height(), TRUE);
   // model init
   theApp.m_model.init();
   UpdateLogBtn();
   Resize();
   return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}
@@ -252,7 +295,122 @@
   return static_cast<HCURSOR>(m_hIcon);
}
void CServoDlg::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
{
   ASSERT(pPopupMenu != NULL);
   CCmdUI state;
   state.m_pMenu = pPopupMenu;
   ASSERT(state.m_pOther == NULL);
   ASSERT(state.m_pParentMenu == NULL);
   HMENU hParentMenu;
   if (AfxGetThreadState()->m_hTrackingMenu == pPopupMenu->m_hMenu)
      state.m_pParentMenu = pPopupMenu;
   else if ((hParentMenu = ::GetMenu(m_hWnd)) != NULL)
   {
      CWnd* pParent = this;
      if (pParent != NULL &&
         (hParentMenu = ::GetMenu(pParent->m_hWnd)) != NULL)
      {
         int nIndexMax = ::GetMenuItemCount(hParentMenu);
         for (int nIndex = 0; nIndex < nIndexMax; nIndex++)
         {
            if (::GetSubMenu(hParentMenu, nIndex) == pPopupMenu->m_hMenu)
            {
               state.m_pParentMenu = CMenu::FromHandle(hParentMenu);
               break;
            }
         }
      }
   }
   state.m_nIndexMax = pPopupMenu->GetMenuItemCount();
   for (state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax;
   state.m_nIndex++)
   {
      state.m_nID = pPopupMenu->GetMenuItemID(state.m_nIndex);
      if (state.m_nID == 0)
         continue;
      ASSERT(state.m_pOther == NULL);
      ASSERT(state.m_pMenu != NULL);
      if (state.m_nID == (UINT)-1)
      {
         state.m_pSubMenu = pPopupMenu->GetSubMenu(state.m_nIndex);
         if (state.m_pSubMenu == NULL ||
            (state.m_nID = state.m_pSubMenu->GetMenuItemID(0)) == 0 ||
            state.m_nID == (UINT)-1)
         {
            continue;
         }
         state.DoUpdate(this, TRUE);
      }
      else
      {
         state.m_pSubMenu = NULL;
         state.DoUpdate(this, FALSE);
      }
      UINT nCount = pPopupMenu->GetMenuItemCount();
      if (nCount < state.m_nIndexMax)
      {
         state.m_nIndex -= (state.m_nIndexMax - nCount);
         while (state.m_nIndex < nCount &&
            pPopupMenu->GetMenuItemID(state.m_nIndex) == state.m_nID)
         {
            state.m_nIndex++;
         }
      }
      state.m_nIndexMax = nCount;
   }
}
void CServoDlg::OnMenuFileSettings()
{
}
void CServoDlg::OnUpdateMenuFileSettings(CCmdUI* pCmdUI)
{
   pCmdUI->Enable(TRUE);
}
void CServoDlg::OnMenuFileSecsTest()
{
   AfxMessageBox("OnMenuFileSecsTest");
}
void CServoDlg::OnUpdateMenuFileSecsTest(CCmdUI* pCmdUI)
{
   pCmdUI->Enable(TRUE);
}
void CServoDlg::OnMenuWndLog()
{
   OnBnClickedButtonLog();
}
void CServoDlg::OnUpdateMenuWndLog(CCmdUI* pCmdUI)
{
   pCmdUI->SetCheck(m_bShowLogWnd);
}
void CServoDlg::OnMenuFileExit()
{
   PostMessage(WM_CLOSE);
}
void CServoDlg::OnUpdateMenuFileExit(CCmdUI* pCmdUI)
{
   pCmdUI->Enable(TRUE);
}
void CServoDlg::OnMenuHelpAbout()
{
   CAboutDlg dlgAbout;
   dlgAbout.DoModal();
}
void CServoDlg::OnBnClickedOk()
{
@@ -287,7 +445,100 @@
{
   CDialogEx::OnDestroy();
   if (m_pLogDlg != nullptr) {
      m_pLogDlg->DestroyWindow();
      delete m_pLogDlg;
      m_pLogDlg = nullptr;
   }
   if (m_hbrBkgnd != nullptr) {
      ::DeleteObject(m_hbrBkgnd);
   }
}
void CServoDlg::OnBnClickedButtonLog()
{
   m_bShowLogWnd = !m_bShowLogWnd;
   if (m_pLogDlg == nullptr) {
      m_pLogDlg = new CLogDlg();
      m_pLogDlg->Create(IDD_DIALOG_LOG, this);
      CRect rcWnd;
      GetWindowRect(&rcWnd);
      m_pLogDlg->MoveWindow(rcWnd.left, rcWnd.bottom - 8, rcWnd.Width(), 200);
   }
   ASSERT(m_pLogDlg);
   m_pLogDlg->ShowWindow(m_bShowLogWnd ? SW_SHOW : SW_HIDE);
   UpdateLogBtn();
}
void CServoDlg::UpdateLogBtn()
{
   m_btnLog.SetFrameColor(BS_NORMAL, BTN_LOG_FRAME_NORMAL);
   m_btnLog.SetFrameColor(BS_HOVER, BTN_LOG_FRAME_HOVER);
   m_btnLog.SetFrameColor(BS_PRESS, BTN_LOG_FRAME_PRESS);
   m_btnLog.SetBkgndColor(BS_NORMAL, m_bShowLogWnd ? BTN_LOG_BKGND_PRESS : BTN_LOG_BKGND_NORMAL);
   m_btnLog.SetBkgndColor(BS_HOVER, BTN_LOG_BKGND_HOVER);
   m_btnLog.SetBkgndColor(BS_PRESS, BTN_LOG_BKGND_PRESS);
   m_btnLog.Invalidate();
}
void CServoDlg::OnSize(UINT nType, int cx, int cy)
{
   CDialogEx::OnSize(nType, cx, cy);
   if (GetDlgItem(IDC_SERVO_GRAPH1) == nullptr) return;
   Resize();
}
void CServoDlg::Resize()
{
   CRect rcClient, rcItem;
   CWnd* pItem = nullptr;
   int x, y;
   x = 0;
   y = 0;
   pItem = GetDlgItem(IDC_SERVO_GRAPH1);
   pItem->GetClientRect(&rcItem);
   pItem->MoveWindow(x, y, rcItem.Width(), rcItem.Height());
   y += rcItem.Height();
   y += 8;
   x = 8;
   pItem = GetDlgItem(IDC_BUTTON_LOG);
   pItem->GetClientRect(&rcItem);
   pItem->MoveWindow(x, y, rcItem.Width(), rcItem.Height());
}
void CServoDlg::OnClose()
{
   // TODO: 在此添加消息处理程序代码和/或调用默认值
   CDialogEx::OnClose();
}
LRESULT CServoDlg::OnLogDlgHide(WPARAM wParam, LPARAM lParam)
{
   m_bShowLogWnd = FALSE;
   UpdateLogBtn();
   LOGE("OnLogDlgHide");
   return 0;
}
void CServoDlg::OnMoving(UINT fwSide, LPRECT pRect)
{
   CDialogEx::OnMoving(fwSide, pRect);
}
void CServoDlg::OnMove(int x, int y)
{
   if (m_pLogDlg != nullptr && !m_pLogDlg->IsZoomed()) {
      CRect rcWnd;
      GetWindowRect(&rcWnd);
      m_pLogDlg->MoveWindow(rcWnd.left, rcWnd.bottom - 8, rcWnd.Width(), 200);
   }
   CDialogEx::OnMove(x, y);
}