2011-09-22 2 views
5

Il seguente appare nel mio WinProc:switch/case all'interno di uno switch/case

if(message == WM_CREATE) 
{ 
//Do WM_CREATE stuff 
} 

else 
{ 
    switch(message) 
    { 
     case WM_KEYDOWN: 
     { 
      switch(wParam) 
      { 
       case VK_LEFT: 
       { 
       //declare new variable here 
       D2D1_RECT_F bounds; 
       HRESULT hr = pDemoApp->mpGeometryGroup->GetBounds(pDemoApp->mTransform, &bounds); 
       } 
      } 
     } 
    } 
} 

C'è qualche problema con il dichiarare e utilizzare le variabili in questo modo?

Ho impostato un punto di interruzione dopo che dichiaro e uso i limiti (sempre nell'ambito) ma non riesco a trovarlo nella finestra "Locali" nel debugger. Che c'è?

non volevo spammare il palo con un mucchio di codice estraneo, ma qui è la WinProc pieno.

LRESULT CALLBACK DemoApp::WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
LRESULT result = 0; 

if (message == WM_CREATE) 
{ 
    LPCREATESTRUCT pcs = (LPCREATESTRUCT)lParam; 
    DemoApp *pDemoApp = (DemoApp *)pcs->lpCreateParams; 

    ::SetWindowLongPtrW(
     hwnd, 
     GWLP_USERDATA, 
     PtrToUlong(pDemoApp) 
     ); 

    result = 1; 
} 
else 
{ 
    DemoApp *pDemoApp = reinterpret_cast<DemoApp *>(static_cast<LONG_PTR>(
     ::GetWindowLongPtrW(
     hwnd, 
     GWLP_USERDATA 
     ))); 

    bool wasHandled = false; 

    if (pDemoApp) 
    { 
     switch (message) 
     { 
     case WM_SIZE: 
      { 
       UINT width = LOWORD(lParam); 
       UINT height = HIWORD(lParam); 
       pDemoApp->OnResize(width, height); 
      } 
      result = 0; 
      wasHandled = true; 
      break; 

     case WM_DISPLAYCHANGE: 
      { 
       InvalidateRect(hwnd, NULL, FALSE); 
      } 
      result = 0; 
      wasHandled = true; 
      break; 

     case WM_PAINT: 
      { 
       pDemoApp->OnRender(); 
       ValidateRect(hwnd, NULL); 
      } 
      result = 0; 
      wasHandled = true; 
      break; 

     case WM_KEYDOWN: 
      { 
       D2D1_SIZE_F rtSize = pDemoApp->mpRenderTarget->GetSize(); 
       static float angle = 0.0f; 

       switch(wParam) 
       { 
       case VK_LEFT: 
        { 

         angle -= 90; 

         if(angle < -360) 
          angle = 0; 

         D2D1_RECT_F bounds; 
         HRESULT hr = pDemoApp->mpGeometryGroup->GetBounds(pDemoApp->mTransform, &bounds); 

          pDemoApp->mTransform = D2D1::Matrix3x2F::Rotation(
          angle, 
          D2D1::Point2F((bounds.right + bounds.left)/2, (bounds.bottom + bounds.top)/2) 
          ); 

          hr = hr; 


         InvalidateRect(hwnd, NULL, FALSE); 
         break; 
         } 

       case VK_RIGHT: 
        { 
         angle += 90; 

         if(angle > 360) 
          angle = 0; 

         D2D1_RECT_F bounds; 
         pDemoApp->mpGeometryGroup->GetBounds(pDemoApp->mTransform, &bounds); 

          pDemoApp->mTransform = D2D1::Matrix3x2F::Rotation(
          angle, 
          D2D1::Point2F((bounds.right + bounds.left)/2, (bounds.bottom + bounds.top)/2) 
          ); 


         InvalidateRect(hwnd, NULL, FALSE); 
         break; 
        } 

       case VK_DOWN: 
        { 
         pDemoApp->mTransform = pDemoApp->mTransform * D2D1::Matrix3x2F::Translation(
          0.0f, 
          5.0f); 

         InvalidateRect(hwnd, NULL, FALSE); 
         break; 
        } 
       } 
      } 
      result = 0; 
      wasHandled = true; 
      break; 

     case WM_LBUTTONDOWN: 
      { 
       FLOAT xPos, yPos; 

       xPos = LOWORD(lParam); 
       yPos = HIWORD(lParam); 

       BOOL contains = false; 

       pDemoApp->mpGeometryGroup->FillContainsPoint(
        D2D1::Point2F(xPos, yPos), 
        pDemoApp->mTransform, 
        &contains); 

       if(contains) 
        MessageBoxA(hwnd, "Hooray!", NULL, NULL); 

       D2D1_GEOMETRY_RELATION relation; 

       pDemoApp->mpGeometryGroup->CompareWithGeometry(
        pDemoApp->mpSecondGeometryGroup, 
        pDemoApp->mTransform, 
        0.001f, 
        &relation); 

       if(relation == D2D1_GEOMETRY_RELATION_CONTAINS || 
        relation == D2D1_GEOMETRY_RELATION_IS_CONTAINED || 
        relation == D2D1_GEOMETRY_RELATION_OVERLAP) 
       { 
        MessageBoxA(hwnd, "overlap or contains.", 0, 0); 
       } 


      } 
      result = 0; 
      wasHandled = true; 
      break; 

     case WM_DESTROY: 
      { 
       PostQuitMessage(0); 
      } 
      result = 1; 
      wasHandled = true; 
      break; 
     } 
    } 

    if (!wasHandled) 
    { 
     result = DefWindowProc(hwnd, message, wParam, lParam); 
    } 
} 

return result; 

}

+0

Sempre all'interno del quale portata? Il debugger può "rientrare nell'ambito" contenga dei limiti non appena restituisce "GetBounds", anche se finge che finisca ancora quella linea. Metti 'hr = hr;' sulla linea dopo e vedi se questo aiuta. –

+0

L'ho messo dopo e non si presenta ancora per qualche motivo. Non volevo impantanare il post con altri dettagli, ma posterò l'intero codice sopra (eliminando gli altri messaggi WM). Torna tra un secondo. – Kyle

+0

L'unico problema sono le variabili che non compaiono nella finestra dei locali? Sei in una versione di rilascio? –

risposta

1

non c'è nessun problema nel dichiarare le variabili in questo modo, dal momento che è stato specificato un nuovo ambito per il caso VK_LEFT. Se non stavi dichiarando un ambito separato, allora le variabili sarebbero visibili ma probabilmente non inizializzate, il che sarebbe un problema. Si noti che hai perso alcuni breaks a proposito.