2011-09-22 11 views
5

następujących w moim WinProc:switch/case w przypadku przełącznika/

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); 
       } 
      } 
     } 
    } 
} 

Czy jest jakiś problem z deklarując i stosując zmienne w ten sposób?

Konfiguruję punkt przerwania po deklaracji i użyciu granic (nadal w zakresie), ale nie mogę znaleźć go w oknie "Locals" w debugerze. Co jest nie tak?

Nie chciałem spamować tego postu za pomocą wiązki niepowiązanego kodu, ale tutaj jest pełna wersja WinProc.

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

Nadal w jakim zakresie? Debugger może "wypaść z zakresu", zawierający granice, gdy tylko zwróci się 'GetBounds', nawet jeśli udaje, że wciąż kończy tę linię. Wpisz 'hr = hr;' po linii i sprawdź, czy to pomaga. –

+0

Położyłem to i nadal nie pokazuje się z jakiegoś powodu. Nie chciałem bagatelizować postu z innymi szczegółami, ale opublikuję cały powyższy kod (usuwając inne wiadomości WM). Sprawdź ponownie za sekundę. – Kyle

+0

Jedyny problem to zmienne nie pojawiające się w oknie locals? Czy jesteś w kompilacji wydania? –

Odpowiedz

1

Nie ma problemu w deklarowania zmiennych w ten sposób, ponieważ podałeś nowy zakres przypadku VK_LEFT. Jeśli nie zadeklarowałeś osobnego zakresu, zmienne byłyby widoczne, ale prawdopodobnie nie zainicjowane, co stanowiłoby problem. Zauważ, że tęskniłeś za kilkoma breaks przy okazji.

Powiązane problemy