我一直在努力建立一个简单的Win Api程序(使用CodeBlocks)并遇到了一个奇怪的问题。
case WM_COMMAND:{
if (LOWORD(wParam) == Calculate) {
int A=0, ArrayReset = 0;
char textread[256];
SendMessage((HWND)Box1,(UINT) EM_GETLINE, (WPARAM)1, (LPARAM)&textread);
A = atoi(textread);
itoa(ArrayReset, textread, 10);
itoa(A, textread, 10);
SendMessage((HWND)Box1,(UINT) WM_SETTEXT, (WPARAM)1,(LPARAM)&textread);
(我的程序有点复杂,但这只是为了表明问题点) 现在,我希望代码能够读取Box1中的值,将其转换为整数,将其转换回char数组,然后将该数组打印回同一个Box1。基本上,一些转换在最终结果上没有区别。 但是,有这个奇怪的问题。该代码适用于单位数字,但如果我输入一个数字更多的数字,如12或356,我分别得到1200和3560。如果输入的数字大于一千,它再次正常工作。 这是一个问题,因为我的方法是将数组的值重置为0,还是必须对转换过程执行某些操作?
答案 0 :(得分:0)
我认为你有几个问题。
首先,您没有向我们展示Parse1
是什么。请注意,必须在缓冲区的第一个字中设置缓冲区的大小。另外,为什么你传递1 WPARAM
?这是从多行编辑控件中检索的行的从零开始的索引,但如果编辑是单行则忽略该索引。
此外,第一次itoa
来电是什么?
这是一个有效的例子:
TCHAR textread[256] = {0};
*(reinterpret_cast<WORD*>(&textread)) = 256;
::SendMessage(hwnd, EM_GETLINE, 0, reinterpret_cast<LPARAM>(&textread));
auto n = _ttoi(textread);
_itot_s(n, textread, 256, 10);
::SendMessage(hwnd, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(&textread));
答案 1 :(得分:0)
此代码中存在一些错误。
对于初学者,(LPARAM)&textread
应为(LPARAM)textread
或(LPARAM)&textread[0]
。
但更重要的是,您没有正确准备EM_GETLINE
消息:
的lParam
指向接收该行副本的缓冲区的指针。 在发送消息之前,将此缓冲区的第一个字设置为缓冲区中TCHAR的大小。对于ANSI文本,这是字节数;对于Unicode文本,这是字符数。 第一个单词的大小会被复制的行覆盖。
请改为尝试:
case WM_COMMAND:{
if (LOWORD(wParam) == Calculate) {
int A = 0;
TCHAR textread[256];
*((LPWORD)&textread) = 256; // <-- add this
SendMessage(Box1, EM_GETLINE, 0, (LPARAM)textread);
_stscanf(textread, _T("%d"), &A);
_stprintf(textread, _T("%d"), A);
SendMessage(Box1, WM_SETTEXT, 0, (LPARAM)textread);
}
break;