各位朋友,您们好:
1、在NeHe教程第32课中有段得到鼠标在窗口中的位置和鼠标左键被按下的消息响应事件函数,代码如下:
LRESULT CALLBACK WindowProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
// Get The Window Context
GL_Window* window = (GL_Window*)(GetWindowLong (hWnd, GWL_USERDATA)); switch (uMsg) // Evaluate Window Message
{
case WM_SYSCOMMAND: // Intercept System Commands
{
switch (wParam) // Check System Calls
{
case SC_SCREENSAVE: // Screensaver Trying To Start?
case SC_MONITORPOWER: // Monitor Trying To Enter Powersave?
return 0; // Prevent From Happening
}
break; // Exit
}
return 0; // Return case WM_CREATE: // Window Creation
{
CREATESTRUCT* creation = (CREATESTRUCT*)(lParam); // Store Window Structure Pointer
window = (GL_Window*)(creation->lpCreateParams);
SetWindowLong (hWnd, GWL_USERDATA, (LONG)(window));
}
return 0; // Return case WM_CLOSE: // Closing The Window
TerminateApplication(window); // Terminate The Application
return 0; // Return case WM_SIZE: // Size Action Has Taken Place
switch (wParam) // Evaluate Size Action
{
case SIZE_MINIMIZED: // Was Window Minimized?
window->isVisible = FALSE; // Set isVisible To False
return 0; // Return case SIZE_MAXIMIZED: // Was Window Maximized?
window->isVisible = TRUE; // Set isVisible To True
ReshapeGL (LOWORD (lParam), HIWORD (lParam));
return 0; case SIZE_RESTORED: // Was Window Restored?
window->isVisible = TRUE; // Set isVisible To True
ReshapeGL (LOWORD (lParam), HIWORD (lParam));
return 0;
}
break; case WM_KEYDOWN: // Update Keyboard Buffers For Keys Pressed
if ((wParam >= 0) && (wParam <= 255)) // Is Key (wParam) In A Valid Range?
{
window->keys->keyDown [wParam] = TRUE;// Set The Selected Key (wParam) To True
return 0;
}
break; case WM_KEYUP: // Update Keyboard Buffers For Keys Released
if ((wParam >= 0) && (wParam <= 255)) // Is Key (wParam) In A Valid Range?
{
window->keys->keyDown[wParam] = FALSE;
return 0;
}
break; case WM_TOGGLEFULLSCREEN: // Toggle FullScreen Mode On/Off
g_createFullScreen = (g_createFullScreen == TRUE) ? FALSE : TRUE;
PostMessage (hWnd, WM_QUIT, 0, 0);
break; // Break case WM_LBUTTONDOWN:
{
mouse_x = LOWORD(lParam);
mouse_y = HIWORD(lParam);
Selection();
}
break; case WM_MOUSEMOVE:
{
mouse_x = LOWORD(lParam);
mouse_y = HIWORD(lParam);
}
break;
} return DefWindowProc (hWnd, uMsg, wParam, lParam);
}2、我把这个课程移植到MFC下,为了实现同样的功能,就在视类COpenGLView中添加了OnMouseMove和OnLButtonDown消息响应函数,代码如下:
void COpenGLView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
mouse_x = LOWORD(nFlags);
mouse_y = HIWORD(nFlags);
Selection();
CView::OnLButtonDown(nFlags, point);
}void COpenGLView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
mouse_x = LOWORD(nFlags);
mouse_y = HIWORD(nFlags);
CView::OnMouseMove(nFlags, point);
}
注:mouse_x和mouse_y是自定义的得到鼠标坐标的变量。3、但总是实现不了原课程中的效果,请问问题出在哪呢,请各位大侠给以指导,先谢谢啦!
1、在NeHe教程第32课中有段得到鼠标在窗口中的位置和鼠标左键被按下的消息响应事件函数,代码如下:
LRESULT CALLBACK WindowProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
// Get The Window Context
GL_Window* window = (GL_Window*)(GetWindowLong (hWnd, GWL_USERDATA)); switch (uMsg) // Evaluate Window Message
{
case WM_SYSCOMMAND: // Intercept System Commands
{
switch (wParam) // Check System Calls
{
case SC_SCREENSAVE: // Screensaver Trying To Start?
case SC_MONITORPOWER: // Monitor Trying To Enter Powersave?
return 0; // Prevent From Happening
}
break; // Exit
}
return 0; // Return case WM_CREATE: // Window Creation
{
CREATESTRUCT* creation = (CREATESTRUCT*)(lParam); // Store Window Structure Pointer
window = (GL_Window*)(creation->lpCreateParams);
SetWindowLong (hWnd, GWL_USERDATA, (LONG)(window));
}
return 0; // Return case WM_CLOSE: // Closing The Window
TerminateApplication(window); // Terminate The Application
return 0; // Return case WM_SIZE: // Size Action Has Taken Place
switch (wParam) // Evaluate Size Action
{
case SIZE_MINIMIZED: // Was Window Minimized?
window->isVisible = FALSE; // Set isVisible To False
return 0; // Return case SIZE_MAXIMIZED: // Was Window Maximized?
window->isVisible = TRUE; // Set isVisible To True
ReshapeGL (LOWORD (lParam), HIWORD (lParam));
return 0; case SIZE_RESTORED: // Was Window Restored?
window->isVisible = TRUE; // Set isVisible To True
ReshapeGL (LOWORD (lParam), HIWORD (lParam));
return 0;
}
break; case WM_KEYDOWN: // Update Keyboard Buffers For Keys Pressed
if ((wParam >= 0) && (wParam <= 255)) // Is Key (wParam) In A Valid Range?
{
window->keys->keyDown [wParam] = TRUE;// Set The Selected Key (wParam) To True
return 0;
}
break; case WM_KEYUP: // Update Keyboard Buffers For Keys Released
if ((wParam >= 0) && (wParam <= 255)) // Is Key (wParam) In A Valid Range?
{
window->keys->keyDown[wParam] = FALSE;
return 0;
}
break; case WM_TOGGLEFULLSCREEN: // Toggle FullScreen Mode On/Off
g_createFullScreen = (g_createFullScreen == TRUE) ? FALSE : TRUE;
PostMessage (hWnd, WM_QUIT, 0, 0);
break; // Break case WM_LBUTTONDOWN:
{
mouse_x = LOWORD(lParam);
mouse_y = HIWORD(lParam);
Selection();
}
break; case WM_MOUSEMOVE:
{
mouse_x = LOWORD(lParam);
mouse_y = HIWORD(lParam);
}
break;
} return DefWindowProc (hWnd, uMsg, wParam, lParam);
}2、我把这个课程移植到MFC下,为了实现同样的功能,就在视类COpenGLView中添加了OnMouseMove和OnLButtonDown消息响应函数,代码如下:
void COpenGLView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
mouse_x = LOWORD(nFlags);
mouse_y = HIWORD(nFlags);
Selection();
CView::OnLButtonDown(nFlags, point);
}void COpenGLView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
mouse_x = LOWORD(nFlags);
mouse_y = HIWORD(nFlags);
CView::OnMouseMove(nFlags, point);
}
注:mouse_x和mouse_y是自定义的得到鼠标坐标的变量。3、但总是实现不了原课程中的效果,请问问题出在哪呢,请各位大侠给以指导,先谢谢啦!
mouse_y = point.y;
{
// TODO: Add your message handler code here and/or call default
mouse_x = LOWORD(nFlags);
mouse_y = HIWORD(nFlags);CView::OnMouseMove(nFlags, point);
}
===================================
你用错了:
CWnd::OnLButtonDown
afx_msg void OnLButtonDown( UINT nFlags, CPoint point );ParametersnFlagsIndicates whether various virtual keys are down. This parameter can be any combination of the following values: MK_CONTROL Set if the CTRL key is down.
MK_LBUTTON Set if the left mouse button is down.
MK_MBUTTON Set if the middle mouse button is down.
MK_RBUTTON Set if the right mouse button is down.
MK_SHIFT Set if the SHIFT key is down.
pointSpecifies the x- and y-coordinate of the cursor. These coordinates are always relative to the upper-left corner of the window.