Добрый день !
Пытаюсь кастомизировать 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;
}
Здравствуйте, 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.
Может это?
Здравствуйте, 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);
}