Avatar billede hhdsleizer Nybegynder
21. april 2003 - 21:40 Der er 3 kommentarer og
3 løsninger

Message map???

Som nogen måske ved er jeg ved at prøve og lære MFC...
Der er dog en ting jeg er lidt i tvivl om.
Hvorfor skal der være et Message map? Hvordan fungere det?

Så vil høre om jeg kan få en _meget_ grundig forklaring som selv min oldemor ville forstå...

Sleizer
Avatar billede arne_v Ekspert
21. april 2003 - 21:54 #1
Avatar billede jpk Nybegynder
22. april 2003 - 10:41 #2
I standard Win32 har man nogle message der kan reageres på, fx WM_LBUTTONDOWN når venstre musetest trykkes ned. Dette er dog et mere simpelt tilfælde, men ta'r vi bare et tryk på en knap, bliver koden mere omfattende, fx kunne koden til at se hvilken knap der trykkes på, se sådan ud:

switch (message)
{
case WM_COMMAND:
    wmId = LOWORD(wParam);
    switch (wmId)
    {
    case IDM_MY_BUTTON1:
        // Gør et eller andet
        MyFunctionCall();
        break;
    }
}

MFC gør dette mere simpelt og objektorienteret ved at at "mappe" trykket på en knap med kaldet af en funktion. Understående map entry giver samme resultat, nemlig at funktionen MyFunctionCall kaldes ved tryk på knappen med ID'et IDM_MY_BUTTON1.

ON_BN_CLICKED(IDM_MY_BUTTON1, MyFunctionCall)
Avatar billede cplus Nybegynder
23. april 2003 - 12:40 #3
Et messagemap "binder" handlinger til funktioner. Nu ved jeg ikke om du kender til hardware programmering -hvor man springer til et interrupt vektor når en påvirkning opstår.
(Dette eks. er fra App klassen i et MFC project)

Her er et ekspempel:
//{{AFX_MSG(CDll32App)
    afx_msg void OnAppAbout();
    afx_msg void OnFileNew();
        // NOTE - the ClassWizard will add and remove member functions here.
        // DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

Her erklæres at funktionen er en message map event handler!! med:
afx_msg <declaration> //1. funktionen er del af message map 2.funktionen

Selve implementeringen synliggør så hvilken message der benytter OnFileNew

BEGIN_MESSAGE_MAP(CDll32App, CWinApp)
    //{{AFX_MSG_MAP(CDll32App)
    ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
    // NOTE - the ClassWizard will add and remove mapping macros here.
    //    DO NOT EDIT what you see in these blocks of generated code!
    //}}AFX_MSG_MAP
    // Standard file based document commands
    ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)<---------------
    ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
    // Standard print setup command
    ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP()

1. ON_COMMAND (Når følgende kommando sendes til applikatioen)
2. ID_FILE_NEW <--Et ID på et menupunkt... ( Tænk på file->Open )
3. Skal følgende event handler (det er bare funktionen OnFileNew) kaldes! :)

Håber det hjalp lidt. Hvis du stadigvæk synes det er lidt svært -så lad det lige synke lidt.

Når der nu står ON_COMMAND er det fordi at det er et menupunkt. Det kunne også være ON_MESSAGE... Hvor man f.eks. selv har defineret en message, som sendes til applikationen via en funktion, som f.eks. PostMessage(hwnd, UINT/*dword*/ mesg)...

Hvis du ejer MSDN / eller..... ja så prøv at studere det dér også.. Der er mange dybdegående artikler, som kan hjælpe dig på vej.
Alternativt kan du benytte det online msdn på msdn.microsoft.com
Avatar billede cplus Nybegynder
23. april 2003 - 12:43 #4
De store makro navne f.eks. ON_COMMAND, WM_DESTROY, WM_LBUTTONDOWN -er blot konstanter, som identificerer et nummer med en bestemt handling sendt af kernens øverste lag (vil jeg mene)
Avatar billede hhdsleizer Nybegynder
25. april 2003 - 10:25 #5
hmmm får lige set på det i aften...
Avatar billede hhdsleizer Nybegynder
26. april 2003 - 23:31 #6
hmm har vist fattet det:D så må jeg lige forklare oldedmor det imorgen;)
Jeg giver jer alle point da jeg ikke ved hvem der gav mig tippet der fik det til at slå klik...

Sleizer
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester