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.
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ü.
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]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 }
menu.TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, GetParent()); } [/code] Was ich erreichen möchte, ist, wenn ich auf eine Schaltfläche wie "Datei" klicke, [url=viewtopic.php?t=14917]ich möchte[/url] ü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ü.
Wenn Sie den Mauszeiger über ein Element in einer Menüleiste bewegen, die in platziert ist, hat dies keine Auswirkungen auf die Körpereigenschaften. Könnten Sie mir helfen, das herauszufinden?
Vielen...
Wenn Sie den Mauszeiger über ein Element in einer Menüleiste bewegen, die in platziert ist, hat dies keine Auswirkungen auf die Körpereigenschaften. Könnten Sie mir helfen, das herauszufinden?
Vielen...
Ich habe eine WordPress -Seite, auf der eine Liste von Beiträgen in einer bestimmten Kategorie angezeigt wird. Mein Kunde möchte neben jedem auf der Seite aufgeführten Beitrag einen Teilen auf...
Ich habe ein Programm, das die Kamera über die Absicht öffnet, ein Foto zu machen. So viel Teil funktioniert schon einwandfrei. Ich möchte jedoch, dass es in einem bestimmten Ordner mit einem...
Ich entwickle ein benutzerdefiniertes jQuery-Plugin namens DataTablePro, um meiner Tabelle Funktionen wie Suche, Paginierung und Sortierung hinzuzufügen. Allerdings stehe ich vor einem Problem, bei...