2012-08-27 2 views
0

Я создал ярлык с текстом (текст меньше ширины метки), и я хотел бы создать другую метку с текстом прямо там, где текст заканчивается на первая метка. Чтобы это было правильно для всех разрешений, я должен вычислить, где текст заканчивается во время выполнения. Я хоть использования: Gdi32::GetTextExtentPoint32, но я не совсем уверен, как получить дескриптор контекста устройства hdc - вот это docNSIS: Как получить ширину текста в метке

!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 

ответ

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.

Смежные вопросы