2011-09-22 10 views
5

La siguiente aparece en mi WinProc:switch/case dentro de un 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); 
       } 
      } 
     } 
    } 
} 

¿Hay algún problema con la declaración y utilización de variables de este modo?

Configuré un punto de interrupción después de declarar y usar límites (aún dentro del alcance) pero parece que no puedo encontrarlo en la ventana 'Locales' en el depurador. ¿Qué está mal?

No quería enviar el correo basura con un montón de código no relacionado, pero aquí está el WinProc completo.

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

¿En qué ámbito? El depurador puede "salirse del alcance" que contiene límites tan pronto como "GetBounds" regrese, incluso si simula que todavía está terminando esa línea. Coloque 'hr = hr;' en la línea después y vea si eso ayuda. –

+0

Lo puse después y todavía no aparece por alguna razón. No quería empantanar la publicación con otros detalles, pero publicaré todo el código anterior (sacando los otros mensajes de WM). Vuelve atrás en un segundo. – Kyle

+0

El único problema es que las variables no aparecen en la ventana de locales? ¿Estás en una versión de lanzamiento? –

Respuesta

1

no hay ningún problema en la declaración de variables de esa manera, ya que ha especificado un nuevo ámbito para el caso VK_LEFT. Si no declarara un ámbito separado, las variables serían visibles pero posiblemente no inicializadas, lo que constituiría un problema. Tenga en cuenta que se perdió unos pocos breaks por cierto.