0

我已经创建了一个带有文本的标签(文本小于标签的宽度),我想在第一个标签上的文本结束位置创建另一个带有文本的标签。为了使它在所有分辨率上都是正确的,我必须计算文本在运行时结束的位置。我虽然使用:Gdi32::GetTextExtentPoint32但我不太确定如何获取设备上下文的句柄hdc- 这是文档

!macro GetStringLength TEXT FONT OUT_RES
     ; this is what I need...
!macroend

...

${NSD_CreateLabel} 10u 10u 195u 7u $(FIRST_TEXT)
pop $FIRST_LABEL
!insertmacro GetStringLength $(FIRST_TEXT) $CurrentFont $R0
intop $R0 $R0 + 10 # update x
${NSD_CreateLabel} $R0u 10u 195u 7u $(SECOND_TEXT)
pop $FIRST_LABEL
4

1 回答 1

3

您可以使用任何 DC,它只需要在其中选择正确的字体。我们有一个 HWND,所以我从那里获取它:

!macro GetStringWidthInPixels txt hfont outvar
Push $LANGUAGE ;Used as temp storage for StrLen
System::Call 'USER32::GetDC(i $hwndparent)i.s'
System::Call 'GDI32::SelectObject(iss,i${hfont})i.s'
pop ${outvar} ;Used as temp storage for OrgFont
StrLen $LANGUAGE "${txt}"
System::Call 'GDI32::GetTextExtentPoint32(iss,t "${txt}",ia,*l.s)'
System::Call 'GDI32::SelectObject(iss,i${outvar})'
System::Call 'USER32::ReleaseDC(i $hwndparent,is)'
pop ${outvar}
System::Int64Op ${outvar} & 0xffffffff
pop ${outvar}
Pop $LANGUAGE
!macroend

这将获取以像素为单位的宽度,因此您不能使用u后缀。代码本身看起来有点奇怪,它使用 *l 作为 64 位指针,因此我们不必分配 SIZE 结构。

于 2012-08-27T18:38:03.193 回答