【发布时间】:2011-09-07 12:50:46
【问题描述】:
我创建了一个自定义消息类型,用于调整我的Window 的大小,称为WM_NEED_RESIZE。我已经在我的 .h 文件中定义了它,并在我的 .cpp 文件中进行了初始化。我还注册了我的WindowProc 函数来接受消息。以下是这些项目的代码:
const uint32 WindowsGLWindow::WM_NEED_RESIZE = WM_USER + 100;
LONG WINAPI WindowsGLWindow::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static PAINTSTRUCT ps;// do I need this?
static sint32 newWidth = 0;
static sint32 newHeight = 0;
bool res = false;
switch (uMsg) {
case WM_PAINT:
//display();
BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
return 0;
case WM_SIZE:
//glViewport(0, 0, LOWORD(lParam), HIWORD(lParam));
res = PostMessage(hWnd, WindowsGLWindow::WM_NEED_RESIZE, wParam, lParam);
std::cout << "WM_SIZE: " << res << std::endl;
return 0;
case WindowsGLWindow::WM_NEED_RESIZE:
std::cout << "WindowsGLWindow::WM_NEED_RESIZE" << std::endl;
break;
case WM_CHAR:
switch (wParam) {
case 27: /* ESC key */
PostQuitMessage(0);
break;
}
return 0;
case WM_CLOSE:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
在另一个函数中,我正在运行PeekMessage(..) 以收集所有消息。这是消息泵的sn-p:
MSG msg;
while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE) == TRUE) // maybe use GetInputState(?) as well?
{
if (msg.message == WM_QUIT)
retVal = -1;
if (msg.message == WindowsGLWindow::WM_NEED_RESIZE) {
uint32 newWidth = LOWORD(msg.lParam);
uint32 newHeight = HIWORD(msg.lParam);
std::cout << "PeekMessage: WindowsGLWindow::WM_NEED_RESIZE" << std::endl;
// call resize only if our window-size changed
if ((newWidth != width_) || (newHeight != height_)) {
resize(newWidth, newHeight);
}
PostMessage(msg.hwnd, WM_PAINT, 0, 0);
}
switch (msg.message) {
case WM_MOUSEMOVE:
// Retrieve mouse screen position
//int x = (short) LOWORD(lParam);
//int y = (short) HIWORD(lParam);
// Check to see if the left button is held down:
//bool leftButtonDown = wParam & MK_LBUTTON;
// Check if right button down:
//bool rightButtonDown = wParam & MK_RBUTTON;
break;
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_LBUTTONUP:
case WM_RBUTTONUP:
case WM_KEYUP:
case WM_KEYDOWN:
/*
switch (msg.wParam) {
case 'W':
// w key pressed
break;
case VK_RIGHT:
// Right arrow pressed
break;
default:
break;
}
*/
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
我的问题是 WM_NEED_RESIZE 消息仅在窗口第一次打开时在消息队列中找到一次,之后我的 PeekMessage(..) 在消息队列中再也找不到它。我真的不确定为什么会这样。然而,它是被WindowProc(..) 方法接收的(这对我没有帮助)。如果你们能提供任何帮助,我将不胜感激。
谢谢
贾勒特
【问题讨论】:
-
为什么你需要在主消息循环中捕获
NEED_RESIZE,你不能在你的WindowProc中处理它吗? -
@Ben
WindowProc是静态的,需要在WindowsGLWindow对象上调用resize,而我无法在WindowProc中访问该对象。另外,我想知道为什么我正在做的事情不起作用(看起来应该......) -
您是从控制台运行它,希望看到 std::cout 的输出,还是从调试器运行它,希望看到输出窗口的输出?
-
另外,将您的类指针传递给您的 CreateWindowEx 调用的最后一个参数,然后使用 SetWindowLong 、 GetWindowLong 在您的 winmain 中获取/设置您的类,在您的类中调用一个非静态函数进行消息处理。查看msdn,他们有一个关于如何做到这一点的教程。
-
@johnathon 我从 Eclipse 运行它,希望在控制台输出屏幕中看到输出(也会出现一个窗口,我调整它的大小以检查消息是否发送正确) .感谢您提供有关类指针的信息......(我想那是一个对象指针?)。我去看看..
标签: c++ window messages postmessage peekmessage