Используйте TextOut () в WM_COMMAND - PullRequest
       246

Используйте TextOut () в WM_COMMAND

1 голос
/ 12 апреля 2011

Я пытаюсь напечатать текст в случае WM_COMMAND, потому что мне нужно, чтобы текст был напечатан после нажатия кнопки.

Вот код, который у меня есть:

switch(msg)
{
default:
    return DefWindowProc(hwnd, msg, wParam, lParam);
case WM_COMMAND:
    switch (LOWORD(wParam))
    {
    case 1:
        PAINTSTRUCT ps;
        HDC         hDC;
        hDC = BeginPaint(hwnd, &ps);
        {
            TextOut(hDC, 10, 50, "hello", 5);
        }
        EndPaint(hwnd, &ps);
        UpdateWindow(hwnd);
        break;
    }
    break;
}

К сожалению, он ничего не печатает.

edit:

Я могу использовать TextOut() во время WM_COMMAND таким образом:

HDC         hDC;
hDC = GetDC(hwnd);
TextOut(hDC, 10, ypos, "Warnings: ", 10);
UpdateWindow(hwnd);

Ответы [ 2 ]

7 голосов
/ 12 апреля 2011

Лучше структурировать вашу программу так, чтобы все рисование выполнялось в WM_PAINT.

, чтобы вы могли изменить его на что-то вроде:

LRESULT CALLBACK WndProc(/*blah blah blah*/) 
{
    static wchar_t my_text[] = L"hello";
    static BOOL show_btn_text = FALSE;
    HDC dc;
    PAINTSTRUCT ps;
    switch (msg) {
          case WM_COMMAND:
               switch (LOWORD(wParam)) {
                  case 1:
                       show_btn_text = !show_btn_text;
                       InvalidateRect(hwnd, NULL, TRUE); //tells windows that the whole client area needs to be repainted
                       break;
               }
               return 0;
           case WM_PAINT:
                dc = BeginPaint(hwnd, &ps);
                if (show_btn_text) {
                    TextOut(dc, 0, 0, my_text, wcslen(my_text));
                }
                EndPaint(hwnd, &ps);

            return 0;
            /*the rest of the window procedure
    }
}
4 голосов
/ 12 апреля 2011
  • Для рисования внутри WM_PAINT: BeginPaint / EndPaint.
  • Для рисования вне WM_PAINT: GetDC / ReleaseDC.
...