SetWindowText

 
0
 
C++
ava
Afinogen | 09.04.2013, 17:27
в общем дело было вечером делать было нечего, начал изобретать велосипед - написать класс формы, кнопок и т.д. То есть обернуть winapi функции и подучить winapi.
нашел как сделать калбек функцию окна объектной

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 окна правильный. проверял.
Comments (5)
ava
Dem_max | 09.04.2013, 16:32 #
ну пока что ты полный код не привел
ava
Afinogen | 09.04.2013, 16:53 #
исходники вот, писал в eclipse + mingw
ava
Terminator101 | 09.04.2013, 19:50 (Edited 09.04.2013 20:52) #
Пробовал на VC++ 2012 и не сработало сразу.
Несколько замеченных проблем:
1. Возвращение адреса временной строки

string TObject::getClassName() const
{
    return class_name_;
}
//{...}
    wincl_.lpszClassName =  getClassName().c_str();

RegisterClassEx падает после этого так как нет валидных данных в lpszClassName. Та же история с CreateWindowEx. Чтобы работало можно сделать так

const string& TObject::getClassName() const
{
    return class_name_;
}

2. Цикл обработки сообщений

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

Из MSDN:
Цитата

    If the function retrieves a message other than WM_QUIT, the return value is nonzero.
    

Таким образом в WinMain нельзя менять заголовок закрытого окна. Программа будет стоять в точке 
Цитата
p->CreateForm();
 до тех пор пока не закроется окно, что и происходит.

В общем надо смотреть на другие велосипеды чтобы понять как все сделать чтобы работало.
ava
feodorv | 10.04.2013, 02:20 #
Цитата (Afinogen @  9.4.2013,  17:53 findReferencedText)
сообщение о смене заголовка стало приходить но заголовок не менятеся...

Цитата
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...
ava
Afinogen | 10.04.2013, 07:48 #
Цитата (feodorv @  10.4.2013,  02:20 findReferencedText)
RedrawTitle в ответ на WM_SETTEXT... 

точно, спасибо
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
advanced
Submit