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 に答える