带有键盘消息的textout winapi

时间:2014-11-18 21:59:50

标签: winapi textout

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的新手而且迷路了!

提前感谢!

1 个答案:

答案 0 :(得分:3)

您的szBufferWndProc()的本地人,默认情况下,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()条消息,这会对您的程序变得越来越大而对性能产生负面影响。