Тема: ObjectARX и GetSaveFileName

В .arx модуле в отдельном потоке вызываю GetSaveFileName.
Окно создается, вроде бы как все в порядке, но фокус постоянно перехватывается родителским окном,
окном автокада. Да, модуль писан на чистом C++ (без MFC, NET), платформа AutoCAD MEP 2012, VS 2008, окно
родителя пробовал устанавливать как через:
    stOpenFileName.hwndOwner = adsw_acadMainWnd();
так и через:
    pAcadDisp = acedGetIDispatch(TRUE);
    pAcadDisp->QueryInterface(AutoCAD::IID_IAcadApplication,(void**)&pAcad);
    pAcad->get_HWND((AutoCAD::LONG_PTR*)&stOpenFileName.hwndOwner);
Результат один и тот же, фокус постоянно перехватывается окном родителя.

Что я не так делаю?

Re: ObjectARX и GetSaveFileName

точно не скажу, но там кажись нада OFN_EXPLORER флаг ставить.
еще можешь попробовать так
там есть вариант сохранения через акадовское окно и через стандартный CFileDialog.

PS: если верить информации написанной тут, то будут большие проблемы с x64. да и про поддержку семерки и висты там ничего нет, так что лучше сразу переходить на CFileDialog или пользоваться стандартными акадовскими окнами

Re: ObjectARX и GetSaveFileName

Николай, спасибо за ответ.
Флаг OFN_EXPLORER установлен. Даже попробовал перехватывать сообщения. Не, все без толку. Главное окно перехватывает фокус не уведомляя дочерние.
С GetSaveFileName проблем нет ни на семерке ни на висте и под х64 тоже. Как только убираю овнера в GetSaveFileName, то все работает без проблем. Но мне нужно, что бы было привязано к окну автокада... :(
Какие еще мысли будут у многоуважаемого ALL?

Re: ObjectARX и GetSaveFileName

а вызывается это все из своего окна или просто командой? и какие флаги установлены на команду (acrxEntryPoint в самом низу ACED_ARXCOMMAND_ENTRY_AUTO(...   )?

Re: ObjectARX и GetSaveFileName

Николай пишет:

а вызывается это все из своего окна или просто командой? и какие флаги установлены на команду (acrxEntryPoint в самом низу ACED_ARXCOMMAND_ENTRY_AUTO(... )?

Нет, просто вызываю Windows API.
MFC-шный CFileDialog мне не в помощь, т.к. это просто оболочка над тем же CommonDialog, т.е. результат должен быть точно таким же.
Вызывать Acad-овское окно тоже не вариант, мне нужно только получить путь для сохранения от User'а.
А по поводу ACED_ARXCOMMAND_ENTRY_AUTO не понял, обьясните, пожалуйста, поподробней.
Нашел вот такую инфу: "
http://forums.autodesk.com/t5/Autodesk-ObjectARX/How-to-control-the-focus-of-CAdUiPalette-to-programatically/m-p/1424300/highlight/true#M18357"
но "WM_ACADKEEPFOCUS" в документации нигде не пробегал.
И что делать? Куда копать?

Re: ObjectARX и GetSaveFileName

ну если нужно указать только путь, то можно и так:

#include <shlwapi.h>
...
CString BrowseForFolder(HWND hWndParent, LPCWSTR lpszTitle, UINT nFlags)
{   
    CString strResult = _T("\0");
    LPMALLOC lpMalloc;
    if (::SHGetMalloc(&lpMalloc) != NOERROR) return strResult;
    ACHAR szBuffer[1024];
    ACHAR szDisplayName[MAX_PATH];
   
    BROWSEINFO browseInfo;
    browseInfo.hwndOwner = hWndParent;
    browseInfo.pidlRoot = NULL;
    browseInfo.pszDisplayName = szDisplayName;
    browseInfo.lpszTitle = (LPCWSTR)lpszTitle;
    browseInfo.ulFlags = nFlags;
    browseInfo.lpfn = NULL;
    browseInfo.lParam = 0;

    LPITEMIDLIST lpItemIDList;
    if ((lpItemIDList = ::SHBrowseForFolder(&browseInfo)) != NULL)
    {
        if (::SHGetPathFromIDList(lpItemIDList, szBuffer))
        {
            if (szBuffer[0] == _T('\0')) return strResult;
            strResult = szBuffer;
            return strResult;
        }
        else return strResult;
        lpMalloc->Free(lpItemIDList);
        lpMalloc->Release();
    }
    return strResult;
}  

а вызывать так:

CString retStr = BrowseForFolder(adsw_acadMainWnd(), _T("Папка пользователя:"), BIF_NEWDIALOGSTYLE | BIF_RETURNONLYFSDIRS); // если вызывается из диалога, то пихать рцтв диалога а не акада

теперь разбор полетов :)

поводу ACED_ARXCOMMAND_ENTRY_AUTO не понял, обьясните, пожалуйста, поподробней

начнем с простого в проекте есть файл acrxEntryPoint.cpp? если есть, то в самом низу идет "описание" для автокадовской команды. например, так:

ACED_ARXCOMMAND_ENTRY_AUTO(CMyApp, acadMyClass, acad_command1, acad_command1, ACRX_CMD_TRANSPARENT, NULL)

вот интересует всё что находится после последнего acad_command1. просто проблема может быть еще и тут закопана :)

Нет, просто вызываю Windows API.

да понятно что winapi? откуда вызывается winapi? из команды для автокада в файле acrxEntryPoint.cpp или из своего диалога?

WM_ACADKEEPFOCUS нужен классах диалогов, которые есть в проекте, чтоб автокад нормально получал фокус после закрытия окна и отдавал его перед открытием. как-то так. подробней и сам не ковырялся. знаю только что без него работает плохенько, осообенно если еще и выпадающие сообщения с окна вылазят, типа не то ввел, отойди от компьютера и т.п. :)

PS: самый простой вариант. код в массы. а то гадание по фотографии :) не получается как-то у нас