21. april 2003 - 21:40Der 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å...
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.
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
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)
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
Synes godt om
Ny brugerNybegynder
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.