Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » maus-hilfe oder wie es auch immer heisst

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 ] [ 2 ] > 3 < [ 4 ]
020
18.03.2004, 16:01 Uhr
Tommix



Ich hab schon schlimmeres gesehen Ich persönlich mache einiges anders, aber das ist Geschmackssache. Ein Kritikpunkt wäre, dass Du viel castest - und das auch noch im C-Stil. Dadurch untergräbst Du die Typsicherheit.

C++:
CButton* = (CButton*)GetDlgItem(IDC_IRGEND_WAS);


"funktioniert" auch, wenn das betreffende Control gar kein Button ist. Eine Membervariable vom Typ CButton anzulegen ist sauberer.
Ansonsten versuche ich die MFC wenn schon, dann auch konsequent einzusetzen, also CWinThread statt API-Call, CArray statt std::vector - aber da scheiden sich halt die Geschmäcker.

Gruss, Tommix

Dieser Post wurde am 18.03.2004 um 16:02 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
021
18.03.2004, 23:20 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Hi Tommix,
da du mein Projekt ja nun gesehen hast und weisst was ich machen will kannst du mir vielleicht ja noch einen Tipp geben.

Eigentlich wollte ich sowas machen wenn der User mit der Mouse über einen Punkt geht das dann an der Stelle ein ToolTipText erscheint mit dem Werten des Punktes.

Ich hab mir überlegt das es wahrscheinlich besser gehen würde wenn ich in der art verfahren würde

WM_MOUSEMOVE abfangen und checken ob der Cursor auf einem Punkt liegt.
Soweit müsste ich das ja noch hinbekommen. Problem ist wie mach ich das, wenn der Cursor einen Punkt streift das dann ein ToolTipText artiges Teil kommt das mir die Werte anzeigt. Ist das so möglich wie ich mir das vorstelle?

Bevor ich da tausend verschiedene Sachen ausprobiere vielleicht hast du ja einen Tipp für mich... wie du da rangehen würdest....
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
022
19.03.2004, 07:54 Uhr
Tommix



Hallo,
für den Fall musst Du ein nicht-modales Fensterchen ohne Titelzeile machen, dass über WM_MOUSEMOVE oder Timer wieder entfernt wird.

Gruss, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
023
19.03.2004, 11:44 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


hmm das hab ich noch nicht gemacht, ist mir gar nicht klar wie das gehen soll
ich hab das bisher soweit

am ende von PaintDiagramm rufe ich PaintPointInformation so auf

C++:
CPoint pos;
GetCursorPos(&pos);
ScreenToClient(&pos);
PaintPointInformation(pos);




C++:
void DiagrammDlg::PaintPointInformation(CPoint point){

    CTestabcDlg* dp=(CTestabcDlg*)pDlg;
    CString str;
    CRect rect;
    CRgn WndRgn;
    CPoint offset;
    int i;
    
    (GetDlgItem(IDC_STATIC_DIAGRAMM))->GetWindowRect(&rect);
    this->ScreenToClient(&rect);
    WndRgn.CreateRectRgnIndirect(&rect); //sinnlos eine Rgn initialisieren damit SetRectRgn nicht abschmiert

    for(i=first_point_index;i<min(dp->values.size(),first_point_index+width/pointdistance);++i){//für jeden Punkt checke ob der Cursor in seiner Reichweite ist
        offset.x=rect.TopLeft().x+5+(i-first_point_index)*pointdistance;
        offset.y=rect.TopLeft().y+height-(height*(dp->values[i]-von)/(bis-von));
        WndRgn.SetRectRgn(offset.x-3,offset.y-3,offset.x+3,offset.y+3);
        if(WndRgn.PtInRegion(point)){
            str.Format("%.2f",dp->values[i]);
            m_ctlToolTip.UpdateTipText(str,GetDlgItem(IDC_STATIC_DIAGRAMM)); //oder vorher hatte ich hier halt AfxMessageBox(str);
        }
    }
    
}



funzt soweit auch ganz gut aber wie ich das jetzt machen muss das mein kleiner fensterchen aufblinkt wenn die if-bedinung true ist, ist mir gar nicht klar?
hast du vielleicht ein bisschen code für mich... Bitte Bitte

--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
024
19.03.2004, 12:54 Uhr
Tommix



Nein, ich glaube nicht, dass es vorgesehen ist, ein TooltipCtrl programmtechnisch erscheinen zu lassen. Du wirst es wohl wie mit der MessageBox machen müssen, nur dass Du sie durch einen "normalen" Dialog ohne Titelzeile mit gelben Hintergrund usw. ersetzt.

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
025
19.03.2004, 12:57 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@tommix
wie mach ich das
was zum hencker genau ist ein normaler dialog ohne titelzeile.
und wie muss ich das aufrufen
Ich hab echt kein plan davon...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
026
19.03.2004, 14:49 Uhr
Tommix



Naja Du bastelst Dir einen Dialog, der wie der gewünschte Tooltip aussieht und schaltest unter "Format" "Titelleiste" ab. Dann erzeugst ganz normal eine Klasse dazu, sagen wir mal CPseudoToolTip und fügst eine Instanz in den Dialog mit dem Diagramm ein. In die OnInitDialog selbiger kommt etwas in der Art:

C++:
m_toolTip.Create(IDD_TOOLTIP, this);


Bei mir ist Tooltip überall zu shen:

C++:
void CToolTipTestDlg::OnMouseMove(UINT nFlags, CPoint point)
{
    ClientToScreen(&point);

    if (!m_toolTip.IsVisible()) m_toolTip.Show(point);

    CDialog::OnMouseMove(nFlags, point);
}


Du verwendest den Test, den Du schon hast. In der ToolTip-Klasse gibts dann:

C++:
void CPseudoToolTip::Show(CPoint point)
{
    SetWindowPos(&wndTopMost, point.x, point.y, 0, 0,
        SWP_NOACTIVATE | SWP_NOSIZE | SWP_SHOWWINDOW);

    m_visible = true;

    SetTimer(ID_TIMER, 1000, NULL);
}

void CPseudoToolTip::Hide()
{
    ShowWindow(SW_HIDE);

    m_visible = false;
}

void CPseudoToolTip::OnTimer(UINT nIDEvent)
{
    Hide();    
    CDialog::OnTimer(nIDEvent);
}

bool IsVisible() const
{
        return m_visible;
}



Das ist zwar arges Gebastele, aber eine "ordentliche" Methode kenne ich nicht.

Gruss, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
027
19.03.2004, 16:11 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@Tommix
Vielen Dank
das mit der Titelzeile hatte ich zwar noch gefunden...

das war mein problem
C++:
m_toolTip.Create(IDD_TOOLTIP, this);

so geht das also.. das kommt wohl davon wenn man immer nur mit dem klassenassi rumklickt und einem ein paar zusammenhänge fehlen... mit create schmeisst man also das teil an...

so was bei mir nicht funzt ist der timer...

kannst du mir das mal genauer erklären
ich habe mir da zwar mit nem sleep was gebastelt aber mir wärs lieber wenn ich verstehen würde wie das mit dem timer funktioniert.
Find ich ne gute idee die intelligenz in die eigene Tooltipklasse auszulagern.
wobei ich am ende nicht weiss ob ichs bei nem timer belassen werde weil der das teil dann ja immer ausbleden wird um es dann wieder einzublenden.
besser ist wahrscheinlich ein check ob es sich überhaupt in einer CRGn befindet und wenn nicht ausblenden sonst einblenden.

wäre aber geil wenn du mir das mit dem timer trotzdem erklären könntest bei mir springt der einfach nicht an, soll heissen der ist die ganze zeit immer sichtbar. Bisher hab ich timer immer mit nem eigenen thread und nem Sleep realsiert aber warum kompliziert machen wenns ne einfache lösung dafür gibt (die ich anscheinend leider nicht durchschaue... :cry
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 19.03.2004 um 16:12 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
028
19.03.2004, 16:20 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


ach so falls es dich interessiert...
so siehts jetzt aus und funzt wunderbar

C++:
void DiagrammDlg::PaintPointInformation(CPoint point){

    CTestabcDlg* dp=(CTestabcDlg*)pDlg;
    CString str;
    CRect rect;
    CRgn WndRgn;
    CPoint offset;
    int i;
    
    (GetDlgItem(IDC_STATIC_DIAGRAMM))->GetWindowRect(&rect);
    this->ScreenToClient(&rect);
    WndRgn.CreateRectRgnIndirect(&rect); //sinnlos eine Rgn initialisieren damit SetRectRgn nicht abschmiert

    pointInRgn=false;
    for(i=first_point_index;i<min(dp->values.size(),first_point_index+width/pointdistance);++i){
        offset.x=rect.TopLeft().x+5+(i-first_point_index)*pointdistance;
        offset.y=rect.TopLeft().y+height-(height*(dp->values[i]-von)/(bis-von));
        WndRgn.SetRectRgn(offset.x-3,offset.y-3,offset.x+3,offset.y+3);
        if(WndRgn.PtInRegion(point)){
            pointInRgn=true;
            str.Format("%.2f",dp->values[i]);
            ToolTipDlg.setText(str);
            ToolTipDlg.Show(point);
        
        }else pointInRgn|=false;
    }
    if(!pointInRgn)ToolTipDlg.ShowWindow(false);

    
}



das ich auf das dumme create nicht von selber gekommen bin dafür könnt ich mich immer noch schlagen. Nochmal vielen Dank ohne dich hätte ich das nicht ohne 5 tage drüber brüten und verzweifeln (wenn überhaupt) hinbekommen
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
029
20.03.2004, 08:26 Uhr
Tommix



'Morgen,
gratuliere.
Zu dem Timer: Die Quelle meiner Weisheit (neben diesem Forum).

Gruss, Tommix


Dieser Post wurde am 20.03.2004 um 08:27 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] [ 2 ] > 3 < [ 4 ]     [ 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: