2012-01-19 3 views
1

Я пытаюсь научиться использовать и получать сырые входные сообщения, поэтому я разработал следующую программу, чтобы проверить мое понимание до сих пор ...PostMessage, похоже, не работает?

Когда я получаю входное сообщение, я пытаюсь изменить строку который отображается и помещает новое сообщение WM_PAINT в очередь. Но это сообщение, похоже, не вызвано. Только при изменении размера окна текст выглядит иначе.

Почему сообщение WM_PAINT не обрабатывается вообще, пока я не изменю размер окна?

#define _WIN32_WINNT 0x501 
#include <Windows.h> 
#include <assert.h> 
#include <cstring> 
#include <cstdio> 

LRESULT CALLBACK WinProcedure(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam); 

int WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,int nCmdShow) 
{ 
    WNDCLASS wc; 
    HWND hwnd; 

    wc.hInstance = hInst; 
    wc.lpfnWndProc = WinProcedure; 
    wc.style = CS_HREDRAW | CS_VREDRAW; 
    wc.cbClsExtra = 0; 
    wc.cbWndExtra = 0; 
    wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); 
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); 
    wc.hbrBackground = (HBRUSH)COLOR_WINDOWFRAME; 
    wc.lpszMenuName = NULL; 
    wc.lpszClassName = "Untitled"; 

    if (!RegisterClass(&wc)) { 
     // Error registering class 
     return -1; 
    } 

    if (!(hwnd = CreateWindow(wc.lpszClassName, wc.lpszClassName, WS_OVERLAPPEDWINDOW, 
        CW_USEDEFAULT,CW_USEDEFAULT,500,300,NULL,NULL,hInst,NULL))) { 
     // Error creating window 
     return -1; 
    } 

    ShowWindow(hwnd,nCmdShow); 
    UpdateWindow(hwnd); 

    RAWINPUTDEVICE Rid[1]; 

    Rid[0].usUsagePage = 0x01; 
    Rid[0].usUsage = 0x06; 
    Rid[0].dwFlags = 0; // adds HID keyboard and also ignores legacy keyboard messages 
    Rid[0].hwndTarget = 0; 

    if (RegisterRawInputDevices(Rid, 1, sizeof(Rid[0])) == FALSE) { 
     return -5; 
    } 

    MSG msg; 
    while (GetMessage(&msg,NULL,0,0) > 0) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
    return 0; 
} 

LRESULT CALLBACK WinProcedure(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) 
{ 
    static char buffer[5000] = "hi"; 

    if (msg == WM_PAINT) { 
     PAINTSTRUCT ps; 
     HDC dc; 
     RECT r; 
     GetClientRect(hwnd,&r); 
     dc=BeginPaint(hwnd,&ps); 
     DrawText(dc,buffer,-1,&r,DT_SINGLELINE|DT_CENTER|DT_VCENTER); 
     EndPaint(hwnd,&ps); 
     return 0; 
    } 

    if (msg == WM_INPUT) { 
     strcpy(buffer, "Recieved input."); 
     //assert(false); 
     PostMessage(hwnd, WM_PAINT, wparam, lparam); 
     return 0; 
    } 

    if (msg == WM_DESTROY) { 
     PostQuitMessage(0); 
     return 0; 
    } 

    return DefWindowProc(hwnd, msg, wparam, lparam); 
} 

ответ

9

Если вы посмотрите на the documentation for the WM_PAINT message, он говорит очень ясно:

WM_PAINT сообщение генерируется системой и не должны быть направлены приложением.

Если что-то не работает так, как вы ожидаете, сначала обратитесь к документации. Есть причина, почему они существуют. Используйте их в своих интересах.

Причина, по которой просто отправить WM_PAINT не работает, потому что есть способ рисовать больше, чем просто отправить сообщение WM_PAINT. Система устанавливает правильные структуры, чтобы приложение могло рисовать в окне, среди прочего, например. Отправка WM_PAINT в окно - это всего лишь одна часть всего процесса рисования.

Что вы, возможно, хотите, это InvalidateRect() function, который сообщает операционной системе, что вы хотите перекрасить определенную область окна. Затем ОС выполняет правильную процедуру рисования.

+0

Спасибо. Я проконсультировался с документацией. Невозможно прочитать каждую часть, особенно для API окон. В этом случае я сосредоточил свое внимание на PostMessage и SendMessage, потому что думал, что это проблема. Пожалуйста, будьте нежны для обучения людей. – Bingo

+0

@ Бинго: По крайней мере, у меня нет [социальных навыков термоядерного устройства] (http://blogs.msdn.com/b/oldnewthing/archive/tags/the+social+skills+of+a+thermonuclear + device /): -P Тем не менее, поскольку другие люди будут читать этот ответ, я хочу, чтобы другим пользователям было ясно, что чтение документов может действительно помочь. –

+0

ха-ха хорошая ссылка. Дело принято. * wimpers * – Bingo

Смежные вопросы