Здравствуйте, 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 не будет знать, что у вас в конкретном потоке есть обработка сообщений.