Не получается кастомизировать PrintDlgEx
От: ndnomead  
Дата: 28.01.10 20:04
Оценка:
Добрый день !

Пытаюсь кастомизировать PrintDlgEx — подменить нижнюю часть диалога печати
чтобы разместить в ней свои элементы управления. Использую WTL, но вопрос
по WINAPI:

а) указываю флаг
CPrintDialogEx dlg(PD_ENABLEPRINTTEMPLATE | PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS, m_hWnd);


б) присваиваю параметры:

dlg.m_pdex.hInstance = _Module.GetModuleInstance();
dlg.m_pdex.lpPrintTemplateName = MAKEINTRESOURCE(IDD_PRINTBOTTOMDIALOG);
dlg.m_pdex.lpCallback = pIPrintDialogCallback;


в) вызываю
Темплейт загружается и нормально отображается в диалоге,
а callback интерфейс почему-то не вызывается.
(программа не попадает в функции интерфейса)
Пробовал сам руками вызывать COM-интерфейс — он работает.
Поиске в гугле не помогает...

Если кто сталкивался киньте примерчик.

Интерфейс реализовал следующим образом


class CPrintDialogCallback : public IPrintDialogCallback
{
    public:
    LONG _lRef;

    CPrintDialogCallback();
    ~CPrintDialogCallback();

    STDMETHOD(QueryInterface)(IN REFIID riid, OUT void** ppv);
    STDMETHOD_(ULONG, AddRef)();
    STDMETHOD_(ULONG, Release)();

    STDMETHOD(InitDone)();
    STDMETHOD(SelectionChange)();
    STDMETHOD(HandleMessage)(HWND hDlg, UINT uMsg, WPARAM wParam,
        LPARAM lParam, LRESULT *pResult);
};

CPrintDialogCallback::CPrintDialogCallback()
:_lRef(0)
{
}

CPrintDialogCallback::~CPrintDialogCallback()
{
}

STDMETHODIMP CPrintDialogCallback::QueryInterface(IN REFIID riid, OUT void** ppvObj)
{
    if (NULL == ppvObj) {
        return E_INVALIDARG;
    }
    if (IsEqualIID(riid, IID_IUnknown))
    {
        *ppvObj = (IUnknown *)this;
        AddRef();
        return S_OK;
    }
    else if (IsEqualIID(riid, IID_IPrintDialogCallback))
    {
        *ppvObj = (IPrintDialogCallback *)this;
        AddRef();
        return S_OK;
    }
    *ppvObj = NULL;
    return (E_NOINTERFACE);
}

ULONG __stdcall  CPrintDialogCallback::AddRef()
{
    return InterlockedIncrement(&_lRef);
}

ULONG __stdcall  CPrintDialogCallback::Release() 
{
  if(InterlockedDecrement(&_lRef) == 0)
    {
        delete this ;
        return 0;
    }
  return _lRef ;
}

STDMETHODIMP CPrintDialogCallback::InitDone()
{
    ::MessageBox(NULL, _T("COM"), _T("COM"), MB_OK);
    return S_FALSE;
}

STDMETHODIMP CPrintDialogCallback::SelectionChange()
{
    return S_FALSE;
}

STDMETHODIMP CPrintDialogCallback::HandleMessage(HWND hDlg, UINT uMsg, WPARAM wParam,
        LPARAM lParam, LRESULT *pResult)
{
    return S_FALSE;
}
printdlgex lpcallback
Re: Не получается кастомизировать PrintDlgEx
От: CEMb  
Дата: 29.01.10 04:16
Оценка:
Здравствуйте, ndnomead, Вы писали:

N>Темплейт загружается и нормально отображается в диалоге,

N>а callback интерфейс почему-то не вызывается.

Если совсем ничего не получится — попробуй SetWindowsHookEx класса WH_CBT, тут, на рсдн-е, есть статейка про кастомизацию MessageBox таким путём.
Re: Не получается кастомизировать PrintDlgEx
От: McQwerty Россия  
Дата: 29.01.10 14:40
Оценка:
Здравствуйте, ndnomead, Вы писали:

N>Пытаюсь кастомизировать PrintDlgEx — подменить нижнюю часть диалога печати

N>чтобы разместить в ней свои элементы управления. Использую WTL, но вопрос
N>по WINAPI:

N>а) указываю флаг

N>
N>CPrintDialogEx dlg(PD_ENABLEPRINTTEMPLATE | PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS, m_hWnd);
N>


N>Интерфейс реализовал следующим образом

N>
N>class CPrintDialogCallback : public IPrintDialogCallback
N>

The callback object should also contain the IObjectWithSite class to receive a pointer to the IPrintDialogServices interface. The PrintDlgEx function calls IUnknown::QueryInterface on the callback object for both IID_IPrintDialogCallback and IID_IObjectWithSite to determine which interfaces are supported.

Может это?
Re: Не получается кастомизировать PrintDlgEx
От: ndnomead  
Дата: 29.01.10 16:57
Оценка:
Здравствуйте, ndnomead, Вы писали:

N>Добрый день !


N>Пытаюсь кастомизировать PrintDlgEx — подменить нижнюю часть диалога печати

N>чтобы разместить в ней свои элементы управления. Использую WTL, но вопрос
N>по WINAPI:

Всем спасибо, разобрался,
оказывается WTL переприсваивает lpCallback.
Там уже все сделано, надо просто унаследоваться
от CPrintDialogEx и перекрыть нужные методы.
Как-то так:


class CMyPrintDialogEx : public CPrintDialogEx
{
public:
    CMyPrintDialogEx (
        DWORD dwFlags = PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS | PD_NOSELECTION |   PD_NOCURRENTPAGE,
        HWND hWndParent = NULL)
        : CPrintDialogEx(dwFlags, hWndParent),
        m_pCommandContext(pCommandContext)
    { }

    BEGIN_MSG_MAP(CMyPrintDialogEx)
        MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
    END_MSG_MAP()

    STDMETHOD(InitDone)()
    {
        return S_FALSE;
    }

    STDMETHOD(SelectionChange)()
    {
        return S_FALSE;
    }

    LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled);
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.