Народ!!! Как коректно работать со стандартными property page-ами? При попытке вывести на екран при помощи OleCreatePropertyFrame(...) property page для font-а из библиотеки mfc42.dll property page не инициализируется, т.е. список шрифтов, установленых в системе пустой и т.д.
Помогите, please!!!
Лучший дар, который мы получили от природы и который лишает нас всякого права жаловаться – это возможность сбежать. /М.Монтень/
Здравствуйте Thanatos, Вы писали:
T>Народ!!! Как коректно работать со стандартными property page-ами? При попытке вывести на екран при помощи OleCreatePropertyFrame(...) property page для font-а из библиотеки mfc42.dll property page не инициализируется, т.е. список шрифтов, установленых в системе пустой и т.д.
T>Помогите, please!!!
Покажи как ты вызываеш OleCreatePropertyFrame, что передаеш в IUnknown* и CLSID.
Здравствуйте Dima2, Вы писали:
D>Здравствуйте Thanatos, Вы писали:
T>>Народ!!! Как коректно работать со стандартными property page-ами? При попытке вывести на екран при помощи OleCreatePropertyFrame(...) property page для font-а из библиотеки mfc42.dll property page не инициализируется, т.е. список шрифтов, установленых в системе пустой и т.д.
T>>Помогите, please!!!
D>Покажи как ты вызываеш OleCreatePropertyFrame, что передаеш в IUnknown* и CLSID.
За вызов отвечает следующий фрагмент кода:
HRESULT hr;
IPropPagePtr pObj;
IUnknown* pUnk;
CLSID cls;
где IPropPage интерфейс с property Font. Реализация интерфейса — CPropPage — "Simple ATL object" c progid "MBProp.PropPage" и членом класса m_pFont. "{0BE35200-8F91-11CE-9DE3-00AA004BB851}" — ID нужного property page (в даном случае — "Font Property Page", библиотека mfc42.dll)
Результат выполнения — вывод на екран нужного Property Page, но полностью disable, т.е. нельзя ничего выбрать, не загружены стандартные шрифты (список шрифтов пустой),...
Заранее спасибо за ответ.
Лучший дар, который мы получили от природы и который лишает нас всякого права жаловаться – это возможность сбежать. /М.Монтень/
Здравствуйте Thanatos, Вы писали:
T>За вызов отвечает следующий фрагмент кода:
Подожди в массив IUnknown ты должен передать не IUnknown твоей страницы св-в, а IUnknown твоего объекта, который поддерживает данную страницу св-в. Или я чего не правильно понял.
Да, верно. Только тебя, наверное ввело в заблуждение название объекта. На самом деле СPropPage — это ничего не делающий объект, с переменной Font, которую мне и нужно задать при помощи Property Page.
Здравствуйте Vi2, Вы писали:
Vi2>Насколько я помню, для фонта есть специальное значение DISPID_FONT, по которому оно запрашивается. Или это не так в C#?
Здравствуйте Dima2, Вы писали:
D>Здравствуйте Thanatos, Вы писали:
D>Понятно, я тут поковырялся и во что выяснилось.
D>Тебе надо вот использовать вот эту библ. D>
D>MS Stock Font Property Page Object
D>C:\WINNT\System32\msstkprp.dll
D>
Сначала я и пытался использовать MS Stock Font Property Page Object, но потом я узнал (из MSDN и atlctl.h) эту проп.п. можно использовать только для ActiveX-контролов с использованием CStockPropImpl<>. Если создавать ActiveX-контрол, то всё прекрасно — у него есть Font Property Page и она по-нормальному выводится.
P.S. Ты писал D> ISpecifyPropertyPages* pSpecProp; D> hr = pObj->QueryInterface(__uuidof(ISpecifyPropertyPages), (void**)&pSpecProp); D> CAUUID pages; D> hr = pSpecProp->GetPages( &pages );
--- у кого ты запрашиваеш ISpecifyPropertyPages*? Если pObj — это мой класс, то ISpecifyPropertyPages* у точно нет, поскольку мне как раз надо подключить к нему соответствующий PropertyPage. Или ты имеешь в виду, что необходимо ещё вставить в код моего класа что-то вроде
BEGIN_PROP_MAP(...)
...
END_PROP_MAP()
со ссылкой на интересующий меня проперти пейдж?
Лучший дар, который мы получили от природы и который лишает нас всякого права жаловаться – это возможность сбежать. /М.Монтень/
Здравствуйте Thanatos, Вы писали:
T> --- у кого ты запрашиваеш ISpecifyPropertyPages*? Если pObj — это мой класс, то ISpecifyPropertyPages* у точно нет, поскольку мне как раз надо подключить к нему соответствующий PropertyPage.
Ох, что-то я не пойму что ты хочеш сделать. Я примерно понимаю, но не понимаю твой путь.
Зачем ты ввел переменную m_pFont, как ты думаеш кто с ней у тебя работает, если ты не наследуеш CStockPropImpl. Или ты думаеш что кто-то ее найдет в твоем коклассе, если ты даже [id] свойства определил свой. Во первых как советовал Vi2 измени id твоего св-ва на DISPID_FONT, т.к. вполне вероятно что именно по id property page и ищет font св-во, я так думаю в этом все зарыто.
Здравствуйте Thanatos, Вы писали:
T>Сначала я и пытался использовать MS Stock Font Property Page Object, но потом я узнал (из MSDN и atlctl.h) эту проп.п. можно использовать только для ActiveX-контролов с использованием CStockPropImpl<>. Если создавать ActiveX-контрол, то всё прекрасно — у него есть Font Property Page и она по-нормальному выводится.
T>P.S. Ты писал D>> ISpecifyPropertyPages* pSpecProp; D>> hr = pObj->QueryInterface(__uuidof(ISpecifyPropertyPages), (void**)&pSpecProp); D>> CAUUID pages; D>> hr = pSpecProp->GetPages( &pages );
T> --- у кого ты запрашиваеш ISpecifyPropertyPages*? Если pObj — это мой класс, то ISpecifyPropertyPages* у точно нет, поскольку мне как раз надо подключить к нему соответствующий PropertyPage. Или ты имеешь в виду, что необходимо ещё вставить в код моего класа что-то вроде
T>со ссылкой на интересующий меня проперти пейдж?
Все эти заморочки — CStockPropImpl и ISpecifyPropertyPages нужны для определения количества и GUID-ы Property Page для Property Sheet. Не знаю как общеприянто по-русски их называть.
У тебя их состав уже известен.
Можно посмотреть в сторону реализации IPerPropertyBrowsing для объекта с интерфейсом IPropPage, если уж совсем невмоготу станет. Хотя я и не уверен, не для этого предназначен.
T>Сначала я и пытался использовать MS Stock Font Property Page Object, но потом я узнал (из MSDN и atlctl.h) T>эту проп.п. можно использовать только для ActiveX-контролов с использованием CStockPropImpl<>.
Почему только ActiveX, дай ссылку где об этом пишут.
А почему нельзя это же использовать, но для Simple ATL объекта, попробуй заменить CLSID на этот
{7EBDAAE0-8120-11CF-899F-00AA00688B10}
Vi2>Можно посмотреть в сторону реализации IPerPropertyBrowsing для объекта с интерфейсом IPropPage, если уж совсем невмоготу станет. Хотя я и не уверен, не для этого предназначен.
Не, реализовывать IPerPropertyBrowsing ему точно не надо, этот интерф. нужен уж очень для "красивого" отображения ActiveX в редакторе св-в контейнеров, и без него любой Ax прекрасно будет жить.
Смысл реализации stock и custom font property примерно одинаковый, просто реализация для stock св-ва уже есть, а для custom font property надо делать самому, но в обоих случаях надо использовать MSStockFont, см. в примере.