我们可以获得已开放的NSWindow的类名吗?

时间:2013-12-10 11:22:55

标签: c# objective-c cocoa nswindow

我们有代码来获取c#的类名

// Get Window class
var windowClass = new StringBuilder(256);
Win32.GetClassName((IntPtr) hwnd, windowClass, windowClass.Capacity);
 String windowClassName = windowClass.ToString();

如何在目标c中转换它?

2 个答案:

答案 0 :(得分:2)

简短回答:该代码没有Mac版本,因为在Mac上,窗口在这个意义上没有“类名”。您要问的是Mac没有的Windows API详细信息。


Anoop Vaidya的回答对于“class”的Objective-C含义是正确的,但不是Windows对“window class”的含义。

Here's what a window class in Windows looks like.窗口类定义了很多东西;这里只是其中一些:

  
      
  • lpfnWndProc:指向窗口过程的指针。您必须使用CallWindowProc函数来调用窗口过程。有关详细信息,请参阅WindowProc

  •   
  •   
  • hIcon:类图标的句柄。该成员必须是图标资源的句柄。如果此成员为NULL,则系统会提供默认图标。
  •   
  • hCursor:类游标的句柄。该成员必须是游标资源的句柄。如果此成员为NULL,则只要鼠标移动到应用程序窗口,应用程序就必须显式设置光标形状。
  •   
  • hbrBackground:类背景画笔的句柄。 [关于那一个的很多细节]
  •   
  • lpszMenuName:指向以null结尾的字符串的指针,该字符串指定类菜单的资源名称,名称显示在资源文件中。如果使用整数来标识菜单,请使用MAKEINTRESOURCE宏。如果此成员为NULL,则属于此类的窗口没有默认菜单。
  •   
  • hIconSm:与窗口类关联的小图标的句柄。如果此成员为NULL,系统将搜索hIcon成员指定的图标资源,以获取适当大小的图标,以用作小图标。
  •   

这与Objective-C类完全不同。

一个类(作为Objective-C使用该术语)是一个对象的配方。该类定义该类的任何对象拥有的实例变量(成员),属性和方法。每个对象都有一个与之关联的类; Objective-C意义上的类不是特定于窗口对象的。

相比之下,Windows中的“窗口类”定义了许多特定于窗口的属性。让我们看一下上面的内容,看看他们的Mac等价物是什么:

  • 窗口过程:据我所知,定义窗口的外观和响应事件。粗糙的Mac等价物将是窗口对象的类(在Objective-C意义上):NSWindow或其任何子类。没有很多NSWindow子类,旁边没有自定义子类,因为我们可以自定义单个窗口的大多数方面,而无需创建自定义的NSWindow子类。
  • 图标(小而其他):Mac上的大多数窗口都没有。文档窗口,在这种情况下,它被称为代理图标,因为标题栏中的图标是窗口显示的文件的代理。您可以通过telling it what file the icon should be a proxy for设置窗口的代理图标。
  • 光标:在Mac上,you set the cursor at the view level。如果你想在窗口的整个(内容区域)中使用相同的光标,你可以在窗口的内容视图中设置它。
  • 背景画笔:每个窗口都有一个backgroundColor属性,它接受一个NSColor对象。反过来,NSColor提供了许多预定义的背景颜色,用作窗口背景(以及其他用途)。
  • 菜单:在Windows上,每个窗口都有自己的菜单栏,它们都有不同的菜单。在Mac上,有一个菜单栏,大多数应用程序永远不会在窗口之间更改菜单栏的内容。 (当它们这样做时,它通常表示一个端口,其作者并不关心平台差异。)您可以这样做,但是您必须通过更改应用程序mainMenu的内容来自行完成。主窗口改变了。

“窗口类”的大多数其他成员都是更多没有Objective-C等效的Windows API细节。

你应该阅读Apple的OS X Human Interface Guidelines。 Windows和Mac之间的窗口(以及其他功能)之间的工作方式有很多不同,这些界面选择可以让整个API设计一直向下。

答案 1 :(得分:1)

NSString *className = [objectName className];

这将为您提供名为objectName的对象的类名。

类似地,您传递对象,并获取类名。