Problem mit TrackpopupMenu -Blockierereignissen in der benutzerdefinierten MenüleisteC++

Programme in C++. Entwicklerforum
Anonymous
 Problem mit TrackpopupMenu -Blockierereignissen in der benutzerdefinierten Menüleiste

Post by Anonymous »

Ich arbeite an einem Projekt, um eine benutzerdefinierte Menüleiste mit dem nativen Standardhintergrund des Systems, einem Griffstil und den Schaltflächen des Systems zu erstellen. Ich renne in ein Problem mit TrackpopupMenu Elemente: Wenn ich auf eine Schaltfläche (z. B. "Datei") klicke, um das TrackpopupMenu anzuzeigen, blockiert es Ereignisse wie Mousemove, Timer und andere. Diese Ereignisse lösen nur auf das Formular aus, um das TrackpopupMenu zu verbergen, sodass Ereignisse erneut arbeiten können.

Code: Select all

void CCustomMenuBar::OnMouseMove(UINT nFlags, CPoint point)
{
// Begin tracking mouse leave
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(TRACKMOUSEEVENT);
tme.dwFlags = TME_LEAVE;
tme.hwndTrack = m_hWnd;
tme.dwHoverTime = 0;
//_TrackMouseEvent(&tme);

// Your existing hover logic
int itemWidth = 40;
int index = (point.x - 10) / itemWidth;

TRACE(_T("Hovered item = %d\n"), m_hoveredItem);

if (index < 0 || index >= m_items.GetSize())
{
if (m_hoveredItem != -1)
{
m_hoveredItem = -1;
Invalidate();
}
}

CWnd::OnMouseMove(nFlags, point);
}
< /code>
Ich habe auch dies ausprobiert: < /p>
void CMainFrm::OnTimer(UINT_PTR nIDEvent)
{
if (nIDEvent == 1)  // Timer for popup menu
{
CPoint pt;
GetCursorPos(&pt);  // Get current cursor position

CRect menuRect;
m_pMenuBar->GetClientRect(menuRect);  // Get the area of the popup menu

// Convert to screen coordinates if needed
ScreenToClient(&pt);

// If the mouse is outside the menu bounds, close the popup
if (!menuRect.PtInRect(pt))
{
ClosePopupMenu();  // Call the function to close the menu
}
}

CDialog::OnTimer(nIDEvent);  // Call base class handler
}
< /code>
Und ich habe auch dies versucht: < /p>
BOOL CMainFrm::PreTranslateMessage(MSG* pMsg)
{
TRACE(_T("Mouse is inside the menu bar.\n"));

if (pMsg->message == WM_MOUSEMOVE)
{
CPoint pt;
GetCursorPos(&pt);      // Get screen position
ScreenToClient(&pt);    // Convert to client coords

// Check if the mouse is over the menu bar
CRect menuBarRect;
m_pMenuBar->GetClientRect(menuBarRect);  // Get the menu bar's client area

// If the mouse is inside the menu bar's area, forward the message to the menu bar
if (menuBarRect.PtInRect(pt))
{
//TRACE(_T("Mouse is inside the menu bar.\n"));

// Forward the mouse move message to the menu bar
//if (m_pMenuBar)
//{
m_pMenuBar->OnMouseMove(pMsg->wParam, pt);
//}
}
else
{
//TRACE(_T("Mouse is outside the menu bar.\n"));

m_pMenuBar->OnMouseMove(pMsg->wParam, pt);
}
}

return CDialog::PreTranslateMessage(pMsg);
}
< /code>
Hier ist, was mein PopupMenu angezeigt wird, wenn ich klicke: < /p>
void CCustomMenuBar::OnLButtonDown(UINT nFlags, CPoint point)
{
CRect gripRect(10 + 0 * 100, 0, 10 + (1) * 100, 10);  // Position of the "Grip"

if (gripRect.PtInRect(point))
{
// Handle the grip being clicked for resizing
SetCapture();  // Start tracking mouse movement
}

int itemWidth = 40;  // Same as before
int index = (point.x - 10) / itemWidth;

if (index >= 0 && index < m_items.GetSize())
{
CString itemName = m_items[index];

// Handle the menu item click
CRect itemRect(10 + index * itemWidth, 0, 10 + (index + 1) * itemWidth, m_height);
ClientToScreen(&itemRect);
//TRACE(_T("Item clicked: %s\n"), itemName);

// Show appropriate menu
if (itemName == _T("File"))
{
ShowFileMenu(CPoint(itemRect.left, itemRect.bottom));
}
else if (itemName == _T("Hello"))
{
ShowEditMenu(CPoint(itemRect.left, itemRect.bottom));
}

// Reset hover state after a click
m_hoveredItem = -1;
Invalidate();   // Force a repaint to reflect the click
}

CWnd::OnLButtonDown(nFlags, point);
}

void CCustomMenuBar::ShowFileMenu(CPoint point)
{
CMenu menu;
menu.CreatePopupMenu();

menu.AppendMenu(MF_STRING, 101, _T("New"));
menu.AppendMenu(MF_STRING, 32779, _T("Open"));
menu.AppendMenu(MF_SEPARATOR);
menu.AppendMenu(MF_STRING, ID_APP_EXIT, _T("Exit"));

menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, GetParent());
}

void CCustomMenuBar::ShowEditMenu(CPoint point)
{
CMenu menu;
menu.CreatePopupMenu();

menu.AppendMenu(MF_STRING, 32802, _T("Copy"));
menu.AppendMenu(MF_SEPARATOR);
menu.AppendMenu(MF_STRING, 32803, _T("Select All"));
menu.AppendMenu(MF_SEPARATOR);
menu.AppendMenu(MF_STRING, 32805, _T("Find..."));
menu.AppendMenu(MF_SEPARATOR);
menu.AppendMenu(MF_STRING, 32807, _T("Move to Folder..."));

menu.TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, GetParent());
}
Was ich erreichen möchte, ist, wenn ich auf eine Schaltfläche wie "Datei" klicke, ich möchte über andere Schaltflächen (z. B. "bearbeiten," Ansicht "), um das aktuelle TrackpopupMenu zu verbergen und die neue anzuzeigen. Wenn jedoch der TrackpopupMenu angezeigt wird, blockiert er die Ereignisse, und ich kann nicht über die anderen Schaltflächen schweben, es sei denn, ich muss außerhalb des TrackpopupMenu es zuerst verbergen. Zeigen und verbergen Sie die Elemente von TrackpopupMenu , ohne Ereignisse zu blockieren. Wenn Sie nicht wissen, was TrackpopupMenu tatsächlich ist, sind sie wie ein Kontextmenü.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post