Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > SetWindowText


Автор: Afinogen 9.4.2013, 16:27
в общем дело было вечером делать было нечего, начал изобретать велосипед - написать класс формы, кнопок и т.д. То есть обернуть winapi функции и подучить winapi.
нашел http://forum.vingrad.ru/forum/topic-365615.html
Код

class MyClass {
private:
    static LRESULT CALLBACK s_WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) {
        MyClass * self = ( MyClass * )GetWindowLongPtr( hWnd, GWL_USERDATA );
        return self->WndProc( hWnd, message, wParam, lParam );
    }
    LRESULT WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) {
        ...
    }
    void installWindowProc( HWND hWnd ) {
        SetWindowLongPtr( hWnd, GWL_USERDATA, (LONG_PTR)this );
        SetWindowLongPtr( m_wnd, GWL_WNDPROC, (LONG_PTR)s_WndProc );
    }
};

код работает, но если мне нужно изменить заголовок окна
Код

SetWindowText(m_wnd,"bla-bla");

то изменение заголовка происходит только при закрытии формы, как и сообщение WM_SETTEXT. Все остальные команды проходят сразу.
Код

UpdateWindow(m_wnd);

не помогает, я так понимаю надо окно как то заставить обновить данные. Причем если делать окно без класса, то SetWindowText работает.
в функции s_WndProc hwnd окна правильный. проверял.

Автор: Dem_max 9.4.2013, 16:32
ну пока что ты полный код не привел

Автор: Afinogen 9.4.2013, 16:53
http://upwap.ru/3075555 вот, писал в eclipse + mingw

вынес 
Код

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

в main
сообщение о смене заголовка стало приходить но заголовок не менятеся...

Автор: feodorv 10.4.2013, 02:20
Цитата(Afinogen @  9.4.2013,  17:53 Найти цитируемый пост)
сообщение о смене заголовка стало приходить но заголовок не менятеся...

Цитата
LRESULT CALLBACK TForm::WndProc(HWND hwnd, UINT Message, WPARAM wParam,
        LPARAM lParam)
{
    PAINTSTRUCT ps;
    HDC hdc;

    switch (Message)
    /* handle the messages */
    {
        case WM_SETTEXT:
            MessageBox(NULL, (char*) lParam, "Win32 Guided Tour", NULL);
        break;
        case WM_PAINT:
            hdc = BeginPaint(hwnd, &ps);

            EndPaint(hwnd, &ps);
        break;
        case WM_COMMAND:

        break;
        case WM_CREATE:

        break;
        case WM_KEYDOWN:
            MessageBox(NULL, "key down", "Win32 Guided Tour", NULL);
        break;
        case WM_CLOSE:

            PostQuitMessage(0);
        break;
        case WM_DESTROY:

            PostQuitMessage(0); /* send a WM_QUIT to the message queue */
        break;
        default: /* for messages that we don't deal with */
            return DefWindowProc(hwnd, Message, wParam, lParam);
    }

    return 0;
}

"Сообщение стало приходить" - Вы имеете в виду  MessageBox(... "Win32 Guided Tour" ...)?
Ну так сообщение WM_SETTEXT успешно перехватывается и не доходит до DefWindowProc(). А именно DefWindowProc в своих потрохах вызывает RedrawTitle в ответ на WM_SETTEXT...

Автор: Afinogen 10.4.2013, 07:48
Цитата(feodorv @  10.4.2013,  02:20 Найти цитируемый пост)
RedrawTitle в ответ на WM_SETTEXT... 

точно, спасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)