精华内容
下载资源
问答
  • 从资源管理器窗口中获取信息

    千次阅读 2008-10-06 15:03:00
    给定一个窗口句柄,你可以判定:(1)是否是一个资源管理器窗口,如果是,那么(2)它正在显示哪个文件夹,而且(3)当前焦点在哪一项上。这其实不是一件难事。你只需把许多小碎片拼凑起来就可以。一切从 Shell...

    有的时候,软件开发是创造新的东西,不过更常见的是把现有的东西组合到一起。今天的难题就属于后一种。

    给定一个窗口句柄,你可以判定:(1)是否是一个资源管理器窗口,如果是,那么(2)它正在显示哪个文件夹,而且(3)当前焦点在哪一项上。

    这其实不是一件难事。你只需把许多小碎片拼凑起来就可以。

    一切从 ShellWindows 对象开始,它代表所有打开的外壳窗口。你可以使用 Item 属性遍历它们。用 C++ 来做这事看起来有点笨拙,因为 ShellWindows 对象就是为像 JScript 或者 Visual Basic 这样的脚本语言的使用所设计的。

    对于每一个元素,我们可以询问其窗口句柄以判断是否是我们需要的。

    不错,现在我们已经通过各元素的 IWebBrowserApp 接口找到了目标,接下来需要得到顶级外壳浏览器对象(top shell browser)。这可以通过查询 SID_STopLevelBrowser 服务并请求 IShellBrowser 接口来完成。

    我们再使用 QueryActiveShellView 方法从 IShellBrowser 接口请求当前的外壳视图(shell view)。

    当然,我们真正想要的其实是 IFolderView 接口,它是一个自动化对象,囊括了所有的好东西。

    挺好。想从视图里得到些什么呢,正被浏览的 IShellFolder 的位置怎么样?做这件事情,我们需要使用 IPersistFolder2::GetCurFolderGetFolder 方法可以使我们访问到外壳文件夹(shell folder),我们要从那里请求 IPersistFolder2。(大部分情况下你需要 IShellFolder 接口,因为大多数的酷玩意儿都在那儿。)

    我们把 pidl 转换为用于显示的路径。

    用我们已经得到的这些可以干什么呢?哦,对了,来看一下当前的焦点在什么上吧。

    要把聚焦项的名字显示出来,我们需要该项的 pidl 和 IShellFolder。(看看,我告诉过你好东西就在 IShellFolder 那儿)。项可以通过 Item 方法得到。

    (如果想得到选中项的列表,我们可以使用 Items 方法,需要传入 SVGIO_SELECTION。)

    得到 pidl 之后,还需要 IShellFolder:

    然后我们用这两样东西以及 GetDisplayNameOf 方法的辅助来获取项的显示名字。

    我们可以使用辅助函数 StrRetToBuf 把那个乖僻的 STRRET 结构转换为令人生厌的字符串缓冲区。(怪异的 STRRET 结构的历史容以后再说。)

    好,下面我们把所有这些都组合起来。代码看起来相当丑陋,因为我把所有东西都放到了一个大函数里而没有把它们分离为子函数。在“现实生活”中,我会把它们分为小的辅助函数,那样更便于管理。

    打开 scratch(译者注:原作者的一个测试用程序原型) 程序,添加一下函数:

    剩下的就是定期调用此函数并打印结果。

    现在已经准备就绪了。运行程序,把它放到一边,然后启动资源管理器并观察程序,会发现它可以跟踪你所在的文件夹和焦点所在的项。

    我希望我已经证实了我的观点:通常,你所需的东西的所有片断已经存在了,你只不过是需要指出怎样把它们拼在一块。注意,每一小片都不大。只是你必须能意识到可以用一种有趣的方法把它们放到一起。

    练习:修改程序,使它得到文件夹并将其切换到详细信息视图

    展开全文
  • 例如,应用程序可以使用该deepest方法找出哪个可用屏幕可以最好地表示颜色,然后可以选择在该屏幕上显示所有窗口。 应在使用此类中的方法之前创建应用程序对象,以便该应用程序对象可以窗口系统建立必要的连接。...

    NSScreen

    描述计算机监视器或屏幕属性的对象。

    class NSScreen : NSObject
    

    总览

    应用可以使用NSScreen对象来检索有关屏幕的信息,并使用此信息来决定在该屏幕上显示什么。例如,应用程序可以使用该deepest方法找出哪个可用屏幕可以最好地表示颜色,然后可以选择在该屏幕上显示其所有窗口。

    应在使用此类中的方法之前创建应用程序对象,以便该应用程序对象可以与窗口系统建立必要的连接。您可以通过调用的shared方法来确保应用程序对象存在NSApplication。如果使用Xcode创建了应用程序,则会在初始化期间自动为您创建应用程序对象。

    加入我们一起学习SwiftUI

    QQ:3365059189
    SwiftUI技术交流QQ群:518696470

    注意,NSScreen是用于获取有关唯一可用的显示信息。如果您需要其他信息或想要更改与显示相关的属性,则必须使用Quartz Services。有关更多信息,请参见Quartz Display Services。


    主题

    获取屏幕对象

    1、class var main: NSScreen?

    返回包含具有键盘焦点的窗口的屏幕对象。

    2、class var deepest: NSScreen?

    返回表示最能代表颜色的屏幕的屏幕对象。

    4、class var screens: [NSScreen]

    返回一个屏幕对象数组,这些对象代表系统上所有可用的屏幕。


    获取屏幕信息

    5、var depth: NSWindow.Depth

    屏幕的当前位深度和色彩空间信息。

    6、var frame: NSRect

    屏幕的尺寸和位置。

    7、var supportedWindowDepths: UnsafePointer<NSWindow.Depth>

    屏幕支持的窗口深度的零终止数组。

    8、var deviceDescription: [NSDeviceDescriptionKey : Any]

    屏幕的设备字典。

    9、struct NSDeviceDescriptionKey

    这些常量是所使用的设备描述词典的键。deviceDescription

    10、var visibleFrame: NSRect

    可见屏幕的当前位置和尺寸。

    11、var colorSpace: NSColorSpace?

    屏幕的色彩空间。

    12、func canRepresent(NSDisplayGamut) -> Bool

    一个布尔值,指示屏幕的色彩空间是否能够表示指定的显示色域。

    12、enum NSDisplayGamut

    class var screensHaveSeparateSpaces: Bool
    返回一个布尔值,该值指示每个屏幕是否可以具有自己的空格集。


    屏幕背景坐标转换

    13、func backingAlignedRect(NSRect, options: AlignmentOptions) -> NSRect

    将全局屏幕坐标中的矩形转换为像素对齐的矩形。

    14、var backingScaleFactor: CGFloat

    屏幕的后备存储像素比例因子。

    15、func convertRectFromBacking(NSRect) -> NSRect

    从屏幕的设备像素对齐坐标系转换矩形。

    16、func convertRectToBacking(NSRect) -> NSRect

    将矩形转换为屏幕的设备像素对齐的坐标系。


    扩展动态范围

    17、var maximumPotentialExtendedDynamicRangeColorComponentValue: CGFloat

    处于扩展动态范围(EDR)模式时,屏幕的最大可能颜色分量值。

    18、var maximumExtendedDynamicRangeColorComponentValue: CGFloat

    屏幕的当前最大颜色分量值。

    19、var maximumReferenceExtendedDynamicRangeColorComponentValue: CGFloat

    当前最大颜色分量值,用于参考渲染到屏幕。


    通知事项

    20、class let colorSpaceDidChangeNotification: NSNotification.Name

    屏幕色彩空间改变时发布。


    实例属性

    21、var localizedName: String

    加入我们一起学习SwiftUI

    QQ:3365059189
    SwiftUI技术交流QQ群:518696470

    展开全文
  • 给定一个窗口句柄,你可以判定:(1)是否是一个资源管理器窗口,如果是,那么(2)它正在显示哪个文件夹,而且(3)当前焦点在哪一项上。 这其实不是一件难事。你只需把许多小碎片拼凑起来就可以。 一切从 Shell...

    原文链接
    翻译参考
    有的时候,软件开发是创造新的东西,不过更常见的是把现有的东西组合到一起。今天的难题就属于后一种。

    给定一个窗口句柄,你可以判定:(1)是否是一个资源管理器窗口,如果是,那么(2)它正在显示哪个文件夹,而且(3)当前焦点在哪一项上。

    这其实不是一件难事。你只需把许多小碎片拼凑起来就可以。

    一切从 ShellWindows 对象开始,它代表所有打开的外壳窗口。你可以使用 Item 属性遍历它们。用 C++ 来做这事看起来有点笨拙,因为 ShellWindows 对象就是为像 JScript 或者 Visual Basic 这样的脚本语言的使用所设计的。

     IShellWindows *psw;
     if (SUCCEEDED(CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_ALL,
                                    IID_IShellWindows, (void**)&psw))) {
      VARIANT v;
      V_VT(&v) = VT_I4;
      IDispatch  *pdisp;
      BOOL fFound = FALSE;
      for (V_I4(&v) = 0; !fFound && psw->Item(v, &pdisp) == S_OK;
           V_I4(&v)++) {
        ...
        pdisp->Release();
      }
      psw->Release();
     }
    

    对于每一个元素,我们可以询问其窗口句柄以判断是否是我们需要的。

       IWebBrowserApp *pwba;
       if (SUCCEEDED(pdisp->QueryInterface(IID_IWebBrowserApp, (void**)&pwba))) {
         HWND hwndWBA;
         if (SUCCEEDED(pwba->get_HWND((LONG_PTR*)&hwndWBA)) &&
           hwndWBA == hwndFind) {
           fFound = TRUE;
           ...
         }
         pwba->Release();
       }

    不错,现在我们已经通过各元素的 IWebBrowserApp 接口找到了目标,接下来需要得到顶级外壳浏览器对象(top shell browser)。这可以通过查询 SID_STopLevelBrowser 服务并请求 IShellBrowser 接口来完成。

       IServiceProvider *psp;
           if (SUCCEEDED(pwba->QueryInterface(IID_IServiceProvider, (void**)&psp))) {
             IShellBrowser *psb;
             if (SUCCEEDED(psp->QueryService(SID_STopLevelBrowser,
                                  IID_IShellBrowser, (void**)&psb))) {
               ...
               psb->Release();
             }
             psp->Release();
           }

    我们再使用 QueryActiveShellView 方法从 IShellBrowser 接口请求当前的外壳视图(shell view)。

         IShellView *psv;
               if (SUCCEEDED(psb->QueryActiveShellView(&psv))) {
                 ...
                 psv->Release();
               }

    当然,我们真正想要的其实是 IFolderView 接口,它是一个自动化对象,囊括了所有的好东西。

          IFolderView *pfv;
                 if (SUCCEEDED(psv->QueryInterface(IID_IFolderView,
                                                   (void**)&pfv))) {
                   ...
                   pfv->Release();
                 }

    挺好。想从视图里得到些什么呢,正被浏览的 IShellFolder 的位置怎么样?做这件事情,我们需要使用 IPersistFolder2::GetCurFolder。GetFolder 方法可以使我们访问到外壳文件夹(shell folder),我们要从那里请求 IPersistFolder2。(大部分情况下你需要 IShellFolder 接口,因为大多数的酷玩意儿都在那儿。)

          IPersistFolder2 *ppf2;
                   if (SUCCEEDED(pfv->GetFolder(IID_IPersistFolder2,
                                                (void**)&ppf2))) {
                     LPITEMIDLIST pidlFolder;
                     if (SUCCEEDED(ppf2->GetCurFolder(&pidlFolder))) {
                       ...
                       CoTaskMemFree(pidlFolder);
                     }
                     ppf2->Release();
                   }

    我们把 pidl 转换为用于显示的路径。

          if (!SHGetPathFromIDList(pidlFolder, g_szPath)) {
                         lstrcpyn(g_szPath, TEXT("<not a directory>"), MAX_PATH);
                       }
                       ...

    用我们已经得到的这些可以干什么呢?哦,对了,来看一下当前的焦点在什么上吧。

          int iFocus;
                       if (SUCCEEDED(pfv->GetFocusedItem(&iFocus))) {
                         ...
                       }

    要把聚焦项的名字显示出来,我们需要该项的 pidl 和 IShellFolder。(看看,我告诉过你好东西就在 IShellFolder 那儿)。项可以通过 Item 方法得到。

             LPITEMIDLIST pidlItem;
                         if (SUCCEEDED(pfv->Item(iFocus, &pidlItem))) {
                           ...
                           CoTaskMemFree(pidlItem);
                         }

    (如果想得到选中项的列表,我们可以使用 Items 方法,需要传入 SVGIO_SELECTION。)

    得到 pidl 之后,还需要 IShellFolder:

         IShellFolder *psf;
                           if (SUCCEEDED(ppf2->QueryInterface(IID_IShellFolder,
                                                              (void**)&psf))) {
                             ...
                             psf->Release();
                           }

    然后我们用这两样东西以及 GetDisplayNameOf 方法的辅助来获取项的显示名字。

           STRRET str;
                             if (SUCCEEDED(psf->GetDisplayNameOf(pidlItem,
                                                       SHGDN_INFOLDER,
                                                       &str))) {
                               ...
                             }

    我们可以使用辅助函数 StrRetToBuf 把那个乖僻的 STRRET 结构转换为令人生厌的字符串缓冲区。(怪异的 STRRET 结构的历史容以后再说。)

    StrRetToBuf(&str, pidlItem, g_szItem, MAX_PATH);

    好,下面我们把所有这些都组合起来。代码看起来相当丑陋,因为我把所有东西都放到了一个大函数里而没有把它们分离为子函数。在“现实生活”中,我会把它们分为小的辅助函数,那样更便于管理。

    打开 scratch(译者注:原作者的一个测试用程序原型) 程序,添加一下函数:

    #include <shlobj.h>
    #include <exdisp.h>
    
    TCHAR g_szPath[MAX_PATH];
    TCHAR g_szItem[MAX_PATH];
    
    void CALLBACK RecalcText(HWND hwnd, UINT, UINT_PTR, DWORD)
    {
     HWND hwndFind = GetForegroundWindow();
     g_szPath[0] = TEXT('\0');
     g_szItem[0] = TEXT('\0');
    
     IShellWindows *psw;
     if (SUCCEEDED(CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_ALL,
                                    IID_IShellWindows, (void**)&psw))) {
      VARIANT v;
      V_VT(&v) = VT_I4;
      IDispatch  *pdisp;
      BOOL fFound = FALSE;
      for (V_I4(&v) = 0; !fFound && psw->Item(v, &pdisp) == S_OK;
           V_I4(&v)++) {
       IWebBrowserApp *pwba;
       if (SUCCEEDED(pdisp->QueryInterface(IID_IWebBrowserApp, (void**)&pwba))) {
         HWND hwndWBA;
         if (SUCCEEDED(pwba->get_HWND((LONG_PTR*)&hwndWBA)) &&
           hwndWBA == hwndFind) {
           fFound = TRUE;
           IServiceProvider *psp;
           if (SUCCEEDED(pwba->QueryInterface(IID_IServiceProvider, (void**)&psp))) {
             IShellBrowser *psb;
             if (SUCCEEDED(psp->QueryService(SID_STopLevelBrowser,
                                  IID_IShellBrowser, (void**)&psb))) {
               IShellView *psv;
               if (SUCCEEDED(psb->QueryActiveShellView(&psv))) {
                 IFolderView *pfv;
                 if (SUCCEEDED(psv->QueryInterface(IID_IFolderView,
                                                   (void**)&pfv))) {
                   IPersistFolder2 *ppf2;
                   if (SUCCEEDED(pfv->GetFolder(IID_IPersistFolder2,
                                                (void**)&ppf2))) {
                     LPITEMIDLIST pidlFolder;
                     if (SUCCEEDED(ppf2->GetCurFolder(&pidlFolder))) {
                       if (!SHGetPathFromIDList(pidlFolder, g_szPath)) {
                         lstrcpyn(g_szPath, TEXT("<not a directory>"), MAX_PATH);
                       }
                       int iFocus;
                       if (SUCCEEDED(pfv->GetFocusedItem(&iFocus))) {
                         LPITEMIDLIST pidlItem;
                         if (SUCCEEDED(pfv->Item(iFocus, &pidlItem))) {
                           IShellFolder *psf;
                           if (SUCCEEDED(ppf2->QueryInterface(IID_IShellFolder,
                                                              (void**)&psf))) {
                             STRRET str;
                             if (SUCCEEDED(psf->GetDisplayNameOf(pidlItem,
                                                       SHGDN_INFOLDER,
                                                       &str))) {
                               StrRetToBuf(&str, pidlItem, g_szItem, MAX_PATH);
                             }
                             psf->Release();
                           }
                           CoTaskMemFree(pidlItem);
                         }
                       }
                       CoTaskMemFree(pidlFolder);
                     }
                     ppf2->Release();
                   }
                   pfv->Release();
                 }
                 psv->Release();
               }
               psb->Release();
             }
             psp->Release();
           }
         }
         pwba->Release();
       }
        pdisp->Release();
      }
      psw->Release();
     }
     InvalidateRect(hwnd, NULL, TRUE);
    }

    剩下的就是定期调用此函数并打印结果。

    BOOL OnCreate(HWND hwnd, LPCREATESTRUCT lpcs)
    {
        SetTimer(hwnd, 1, 1000, RecalcText);
        return TRUE;
    }
    
    void PaintContent(HWND hwnd, PAINTSTRUCT *pps)
    {
      TextOut(pps->hdc, 0, 0, g_szPath, lstrlen(g_szPath));
      TextOut(pps->hdc, 0, 20, g_szItem, lstrlen(g_szItem));
    }

    现在已经准备就绪了。运行程序,把它放到一边,然后启动资源管理器并观察程序,会发现它可以跟踪你所在的文件夹和焦点所在的项。

    我希望我已经证实了我的观点:通常,你所需的东西的所有片断已经存在了,你只不过是需要指出怎样把它们拼在一块。注意,每一小片都不大。只是你必须能意识到可以用一种有趣的方法把它们放到一起。

    展开全文
  • Visual Studio程序员箴言中文扫描PDF

    热门讨论 2010-12-28 01:04:18
    技巧5.43 在“对象浏览器”的“成员”窗格中不显示所有继承的成员 131 技巧5.44 在“对象浏览器”中显示扩展方法 132 技巧5.45 在“对象浏览器”中搜索对象的两种基本方法 132 技巧5.46 在“对象浏览器”中用...
  • MFC的程序框架剖析

    2015-03-05 09:53:19
    们之间的纽带仅仅在于这个C++窗口类内部的成员变量m_hWnd,该变量保存了与这个C++窗口类对象相关的哪个窗口 的句柄 (3)但是,当C++窗口类对象销毁时,与之相关的窗口也将销毁,因为它们之间的纽带m_hWnd已经断了 3、...
  • Window 消息大全

    2009-12-23 05:23:02
    WM_CTLCOLORMSGBOX = $0132 //在windows绘制消息框前发送此消息给消息框的所有者窗口,通过响应这条消息,所有窗口可以 通过使用给定的相关显示设备的句柄来设置消息框的文本和背景颜色 WM_CTLCOLOREDIT = $0133...
  • Visual Studio程序员箴言--详细书签版

    热门讨论 2012-10-16 20:37:39
    技巧4.19 通过工具窗口自动隐藏显示自动隐藏的工具窗口 85 技巧4.20 双击工具窗口的标题栏可重新停靠该工具窗口 85 技巧4.21 使用shift+单击自动停靠处于自动隐藏的工具窗口 86 技巧4.22 加快或减慢工具窗口...
  • 一个QPushButton可以显示一段文本或者一个QPixmap。 int main( int argc, char **argv ) { main()函数是程序的入口。几乎在使用Qt的所有情况下,main()只需要在把控制转交给Qt库之前执行一些初始化,然后Qt库通过...
  • BroadcastSystemMessage 将一条系统消息广播给系统中所有的顶级窗口 GetMessagePos 取得消息队列中上一条消息处理完毕时的鼠标指针屏幕位置 GetMessageTime 取得消息队列中上一条消息处理完毕时的时间 Post...
  • powerbuilder

    2013-11-21 17:11:48
    参数jobname:string类型,可选项,指定要打开打印作业的名称,该名称将显示在打印管理器窗口中返回值Long。函数执行成功时返回打印作业号,发生错误时返回-1。如果任何参数的值为NULL,PrintOpen()函数返回NULL。...
  • 在这个弹出窗口中,您可以选择在页面上激活哪个监听器。 点击监听器:停止文档节点上所有点击的默认动作,点击页面后将gtm.click和其他数据推送到debugDL。 链接点击监听器:暂停文档节点上所有点击的默认动作,点击...
  • 多媒体教室

    2013-06-14 08:10:31
    学生机在接收屏幕广播时,如果教师未锁定学生机键盘鼠标,学生就可以窗口方式接收广播(窗口可设置为智能滚动、自由滚动、缩放显示),该功能的详细说明请参见?窗口显示模式?。此时学生可在接收屏幕广播的同时进行...
  • 入门学习Linux常用必会60个命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    在使用mount这个指令时,至少要先知道下列三种信息:要加载对象的文件系统类型、要加载对象的设备名称及要将设备加载到哪个目录下。 (1)Linux可以识别的文件系统 ◆ Windows 95/98常用的FAT 32文件系统:vfat ;...
  • TagPredict-crx插件

    2021-03-08 16:37:06
    当你进入一个网站,TagPredict会突出显示所有带有黄色标记的主题标签。一旦你将鼠标悬停在标签上,一个弹出式窗口就会给你完整的hashtag统计信息,它是多么受欢迎,如果受欢迎程度正在增长/下降以及它出现在哪个顶级...
  • VB控件属性使用大全

    2011-12-15 12:02:34
    获得或设置一个值,决定对于对象的控件使用哪个调色板。取值为: 0 Halftone 1 UseZOrder 2 Custom Picture 窗体背景图片 RightToLeft 文本书写是否自左向右。取值为: True False 自右向左 ScaleHeight ...
  • ABAP中文幫助文檔

    2018-10-27 19:07:09
    这将关闭“维护对象目录条目”窗口并返回“ABAP/4:程序属性”屏幕。  选择“后退”离开屏幕。如果要直接转到ABAP/4编辑器,请选择“转向->源代码”。 如果通过预定义开发类在“对象浏览器”中创建程序,则跳过...
  • 图片预览器

    2017-11-01 10:46:54
    本文介绍了Linux平台下的Xwindow图形窗口编程工具GTK,并给出了用GTK编程的基本要素和步骤。 【关键词】GTK,回调函数,... 最后将所有的盒子或组件打包到一个大盒子中,用gtk_container_add()函数将盒子加入窗口即可。
  • flash shiti

    2014-03-14 10:32:41
    5.Flash中如何选取场景中所有层中的所有对象? A. 按住 Shift 键的同时进行新的选取 B. 选择 Edit > Select All C. 选择 Edit > Select All D. 在时间轴上点击帧 6.Flash查看(View)菜单中,Work Area表示? ...
  •  这一小程序可以显示本地登录的用户和通过本地计算机或远程计算机的资源登录的用户。它是Sysinternals 命令行工具不断完善的 PsTools 工具包的一部分。  RegMon  Regmon 是一款出色的注册表数据监视软件,它将与...
  • 39. 显示某目录下的所有文件 40. 把复选框中选中的值直接显示在输入文本框中? 41. 选择路径下的文件直接显示文件内容? 42. 制作进度条? 43. 对较长字符省略显示? 44. 制作日历? 45. 点击文本弹出一个选择框,选中值...
  • CuteFTP9简易汉化版

    2014-04-11 12:31:30
    会话Logs-Connection和传输日志可以显示,捕获到Windows剪贴板,并记录文件。确定日志保存,通常他们是如何更新或者删除等等。智能维持命令不记录和时间戳都包含在默认情况下,大大提高可用性。 工作Offline-Site缓存...
  • 再次双击标题栏最大化,再次双击还原,相当于子模块也可以全屏显示作为一个大屏,这样就可以一个大屏拓展出多个子大屏,放大查看子模块的数据详情。 每个模块都可以自定义采集速度,如果是数据库采集会自动排队处理...
  • jQuery攻略.pdf

    2011-05-03 17:53:50
    166 6.4 创建图片,使它向左滚动消失,然后从右侧重新出现 169 6.5 使图片在浏览器窗口中间滚动 171 6.6 在鼠标悬停时依次显示图片 172 6.7 垂直滚动图片 175 6.8 水平滚动图片 179 6.9 创建新闻滚动浏览器 183 6.10...
  • Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字 Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,...

空空如也

空空如也

1 2 3 4
收藏数 70
精华内容 28
关键字:

哪个窗口可以显示所有对象