001
29.03.2003, 21:54 Uhr
Uwe
C/C++ Master (Administrator)
|
Hallo freedom, OnMouseMove() wird ausgelöst, wenn sich der Mauscursor in seiner Position verändert. Hier in dieser Funktion wird zuerst geprüft ob ein Ereignis für die linke Maustaste anliegt. wenn ja wird in die Verzweigung gesprungen. Dort wird ein Zeiger auf das übergeornete Fenster geholt, also kann dieser Quellcode nur in einer anderen Klasse implementiert worden sein. Als nächstes werden die Koordinaten des Clientbereiches vom übergeordneten Fenster ermittelt. Danach erfolgt eine einfache Koordinatenwandlung. Was danach kommt ist nicht vollständig und gehört in die Rubrik "fang mich", da hier Ansätze zu sehen sind einen Bereich zu ermitteln, wo geprüft werden soll, ob der Cursor über dem Button steht. Jedoch nicht vollendet... Der Button wird sich so nicht verschieben. Jetzt meine Variante (mit VC++7.0 erstellt, OnMouseLeave() nutze ich z.B. um Bitmaps auszublenden), auch unvollendet :): -Erstelle einen neu Klasse, welche Du von CButton ableitest. MyButton.h
C++: |
#pragma once
// CMyButton
class CMyButton : public CButton { DECLARE_DYNAMIC(CMyButton)
public: CMyButton(); virtual ~CMyButton();
protected: DECLARE_MESSAGE_MAP() public: afx_msg void OnMouseMove(UINT nFlags, CPoint point); afx_msg LRESULT OnMouseLeave(WPARAM wparam, LPARAM lparam); afx_msg LRESULT OnMouseHover(WPARAM wparam, LPARAM lparam); public: bool m_bHover; bool m_bTracking; afx_msg void OnRButtonDown(UINT nFlags, CPoint point); public: bool m_bRbutton; afx_msg void OnRButtonUp(UINT nFlags, CPoint point); };
|
Die Implementierung MyButton.cpp
C++: |
// MyButton.cpp : Implementierungsdatei //
#include "stdafx.h" #include "Button.h" #include "MyButton.h"
// CMyButton
IMPLEMENT_DYNAMIC(CMyButton, CButton) CMyButton::CMyButton() : m_bHover(false) , m_bTracking(false) , m_bRbutton(false) { }
CMyButton::~CMyButton() { }
BEGIN_MESSAGE_MAP(CMyButton, CButton) ON_WM_MOUSEMOVE() ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave) ON_MESSAGE(WM_MOUSEHOVER,OnMouseHover) ON_WM_RBUTTONDOWN() ON_WM_RBUTTONUP() END_MESSAGE_MAP()
// CMyButton-Meldungshandler
void CMyButton::OnMouseMove(UINT nFlags, CPoint point) { if(!m_bTracking){ TRACKMOUSEEVENT tme; tme.cbSize = sizeof(tme); tme.hwndTrack = m_hWnd; tme.dwFlags = TME_LEAVE|TME_HOVER; tme.dwHoverTime = 1; m_bTracking = _TrackMouseEvent(&tme); } CButton::OnMouseMove(nFlags, point); }
LRESULT CMyButton::OnMouseHover(WPARAM wparam, LPARAM lparam){ if (!m_bHover){ m_bHover = TRUE; } return 0; }
LRESULT CMyButton::OnMouseLeave(WPARAM wparam, LPARAM lparam){ m_bTracking = m_bHover = FALSE; return 0; } void CMyButton::OnRButtonDown(UINT nFlags, CPoint point) { if(m_bHover){ m_bRbutton = true; } CButton::OnRButtonDown(nFlags, point); } void CMyButton::OnRButtonUp(UINT nFlags, CPoint point) { m_bRbutton = false; CButton::OnRButtonUp(nFlags, point); }
|
Nun fügst Du eine Member vom Typ:
C++: |
public: CMyButton m_myButton; ......
|
in den Header Deiner Dialogklasse ein wo Du den Button nutzen willst. In der Implementierungsdatei unter:
C++: |
void CButtonDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_MY_BUTTON, m_myButton); }
|
und unter:
C++: |
void CButtonDlg::OnMouseMove(UINT nFlags, CPoint point) { if((m_myButton.m_bHover) && (m_myButton.m_bRbutton)){ m_myButton.SetWindowPos(NULL,point.x,point.y,0,0,SWP_NOSIZE|SWP_NOZORDER); }else CDialog::OnMouseMove(nFlags, point); }
|
Jetzt kannst Du mit der rechten Maustaste einen Button verschieben. Viel Spass... -- "Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."
Bis dann... Uwe Dieser Post wurde am 29.03.2003 um 22:07 Uhr von Uwe editiert. |