gpt4 book ai didi

cocoa - 无法使用 NSOpenGLView 从 nextEventMatchingMask 获取 NSMouseMoved 事件

转载 作者:行者123 更新时间:2023-12-03 17:59:48 26 4
gpt4 key购买 nike

我正在尝试使用典型的 win 风格事件循环创建一个带有鼠标输入的基本 opengl 窗口。问题是我正在努力尝试生成 NSMouseMoved 事件。以下代码输出有关“鼠标向上”、“鼠标向下”、“鼠标拖动”等的调试信息,但没有“鼠标移动”,即使我已告诉窗口 setAcceptsMouseMovedEvents:YES。那么,关于如何让鼠标在以下示例中移动有什么想法吗?

显然,我创建窗口的方式与 cocoa 非常不一样,但我正在尝试移植一个基于 makefile 的 Windows C++ 代码库,该代码库可以执行一些棘手的线程操作。这就是为什么我坚持使用类似于 win32 循环的风格,使用 GetMsg()

另外,为了构建我只是使用:

gcc -o hellogl hellogl.m -framework Foundation -framework Cocoa -framework OpenGL

感谢您的帮助!

#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>

#include <OpenGL/gl.h>
#include <stdlib.h>

@interface BaseWinDelegate : NSWindow<NSWindowDelegate>

@end

@implementation BaseWinDelegate
- (void) windowWillClose:(NSNotification*)notification
{
printf("Closing.\n");

NSEvent * evt = [NSEvent otherEventWithType:NSApplicationDefined
location: NSMakePoint(0,0)
modifierFlags: 0
timestamp: 0.0
windowNumber: 0
context: nil
subtype: 0
data1: 0
data2: 0];

[NSApp postEvent:evt atStart:NO];
}
@end

@interface BaseView : NSOpenGLView
- (void) update;
- (void) drawRect:(NSRect)rect;
- (void) reshape;
@end

@implementation BaseView

- (void) drawRect:(NSRect)rect
{
glClearColor(0.2f,0.2f,0.2f,0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

[[self openGLContext] flushBuffer];
}

- (void) update
{
printf("Update.\n");
}

- (void) reshape
{
NSRect rect;

[[self openGLContext] update];
rect = [self bounds];

printf("Reshape - %f, %f\n", rect.size.width,rect.size.height);
}

@end

int main(int argc, const char * argv[])
{
printf("Starting.\n");

NSAutoreleasePool * myPool = [[NSAutoreleasePool alloc] init ];
NSApplicationLoad();

NSRect rect = NSMakeRect(100,100,640,480);
NSWindow * win = [[NSWindow alloc] initWithContentRect:rect
styleMask:NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask
backing: NSBackingStoreBuffered
defer: NO];

NSOpenGLPixelFormatAttribute attributes[] =
{
NSOpenGLPFADoubleBuffer,
0
};

NSOpenGLPixelFormat* pf = [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes];

BaseView * pView = [[BaseView alloc] initWithFrame:rect pixelFormat:pf];
BaseWinDelegate * myDelegate = [BaseWinDelegate alloc];

[win setDelegate:myDelegate];
[win setContentView: pView];
[win makeKeyAndOrderFront: NSApp];
[win setAcceptsMouseMovedEvents:YES];

do
{
NSEvent * evt = [NSApp nextEventMatchingMask : NSAnyEventMask
untilDate : [NSDate distantFuture]
inMode : NSDefaultRunLoopMode
dequeue : YES ];

NSEventType evtType = [evt type];

if (evtType == NSApplicationDefined)
{
break;
}

printf("%d\n",(int)evtType);
[NSApp sendEvent : evt];
} while (1);

[myPool drain];
return EXIT_SUCCESS;
}

最佳答案

好的,明白了。问题是它不是前台进程。因此添加此代码即可解决问题。

ProcessSerialNumber psn;
GetCurrentProcess(&psn);
TransformProcessType(&psn, kProcessTransformToForegroundApplication);
SetFrontProcess(&psn);

这可以防止窗口成为关键窗口并发送鼠标移动事件。希望它对其他人有帮助(即喜欢处理自己的事件循环的 0.1% 的人)。

关于cocoa - 无法使用 NSOpenGLView 从 nextEventMatchingMask 获取 NSMouseMoved 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8238473/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com