计算文字在固定宽度下 折行显示后的高度

本文详细介绍了如何在C++程序中利用WM_PAINT消息和CWnd::GetDC方法获取设备上下文,进而实现字体选择与文本绘制。通过DrawText函数结合DT_CALCRECT和DT_WORDBREAK参数,不仅能够正确显示文本,还能自动换行以适应指定宽度,同时返回所需的高度。文章旨在为开发者提供在特定窗口中高效、灵活地呈现文本信息的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.         得到一个 dc, dc 中选入需要的字体 如果不在 WM_PAINT 消息里可以用 CWnd::GetDC 注意使用完之后要用 ReleaseDC 释放


2.         DrawText 函数 nFormat 参数传入 : DT_CALCRECT | DT_WORDBREAK lpRect 参数传入一个矩形 : left=0 right= 需要的宽度 top=0 bottom= 随意 函数返回之后 lpRect 参数中的 bottom 就是计算得到的需要的高度

 

注意DT_WORDBREAK 的意思是折行显示

 

在Android中,如果你有一个`EditText`组件设置了固定的高宽,如200dp的高度,当用户输入的内容超过了其最大宽度时,通常不会自动换显示,因为`EditText`默认的为是单显示文本。但是,你可以通过设置`InputType`属性以及自定义`TextView`的为来实现换。 首先,在XML布局文件中设置EditText的基本样式: ```xml <EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:layout_height="200dp" android:maxLength="50" <!-- 设置允许的最大字符数 --> android:inputType="textMultiLine" <!-- 开启多输入 --> /> ``` 然后,为了达到换效果,你可以在Java或Kotlin代码中处理超出的部分: ```java // 获取EditText实例 EditText editText = findViewById(R.id.edit_text); // 自定义监听器处理超过宽度的情况 editText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // 如果当前输入内容长度加上前缀(例如标签或提示)超过了最大宽度 if (s.length() + getLeadingSpaceLength() > maxWidth) { // 切割字符串并添加到新的lines列表中 List<String> lines = new ArrayList<>(); for (int i = 0; i < s.length(); i += maxWidth - getLeadingSpaceLength()) { String line = s.subSequence(i, Math.min(i + maxWidth - getLeadingSpaceLength(), s.length())); lines.add(line); } // 用换符分隔每个新,并替换当前的EditText文本 editText.setText(String.join("\n", lines)); } } @Override public void afterTextChanged(Editable s) {} }); private int getLeadingSpaceLength() { // 返回前缀或提示的宽度,假设这里是一个固定值,如果需要动态计算,可以替换为实际计算逻辑 return "前缀".length(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值