在CEDIT中,当我把CEDIT设置为多行文本时,有没有一个方法可以设置每行文字的最大长度(目前没找到),CEDIT的SetLimitText设置文字的最大长度,为什么用SetWindowText可以设置超过最大长度的文字,有什么方法可以让SetWindowText设置的文本长度不超过最大长度呢???
解决方案 »
- Debug Assertion Failed!有未经处理的异常: 0xC0000005: 写入位置 0x000008c4 时发生访问冲突
- VC++6.0 神奇的故障。
- 静默安装包如何跳过360的提示
- 线程中的while(1)循环为什么不会让CPU占用率100%
- 怎样获得Edit Box中的整数信息?
- 当焦点在Edit控件时响应contrl+enter的按键怎么做?
- 请教UDP快速接收数据丢包的问题
- 如何在自己程序的浮动在游戏的界面上(再问一次)
- 请教GDI+,创建位深度1bit(4bit,8bit)bmp图像并且在上面绘图
- 请教关于视图更新的问题
- [芊]欢迎斑竹和高手进来坐坐,顺便帮小妹一个忙
- 想改ping的原地址
把EDIT框的Horizontal scroll、Auto HScroll属性去掉。
但不知道为什么我在dlg的PreTranslateMessage中拦截不到这个消息,试了好多方法都不行,最后只好麻烦点,子类化后自已做个消息函数了。请大虾们指点
方法如下:
WNDPROC OldProc;
int Length = 10;
BOOL CEditLengthDlg::OnInitDialog()
{
....
OldProc=(WNDPROC)::GetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd, GWL_WNDPROC);
::SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd,GWL_WNDPROC, (LONG)TextProc);
....
}
LRESULT CALLBACK TextProc(HWND hwnd, UINT uMsg, WPARAM wParam,LPARAM lParam)
{
if (uMsg == WM_SETTEXT)
{
CString str((LPCSTR)lParam);
if (str.GetLength() > 10)
{
str = str.Left(10);
return CallWindowProc(OldProc,hwnd, uMsg,wParam,(LPARAM)(LPSTR)(LPCTSTR)str);
}
}
return CallWindowProc(OldProc,hwnd, uMsg,wParam,lParam);
}
{
if (strlen((LPSTR)lParam) > 10)
{
char str[11];
memcpy(str,(LPSTR)lParam,10);
str[10] = '\0';
return CallWindowProc(OldProc,hwnd, uMsg,wParam,(LPARAM)str);
}
}
---------------------
先将你的ANSI字符串转换为UNICODE, MULTIBYTETOWIDECHAR(936,...),然后算宽度GetTextExtentPoint32W或者GetTextExtentExPointW,按宽度截断UNICODE字符串,再转换回ANSI字符串WIDECHARTOMULTIBYTE(936,...).就没有半个中文的问题了.
--------------------------------------------------------------
由自己控制,两个方法:
1. 你可以设一个弄个全局变量,记录可以设置最长的限制数,在用SetWindowText是,就检查是否超过了这个值
2. 在edit的OnChange中,如果长度超过了要设定的最大长度,则截去后面的部分,重新设置edit的文本即可