c ++ - Switch statement brug

Indlæg af Hanne Mølgaard Plasc

Problem



Skal jeg bruge denne form for switch statement:


  switch(msg)
  {
    case WM\_LBUTTONDOWN:
    {
           char szFileName[MAX\_PATH];
           HINSTANCE hInstance = GetModuleHandle(NULL);
           GetModuleFileName(hInstance, (LPWCH)szFileName, MAX\_PATH);
           MessageBox(hwnd, (LPCWSTR)szFileName, L"This program is:", MB\_OK | MB\_ICONINFORMATION);
    }
    break;

    case WM\_CLOSE:
        DestroyWindow(hwnd);
    break;
    case WM\_DESTROY:
        PostQuitMessage(0);
    break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
  }
  return 0;


eller lave en funktion for den første tilfælde konstant?

Bedste reference


Der er ikke noget galt med hvordan du har det, men det er nok renere kode til at ringe til en funktion, så du kan holde dine funktioner en rimelig størrelse.

Andre referencer 1


Se også på beskedkiksere [9]

Andre referencer 2


Hvad skal du gøre, når vil du hente 20 eller 50 vinduemeddelelser?

Måske er det rigtig tid til at oprette kort - begivenheder på funktioner (fuktorer) og kalde dem?

Eller start med at bruge regel - en besked=et funktionsopkald.







char szFileName[MAX\_PATH];
HINSTANCE hInstance = GetModuleHandle(NULL);
GetModuleFileName(hInstance, (LPWCH)szFileName, MAX\_PATH);
MessageBox(hwnd, (LPCWSTR)szFileName, L"This program is:", MB\_OK | MB\_ICONINFORMATION);


Kan du forklare dette mærkelige trick med convetation (LPCWSTR) szFileName. Hvorfor bruger du ikke array wchar\_t i stedet casting? - du vil have stort problem med lange stier (path\_length> MAX\_PATH/sizeof (wchar\_t))


En anbefaling - undgå at bruge kaster i almindelighed og C-stil kaster i særdeleshed.

Andre referencer 3


Hvis du spørger om du skal slå koden i første omgang til en funktion, så ja, helt sikkert.

Andre referencer 4


Nå, det ville afhænge af, hvor mange andre tilfælde du ville have.


Noget så lille som det ville jeg sige, det er ikke værd at gøre det til en funktion, men hvis din switch erklæring indeholder flere tilfælde, bliver det bare grimt, især hvis mange af sagerne har flere linjer sådan. At sætte det i en funktion ville rydde det op og få din kode til at se pænere ud.

Andre referencer 5


En af de vigtigste ting, jeg siger, ville være konsistens. Hvis du opretter en funktion til LBUTTONDOWN, skal du danne en funktion til alt. På denne måde er der et forudsigeligt mønster for, hvor du kan finde ting, hvis det bryder.


Relateret til emnet ved hånden:


Personligt finder jeg et if/else hvis mønster til at fungere bedre, da det eliminerer problemet med en glemt pause:


if (msg == WM\_LBUTTONDOWN) {
    // your code here
    return 0;
} else if (msg == WM\_DESTROY) {
    PostQuitMessage(0);
    return;
} else if (msg == WM\_KEYDOWN) {
    if (wp == VK\_F1) {
        DoSomething();
        return;
    }
}
return DefWindowProc(hWnd, msg, wp, lp);


Det er virkelig op til dig, til sidst.

Andre referencer 6


Jeg vil formentlig erklære et kort og bruge funktorer for hver besked:


typedef std::map<UINT, boost::function<int (HWND, WPARAM, LPARAM) > > messageFuncs\_t;
messageFuncs\_t messageFuncs;


Så når vinduesklassen er oprettet, skal du blot tilføje en ny funktion til hver besked:


messageFuncs[WM\_LBUTTONDOWN] = &onMouseDownEvent;


... Og derefter implementere meddelelsessløjfen således:


messageFuncs\_t::iterator fun = messageFuncs.find(msg);
if(fun != messageFuncs.end())
    return (*fun)(hWnd, wparam, lparam);
else
    return DefWindowProc(hWnd, msg, wp, lp);


... eller hvad der virker. Så er det nemt at tilføje nye meddelelser, og arbejdet for hver er delegeret til en funktion. Rent, kortfattet og giver mening.

Andre referencer 7


Du mangler en pause i det første tilfælde . Bortset fra det, ville jeg helt sikkert sætte denne kode på en separat funktion.

Andre referencer 8


Det er fint, men jeg synes generelt ikke om blandestil og indrykning. Hvis jeg havde brug for at fastgøre en sag, ville jeg nok tro dem alle og holde indrykket konsistent.


Også bb er rigtigt, du skal bruge wchar\_t array i stedet for char i så fald.

Andre referencer 9


Jeg skriver temmelig mange Win32-beskedk crackere som disse kontakter.


Min tommelfingerregel er: Wiring up adfærd går ind i kontakten, adfærd i en separat funktion. Det betyder normalt, at kontakten indeholder beslutningen om, hvorvidt denne kommando skal håndteres (fx tester for afsender-id) og 'prettyfying' parametrene.


Så i det særlige tilfælde, en separat funktion.


Den oprindelige motivation er, at jeg ofte ender med at udløse adfærden under andre omstændigheder (fx 'når der ikke er angivet noget filnavn, og dialogen kaldes med moon parameteren indstillet til full, vises dialogboksen SaveAs straks').