Re: Создание дочернего окна из потока (WTL)
От: Edge  
Дата: 28.07.06 07:17
Оценка:
Здравствуйте, Charniauski_Pavel, Вы писали:

C_P>Проблема оказалась в том, что при создании окошка из потока, оно не получет карту сообщений, а следовательно я не могу обработать WM_PAINT. Причём "валится" окошко в методе OnCreate() в блоке:


C_P>CMessageLoop* pLoop = _Module.GetMessageLoop();

C_P>ATLASSERT(pLoop != NULL); ( !!! ТУТ !!! )
C_P>pLoop->AddMessageFilter(this);
C_P>pLoop->AddIdleHandler(this);

C_P>Пробовал передавать ссылку на CMessageLoop прямо в поток, никакого результата.


C_P>Что не так? Может кто уже сталкивался.


В потоке где создается окно, уже должен быть создан объект класса CMessageLoop и добавлен в _Module. Вот например код, который генерится WTL визардом:


int Run(LPTSTR /*lpstrCmdLine*/ = NULL, int nCmdShow = SW_SHOWDEFAULT)
{
    CMessageLoop theLoop;
    _Module.AddMessageLoop(&theLoop);
.,,
.,,
}
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR lpstrCmdLine, int nCmdShow)
{
...
...
...
    hRes = _Module.Init(NULL, hInstance);
...
    int nRet = Run(lpstrCmdLine, nCmdShow);
...
    _Module.Term();
...
...
...
    return nRet;
}


Как видно, в основном потоке создается theLoop и добавляется в _Module, после чего диалог спокойно может звать _Module.GetMessageLoop. Без этого _Module не будет знать, что у вас в конкретном потоке есть обработка сообщений.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.