2011-09-22 36 views
5

以下内出现在我的Winproc传:开关/ case的switch /箱

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

是否与声明和使用变量,这样什么问题?

我在声明并使用边界(仍在范围内)后设置了一个断点,但似乎无法在调试器的“本地”窗口中找到它。哪里不对?

我不想用一堆无关的代码来垃圾邮件,但这里是完整的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

仍然在哪个范围内? “GetBounds”返回时,调试器可能会“超出范围”,包含边界,即使它假装仍在完成该行。将'hr = hr;'放在行后,看看是否有帮助。 –

+0

我把它放在后面,因为某些原因它仍然没有出现。我不想让其他细节停滞不前,但我会发布上面的所有代码(取出其他WM消息)。稍后再检查一次。 – Kyle

+0

唯一的问题是变量没有出现在当地人窗口中?你在发布版本吗? –

回答

1

有一个在宣布的方式,因为你已经指定了VK_LEFT情况下,一个新的范围内的变量没有问题。如果你没有声明一个分离的范围,那么变量将是可见的,但可能未初始化,这将是一个问题。请注意,顺便错过了几个breaks