NSIS:如何获取标签中的文本宽度

时间:2012-08-27 14:44:00

标签: nsis

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

!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

1 个答案:

答案 0 :(得分: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结构。