Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 自动调整静态控件大小的正确方法是什么?_Winapi_User Interface_Controls - Fatal编程技术网

Winapi 自动调整静态控件大小的正确方法是什么?

Winapi 自动调整静态控件大小的正确方法是什么?,winapi,user-interface,controls,Winapi,User Interface,Controls,我想将静态控件的大小调整为其内容大小,因此首先需要计算其文本内容的大小。我找到了一种使用GetTextExtentPoint32计算大小的方法,但我需要首先将DC的字体设置为与控件的字体相同。有更好的方法吗?我已经设置了静态控件的字体一次,我想也许我不需要第二次设置DC的字体 计算静态控件文本内容大小的最佳方法是什么?有没有更好的方法来自动调整静态控件的大小?大多数使用静态文本控件的窗口都是对话框,其中静态控件的大小用对话框单位(DLU)表示,DLU大致代表字体的大小。通过这种方式,对话框控件往

我想将静态控件的大小调整为其内容大小,因此首先需要计算其文本内容的大小。我找到了一种使用
GetTextExtentPoint32
计算大小的方法,但我需要首先将DC的字体设置为与控件的字体相同。有更好的方法吗?我已经设置了静态控件的字体一次,我想也许我不需要第二次设置DC的字体


计算静态控件文本内容大小的最佳方法是什么?有没有更好的方法来自动调整静态控件的大小?

大多数使用静态文本控件的窗口都是对话框,其中静态控件的大小用对话框单位(DLU)表示,DLU大致代表字体的大小。通过这种方式,对话框控件往往具有合理的大小

如果不使用对话框,可以尝试使用来伪造对话框行为


否则,您必须使用
GetTextExtentPoint32

据我所知,静态控制没有自动调整大小。你做得对

  • 使用GetWinDowText获取静态窗口的文本
  • 使用GetDC获取窗口的dc
  • 使用WM_GETFONT获取窗口的字体,并在dc中选择字体
  • 使用文本大小计算功能之一计算文本大小
  • 恢复原始dc字体
  • 释放dc
  • 您必须始终在dc中选择合适的字体才能获得准确的结果。另外,我个人更喜欢使用DT_CALCRECT来计算文本的大小。提及


    对于DrawText,如果文本以NULL结尾,则不必提供字符计数。此外,您还可以组合各种格式选项来调整计算。例如,静态控件文本中的符号和(&)字符在下一个字符下面加下划线。使用Drawtext,您将能够正确计算大小,但在GetTextExtentPoint32中,没有指定此项的规定

    我觉得你已经找到了正确的方法。调用,根据控件包含的文本计算出该控件的理想大小,然后将该控件调整为计算出的大小

    这需要做很多工作,但当您使用原始Win32 API时,就会发生这种情况。您没有一个方便的包装器库,可以在
    Control.AutoSize()
    函数中为您抽象所有这些内容。您可以轻松地编写自己的函数并重用它,但Win32标准控件不公开“自动调整大小”API

    至于字体,您肯定需要确保设备上下文使用与控件相同的字体,否则您将计算错误的大小。但您不必创建新的设备上下文,请求静态控件字体的句柄,然后将其选择到新的DC中。相反,您可以使用函数使用静态控件的DC,并将句柄传递给静态控件窗口。确保如果调用
    GetDC
    ,完成后始终会调用

    但是,请注意
    GetTextExtentPoint32
    函数的一些警告,这些警告可能会干扰您计算的大小的准确性:

    • 它忽略了剪辑
    • 计算高度时,它不考虑新行(
      \n
      )或回车(
      \r\n
    • 它不考虑前缀字符(在字符串前面带有符号的字符),如果静态控件没有前缀,则用于表示键盘助记符
    • 根据某些设备可能自动执行的紧排,它可能不会返回准确的结果
    (链接文档中都提到了这一点,但实际上有人读过吗?)

    也许一个更简单的替代方法是以静态控件已经在做的相同方式绘制文本。除非设置了
    SS_SIMPLE
    样式集(使用或绘制文本作为优化),否则静态控件通过调用具有适当参数的函数来绘制其文本,给定已设置的其他控件样式()


    您可以做完全相同的事情,并在调用
    DrawText
    函数时添加
    DT\u CALCRECT
    标志,这会使函数在不实际绘制文本的情况下确定绘制指定文本所需的矩形的宽度和高度。

    哦,天哪,不。您永远不想使用
    GetBaseDialogUnits
    ,因为它只为使用“默认系统字体”(
    system\u font
    )的对话框返回对话框基本单位。自Windows3问世以来,Windows应用程序就没有使用过这种功能。正如您链接到的文档所述,您将需要打电话。有关
    GetDialogBaseUnits
    问题的更多信息,请参阅。啊,谢谢;我已经很久没有处理对话单元了。。。我将编辑.Raymond Chen关于GetDialogBaseUnits的博客文章。看来
    GetTextExtentPoint32
    并没有“忽略”字距,相反,它会将字距计算到总大小。但对于单个字符,紧排不会被计数,因此“字符串中字符的范围之和并不总是等于字符串的范围”。公平地说,它不会忽略紧排,只是在紧排不同的情况下可能不会报告准确的结果。我会解决它。我认为当设备对字符进行紧排时,
    GetTextExtentPoint32
    是准确的,因为它也会计算紧排。给路过的人一个提示:如果您使用的是SysLink控件,则会有一条消息,
    LM_GETIDEALSIZE