问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

怎么让单行EDIT文本居中

发布网友 发布时间:2022-10-19 13:43

我来回答

1个回答

热心网友 时间:2024-01-18 16:18

利用多行文本框来模拟单行进行设置垂直居中派生一个基于CEdit的类CEditEx,重载create函数,记住是create,不是WM_ONCREATE消息,重载的目的是为了保证起始光标位置就在竖直中间靠左位置,代码如下BOOL CEditEx::Create(CString strNc,DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID) { dwStyle |= ES_MULTILINE | ES_AUTOHSCROLL; //不能加ES_AUTOVSCROLL | ES_WANTRETURN属性 if(CEdit::Create(dwStyle, rect, pParentWnd, nID)) { m_strNc=strNc; CRect rc ; GetClientRect(&rc) ; CDC* pDC = GetDC(); TEXTMETRIC tm; pDC->GetTextMetrics(&tm); int nFontHeight = tm.tmHeight + tm.tmExternalLeading; int nMargin = (rc.Height() - nFontHeight) / 2; rc.DeflateRect(0,nMargin); SetRectNP(&rc); ReleaseDC(pDC) ; return true ; } else return false ; } 如果定义的CEditEx对象不会变换位置,那么上面代码就足够了,但是,CEditEx的对象如果变换了大小或位置,那么Create中的SetRectNP就无效了,所以我们还需要在WM_CHAR消息响应函数中加入代码:void CEditEx::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CRect rc ; GetClientRect(&rc) ; CDC* pDC = GetDC(); TEXTMETRIC tm; pDC->GetTextMetrics(&tm); int nFontHeight = tm.tmHeight + tm.tmExternalLeading; int nMargin = (rc.Height() - nFontHeight) / 2; rc.DeflateRect(0,nMargin); SetRectNP(&rc); ReleaseDC(pDC) ; CEdit::OnChar(nChar, nRepCnt, nFlags); } 其实也就是在每次变换了大小或位置都要重新设置下SetRectNP即可,是不是在WM_CHAR中设置都无所谓,你也可以在ONSIZE中设置,最后看下SetRectNP的MSDN解释吧:CEdit::SetRectNPvoid GetRectNP(LPRECT lpRect);参数:说明:调用此成员函数用一个多行编辑控件设置格式化矩形。此格式化矩形为文本的边界矩形,与编辑控件窗口的大小无关。除了编辑控件窗口不被重新设置外,SetRectNP与SetRect成员函数一致。当编辑控件首次被创建时格式化矩形与用户的编辑控件窗口区一样。使用SetRect NP成员函数后,应用程序可以使格式化矩形大于或小于编辑控件窗口。如果编辑控件没有滚动栏,在格式化矩形大于窗口时,文本将被剪切而不是被覆盖。此成员函数仅对多行编辑控件有效。要了解更多信息,请参阅Win32文档中的EM_SETRECTNP。另一种写死的方法,重载WM_NCCALISIZE,通过把非客户区设宽,只给字体留居中的矩形做为客户区,那当然是字体绝对居中了代码:void CEditEx::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp) { int height = lpncsp->rgrc[0].bottom - lpncsp->rgrc[0].top; int margin = 0; CDC* pDC = GetDC(); TEXTMETRIC tm; pDC->GetTextMetrics(&tm); int nFontHeight = tm.tmHeight + tm.tmExternalLeading; int nMargin = (height - nFontHeight) / 2; lpncsp->rgrc[0].left += 8; lpncsp->rgrc[0].top += nMargin; lpncsp->rgrc[0].right -= 8; lpncsp->rgrc[0].bottom -= (nMargin-1); CEdit::OnNcCalcSize(bCalcValidRects, lpncsp); } 当然这时你也可以重绘NPPaint,来使用非客户区颜色和客户区一致,让人误以为那还是客户区。随手写的,别拍砖,期待兄弟们更好的方法分享。----------hgy
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
你见过最古老的东西是什么,有多少年历史 WORD中怎么输出稿纸模式word中怎么输出稿纸模式 女性尿检阴性是什么意思 阴性尿检是什么意思 尿检阴性是什么 win10如何查看电脑配置参数 win10怎样查看电脑配置参数 多地对公职人员提接种要求 亚马逊订单可以退回任何Kohl's商店,7月份生效 亚马逊提供免费退货,珠宝退货卖家要承担运费吗 新的亚马逊退货政策惹争议!官方解答来了 CEdit用法 VC中解释一下这两个函数的作用是什么,看了MSDN可是觉得他讲的不是很... MFC CEDIT控件如何实现自动垂直滚动,小白求教学 CEdit控件中,怎么把光标设置到文本的后面 360 云镜 s600 什么系统 场效应管在电路图里面的画法?看到好多种场管的画法,搞的自己都分不清... 如何让脸部毛孔收缩 脸部毛孔如何收缩 3D Ultra Cool Pool 黑屏,WSC2009也差不多 Raedon x300/x550/x1050 series 显示卡 与什么样的电脑硬件搭配好些... 山地车中轴只有单盘的是什么回事 山地自行车中轴BC_73E什么意思? 经验足的说说子宫肌瘤怎么形成的? 怎么解冻 男生喝什么汤补肾补精 冻结怎么解冻 解冻方法 我想知道什么汤最补精? 花生不剥壳可以炸油? 占有权的分类 外地人来河南,点哪几道菜才不尴尬?推荐6道经典豫菜,太香了 Edit Control 和Edit Box区别?为什么我的VS2010里面没有Edit Box 添加... 三一集团是国企还是私企 扁平疣能吃鸡蛋吗 得了扁平疣可以吃鸡蛋和鸡肉吗 皮肤病不能吃哪些发物 住房公积金断交一个月下一个单位按什么基数给交? 要电视剧神探夏洛克的简介,简单概括一下,英文的更好。 神探夏洛克第一季第一集剧情简介英文版 神探夏洛克的英文名是什么? 神探夏洛克剧本中英对照【要求全】 神探夏洛克全9集中英文对照台词,无时间轴 神探夏洛克的英文怎麼写? 香芒西米露怎样做? 怎么定位手机 怎样设置定位手机 小时候买不起正版奥特曼玩具,现在买得起了300一个买了10个,但是为什么... 这是什么??我竟然看不出来了。。。我的童年,要详细点,谢谢 奥特曼和葫芦娃谁更厉害 超人 奥特曼 葫芦娃 三个里面哪个不会飞呢?? 我用苹果手机iTools助手下载一个游戏,显示unable to download APP... 法国有一部电影跟火车有关的