Привет всем!
Много времени прошло, хорошо что сохранился проект :)
Правда точно не помню, но кажись все работало
Для начала в реакторе я находил окошко документа по заголовку pDocCreating->docTitle()
void DocReactor::documentCreated(AcApDocument * pDocCreating)
{
// ищем окошко документа
HWND wnd0 = adsw_acadMainWnd();
HWND wnd1 = FindWindowEx(wnd0, NULL, "MDIClient", NULL);
HWND wnd = FindWindowEx(wnd1, NULL, NULL, pDocCreating->docTitle());
// оконная процедура !!!!!!!!!!!!!!!!
WNDPROC wpProc = NULL;
//==============================================================
wpProc = (WNDPROC) SetWindowLong(wnd, GWL_WNDPROC, (LONG) EditSubclassProc);
//==============================================================
AcApDocManagerReactor::documentCreated (pDocCreating);
}
и в оконной процедуре делал свое черное дело
LRESULT APIENTRY EditSubclassProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
// ищем индекс окна
int intIndex = 0;
bool bFound = false;
for (intIndex; intIndex < vDocWnds.size(); intIndex++)
{
if (vDocWnds.at(intIndex) == hwnd)
{
bFound = true;
break;
}
}
// адреса процедур храню в массиве
WNDPROC wp = vDocProcs.at(intIndex);
switch(uMsg)
{
case WM_SYSCOMMAND:
{
if (wParam == 61536) // закрытие
{
AcDbDatabase* db = vDocs.at(intIndex)->database();
long res = acdbSetDbmod(db, 0);
}
break;
}
case WM_DESTROY:
{
// возвращаем адрес окошку обратно
SetWindowLong(hwnd, GWL_WNDPROC, (LONG)wp);
break;
}
default:
;
}
return CallWindowProc(wp, hwnd, uMsg, wParam, lParam);
}