LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
TCHAR szBuffer[1];
switch (message)
{
case WM_CHAR:
szBuffer[1] = (TCHAR) wParam;
cout << wParam << " " << szBuffer[1] << " ";
break;
case WM_PAINT:
InvalidateRect(hwnd, NULL, TRUE);
hdc = BeginPaint(hwnd, &ps);
SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));
TextOut(hdc, 1, 1, szBuffer, 1);
EndPaint(hwnd, &ps);
return 0;
大家好, 我试图运行上面的代码,只是在我的窗口上一次打印一个字母。但是,我似乎无法使用TextOut函数在窗口中显示字符,但能够在终端窗口中显示字符。我是WinApi的新手而且迷路了!
提前感谢!
答案 0 :(得分:3)
您的szBuffer
是WndProc()
的本地人,默认情况下,C中的本地变量有自动存储空间:每次调用WndProc()
时,新的{{} 1}}已创建,因此到达szBuffer
时,WM_PAINT
中输入的内容都将丢失。您需要将WM_CHAR
存储在其他位置,例如外部szBuffer
,或将其声明为WndProc()
,这将保留缓冲区(但要注意静态存储对于递归是不安全的)
同样在C中,数组的第一个元素的索引为0,而不是1; static
行需要szBuffer[1] = (TCHAR) wParam;
来做你想做的事。
由于我假设您是C的新手,请参阅Jonathan Potter关于在字符串中有一个额外字符的注释,该字符的值为零(不是数字零的字符代码,而是数字值0,或{ {1}}或szBuffer[0] = (TCHAR) wParam;
)。虽然'\0'
和其他GDI文本绘图函数不使用这些以null结尾的字符串,但 C中的所有其他内容。小心。
Joe Willcoxson的评论也是正确的。 L'\0'
将给定的矩形排队为需要重绘。在TextOut()
处理程序中使用它会导致您一次又一次地收到InvalidateRect()
条消息,这会对您的程序变得越来越大而对性能产生负面影响。