Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Mousemove ????

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
29.03.2003, 19:21 Uhr
freedom



Kann mir jemand bitte sagen was hier gemacht wird (bitte genauer erklären)


C++:
void CTrickButton::OnMouseMove(UINT nFlags, CPoint point)
{

    // Linke Maustaste gedrückt?
    if ((nFlags & MK_LBUTTON) == MK_LBUTTON)
    {
            
           CWnd* pParent = GetParent();
        if (!pParent) pParent = GetDesktopWindow();
    
        CRect ParentRect;          // Parent client area (Parent coords)
        pParent->GetClientRect(ParentRect);
    
        ClientToScreen(&point);  // Convert point to parent coords
        pParent->ScreenToClient(&point);
    
        CRect ButtonRect;         // Button Dimensions (Parent coords)
        GetWindowRect(ButtonRect);  
        pParent->ScreenToClient(ButtonRect);

                 // Center of button (parent coords)
        CPoint Center = ButtonRect.CenterPoint();              
        CSize CriticalSize(ButtonRect.Width(), ButtonRect.Height());

                 // New position (parent coords)
         CRect NewButtonRect = ButtonRect;  
       MoveWindow(NewButtonRect);
        RedrawWindow();
        
     CButton::OnMouseMove(nFlags, point);
}

Dieser Post wurde am 29.03.2003 um 21:58 Uhr von Uwe editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
30.03.2003, 13:57 Uhr
freedom



Hallo UWE
Danke für deine Hilfe aber leider verstehe ich das nicht L
Kannst du mir das genauer erklären. So wie in dem Buch „VC++ in 21 Tagen“
Ich meine in dem Form :

1.Projekt erstellen:
a. MFC-Anwendung
b. Projektname: xyz
c. Dialogbasierend
d. ... restliche Einstellungen sind OK

2.Hauptfenster gestalten: (in RessourceView)
a. Steuerelemente eifügen (z.B. Button´s)
b. ID´s für Steuerelemente
c. Variablen einfügen (erstellen)

z.B. ID: IDC_KW_EDIT
Member-Variablen-Name: m_kw
Katagorie: Wert
Typ: UINT


3.Neue Klasse erstellen (in ClassView RMT -> Neue Klasse...)
a. Klassentyp:
b. Name:
c. Basisklasse:
d. Automatisierung:
e. Und dann vielleicht noch kurtz erkären was da jetzt gemacht wird

UWE: Erstelle einen neu Klasse, welche Du von CButton ableitest
->heist das die neu erstellte Klasse hat die Eigenschaften von der Klasse CButton??

->Aber ich habe doch gar kein Button im Dialogfeld noch drin

->Wie wir das verknüpft

->Wie ist es wenn man mehrere Buttons hat, mus man dann für jedes Button eine neue Klasse von CButton ableiten??

4.Member-Funktionen:
a.Member-Funktionen erzeugen:
-> Klassen-Name : CxyzDlg
-> Objekt-ID: IDC_xyz_Button
-> Nachricht: BN_CLICKED
b. Source-Code´s hinzu fügen

Nochmals danke für deine Hilfe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
30.03.2003, 15:57 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo freedom,

Zitat:
freedom postete

->Aber ich habe doch gar kein Button im Dialogfeld noch drin


Jetzt stehe ich aber auf dem Schlauch... Ich denke du willst Steuerelement zur Laufzeit verschieben? Alles weitere wenn das geklärt ist.
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
31.03.2003, 01:44 Uhr
freedom



hallo Uwe,

tut mir leid dass ich dich jetzt durchanander gebracht habe.
Ja ich möchte Button´s verschieben, normal sind diese ja starr an eine Position.
Ich meine du hast doch das Code oben ja auch mit einem Projekt angefangen.
D.h. du hast zuerst ein Projekt erstellt (MFC-Anwendung) mit einem Projekt namen versehen und danach hast du doch die Steuerelemente im RessourceView erstellt usw.
Diese schritte wollte ich beschrieben haben, damit ich das nachvollziehen kann

Danke für deine Hilfe
Gruss freedom
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: