Sendmessage und Konsorten

Twist

Grünschnabel
Hallo,

ich hab zwar schon beiträge im Forum durchsucht aber sorichtig hab ich das mit der SendMessage-Funktion noch net verstanden.

Mein Problem ist das ich in einer SDI Anwendung ein Objektgerüst in dem Doc-Objekt erstelle und es durch abfragen über Dialogfelder initialisiere.
ob es Komplett aufgebaut wurde, kontolliert eine Funktion im Doc-Objekt.
Diese Funktion sollte dann eine Message an das View-Objekt schicken welches dann über eine Funktion ein CtrlTab initialisieren soll jenes dann auf mehren Seiten die gesammelten Daten des Objektgerüstes in einem ListCtrl wieder gibt.

Laut Mehreren Beiträgen:

hab ich dann in meine Quelltexte

Code:
//Doc Header 
#define WM_AUSGABE      101 

//Doc Cpp 
    { 
        m_pcks.m_ckmKnMenge.m_nMoeglicheKnotenmenge=m_pcks.m_ckmKnMenge.m_nTatsaechlicheKnotenmenge; 
        m_pcks.m_ckmKnMenge.m_fnTatsKnFeldAllok(); 
        m_pcks.m_ckmKnMenge.m_fnKnFeldCopy(); 
        m_pcks.m_ckmKnMenge.m_fnMoeKnFeldLoeschen(); 
       PostMessage(ID_AUSGABE,0,0); 
    } 
} 

//View Header 
    afx_msg void OnAusgabe(); 
    virtual BOOL PreTranslateMessage(MSG* pMsg); 

//View Cpp 
IMPLEMENT_DYNCREATE(CKabelstPrfView, CRecordView) 

BEGIN_MESSAGE_MAP(CKabelstPrfView, CRecordView) 
    // Standarddruckbefehle 
    ON_COMMAND(ID_FILE_PRINT, CRecordView::OnFilePrint) 
    ON_COMMAND(ID_FILE_PRINT_DIRECT, CRecordView::OnFilePrint) 
    ON_COMMAND(ID_FILE_PRINT_PREVIEW, CRecordView::OnFilePrintPreview) 
    ON_COMMAND(ID_AUSGABE, OnAusgabe) 
      ON_MESSAGE(WM_AUSGABE,OnAusgabe) 
END_MESSAGE_MAP() 
//und 
BOOL CKabelstPrfView::PreTranslateMessage(MSG* pMsg) 
{ 
    if(pMsg ->message == WM_AUSGABE) 
    { 
        OnAusgabe(); 
    } 
    return CRecordView::PreTranslateMessage(pMsg); 
}

Eingefügt aber ich bekomme immernoch fehler.

Fehler:
c:\dokumente und einstellungen\twist\eigene dateien\visual studio projects\kabelstprüf\kabelstprüf\kabelstprüfview.cpp(27) : error C2440: 'static_cast': 'void (__thiscall CKabelstPrfView::* )(void)' kann nicht in 'LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)' konvertiert werden
Keine Funktion mit diesem Namen im Gültigkeitsbereich stimmt mit dem Zieltyp überein
KabelstPrüfDoc.cpp

c:\dokumente und einstellungen\twist\eigene dateien\visual studio projects\kabelstprüf\kabelstprüf\kabelstprüfdoc.cpp(144) : error C2664: 'PostMessageA': Konvertierung des Parameters 1 von 'CKabelstPrfDoc *const ' in 'HWND' nicht möglich
Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.

Was mach ich noch Falsch?

Mit freundlichen Grüssen!

Twist
 
c:\dokumente und einstellungen\twist\eigene dateien\visual studio projects\kabelstprüf\kabelstprüf\kabelstprüfdoc.cpp(144) : error C2664: 'PostMessageA': Konvertierung des Parameters 1 von 'CKabelstPrfDoc *const ' in 'HWND' nicht möglich
Das Problem liegt hier:
Code:
    ON_COMMAND(ID_AUSGABE, OnAusgabe) 
    ON_MESSAGE(WM_AUSGABE,OnAusgabe)
ON_MESSAGE erfordert einen Handler mit dieser Signatur: afx_msg LRESULT memberFxn(WPARAM, LPARAM); .
ON_COMMAND dagegen erfordert einen Handler mit dieseer Signatur: afx_msg void memberFxn( );

Der Unterschied liegt darin, dass der erste Handler 2 Parameter benötigt.
Du hast für beide Messages OnAusgabe eingesetzt. Nach deinem Code kannst du OnAusgabe() nur für ON_COMMAND einsetzen, weil die Parameter da passen würden:
Code:
afx_msg void OnAusgabe();
Vorschlag: Mach dir für ON_MESSAGE einen zweiten Handler mit passender Signatur. Falls du LPARAM und WPARAM nicht brauchst, würde es darin ja reichen, OnAusgabe() aufzurufen.
Code:
LRESULT CKabelstPrfView::OnAusgabe_Test( WPARAM w, LPARAM l )
{
  // ignoriere w und l?
  // einfach die andere Methode aufrufen?
  OnAusgabe();
}

---
Ach so, dann sollte du in der Messagemap noch folgende Änderung machen:
Code:
ON_MESSAGE(WM_AUSGABE,OnAusgabe_Test)
 
Zuletzt bearbeitet:
Danke hat geklappt!
nur mußte die TabCtrl Initialisierung in die übschriebene Funktion OnDraw verlegen.
Das CtrlTab soll auf jeder Seite eine ListCtrl
anzeigen . welche sich aber erst später mit Daten füllen sollen!
das TabCtrl wird in der überschriebenen Funktion OnDraw() initialisiert.
Das Klappt auch alles Wunderbar. nur wenn es Das Programm die OnDraw() funktion wieder Verlässt bekomme ich einen AssertFehler der sich wohl in der wincore.cpp meldet. aber da die datei nicht freigegeben ist und mein Assampler mir Kopfschmerzen verursacht. wüsste ich nicht woran es liegen könnte.

Code:
void CKabelstPrfView::OnDraw(CDC* pDC) 
{ 
    RECT ClientRect; 

    //GetClientRect(&ClientRect); 
    ClientRect.bottom = 500; 
    ClientRect.left = 10; 
    ClientRect.right = 700; 
    ClientRect.top= 1; 

    m_AusgabeTab.Create( WS_CHILD | WS_VISIBLE, ClientRect, this, 255 ); 
    m_AusgabeTab.SetExtendedStyle( TCS_EX_FLATSEPARATORS|TCS_BUTTONS | TCS_FLATBUTTONS ); 
    m_AusgabeTab.InsertItem(0,_T("Stecker Tabelle")); 
    m_AusgabeTab.InsertItem(1,_T("Knoten Tabelle")); 
    CKabelstPrfDoc* pmyDoc=GetDocument(); 
    m_AusgabeTab.m_fnInit2(pmyDoc); 
} 

//ErgCtrl 

void CErgCtrl::m_fnInit2(CKabelstPrfDoc* pmyDoc) 
{ 
//    InsertItem(0,_T("Stecker Tabelle"),0); 
//  InsertItem(1,_T("Knoten Tabelle"),1); 
    m_nNumberOfPages=2; 
    m_DocBasisPage=new CDocBasisPage[2]; 
    m_tabCurrent=0; 

 //   InsertItem(2,_T(Übersetzung)); 
    for(int i=0;i<m_nNumberOfPages;i++) 
    { 
        m_DocBasisPage[i].AddPage(&m_DocBasisPage[i].m_SeiteA); 
        m_DocBasisPage[i].m_SeiteA.Create(IDD_AUSGABE_1,this); 
        m_DocBasisPage[i].m_SeiteA.Pageinit(pmyDoc,i); 
        m_DocBasisPage[i].m_SeiteA.ShowWindow(SW_SHOW); 
    } 
    SetRectangle(); 

}
Nachdem die OnDraw() Funktion beendet worden ist sollte das Programm neue Befehle abwarten!

Ich hoffe das einer von euch mir helfen kann!

Mit freundlichen Grüssen!

Twist
 

Neue Beiträge

Zurück