Font Property Page
От: Thanatos Украина  
Дата: 25.07.02 16:47
Оценка:
Народ!!! Как коректно работать со стандартными property page-ами? При попытке вывести на екран при помощи OleCreatePropertyFrame(...) property page для font-а из библиотеки mfc42.dll property page не инициализируется, т.е. список шрифтов, установленых в системе пустой и т.д.

Помогите, please!!!
Лучший дар, который мы получили от природы и который лишает нас всякого права жаловаться – это возможность сбежать. /М.Монтень/
Re: Font Property Page
От: Dima2  
Дата: 26.07.02 06:31
Оценка:
Здравствуйте Thanatos, Вы писали:

T>Народ!!! Как коректно работать со стандартными property page-ами? При попытке вывести на екран при помощи OleCreatePropertyFrame(...) property page для font-а из библиотеки mfc42.dll property page не инициализируется, т.е. список шрифтов, установленых в системе пустой и т.д.


T>Помогите, please!!!


Покажи как ты вызываеш OleCreatePropertyFrame, что передаеш в IUnknown* и CLSID.
Re[2]: Font Property Page
От: Thanatos Украина  
Дата: 26.07.02 12:23
Оценка:
Здравствуйте 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;

hr = pObj.CreateInstance("MBProp.PropPage");
hr = pObj->QueryInterface(__uuidof(IUnknown), (void**)&pUnk);
hr = CLSIDFromString(L"{0BE35200-8F91-11CE-9DE3-00AA004BB851}", &cls);

hr = OleCreatePropertyFrame(::GetActiveWindow(), 0, 0, L"ABCD", 1, &pUnk, 1, &cls , NULL, 0, 0);

где 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, т.е. нельзя ничего выбрать, не загружены стандартные шрифты (список шрифтов пустой),...

Заранее спасибо за ответ.
Лучший дар, который мы получили от природы и который лишает нас всякого права жаловаться – это возможность сбежать. /М.Монтень/
Re[3]: Font Property Page
От: Dima2  
Дата: 26.07.02 12:41
Оценка:
Здравствуйте Thanatos, Вы писали:

T>За вызов отвечает следующий фрагмент кода:


Подожди в массив IUnknown ты должен передать не IUnknown твоей страницы св-в, а IUnknown твоего объекта, который поддерживает данную страницу св-в. Или я чего не правильно понял.
Re[4]: Font Property Page
От: Thanatos Украина  
Дата: 26.07.02 12:52
Оценка:
Да, верно. Только тебя, наверное ввело в заблуждение название объекта. На самом деле СPropPage — это ничего не делающий объект, с переменной Font, которую мне и нужно задать при помощи Property Page.

Описание IPropPage и CPropPage такое:

[
object,
uuid("577DC64D-537D-44B7-BB29-3CAE075B48B3"),
dual, helpstring("IPropPage Interface"),
pointer_default(unique)
]
__interface IPropPage : IDispatch
{
[propget, id(1), helpstring("property Font")] HRESULT Font([out, retval] IFontDisp** pVal);
[propput, id(1), helpstring("property Font")] HRESULT Font([in] IFontDisp* newVal);
};

[
coclass,
threading("apartment"),
vi_progid("MBProp.PropPage"),
progid("MBProp.PropPage.1"),
version(1.0),
uuid("291954A5-3E6A-4EDD-8115-C1EFA64CD837"),
helpstring("PropPage Class")
]
class ATL_NO_VTABLE CPropPage :
public IPropPage
.......
Лучший дар, который мы получили от природы и который лишает нас всякого права жаловаться – это возможность сбежать. /М.Монтень/
Re[5]: Font Property Page
От: Vi2 Удмуртия http://www.adem.ru
Дата: 26.07.02 13:21
Оценка:
Здравствуйте Thanatos, Вы писали:

T> [propget, id(1), helpstring("property Font")] HRESULT Font([out, retval] IFontDisp** pVal);

T> [propput, id(1), helpstring("property Font")] HRESULT Font([in] IFontDisp* newVal);

Насколько я помню, для фонта есть специальное значение DISPID_FONT, по которому оно запрашивается. Или это не так в C#?
#define DISPID_FONT                     (-512)
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[5]: Font Property Page
От: Dima2  
Дата: 26.07.02 13:22
Оценка:
Здравствуйте Thanatos, Вы писали:

Понятно, я тут поковырялся и во что выяснилось.

Тебе надо вот использовать вот эту библ.
MS Stock Font Property Page Object
C:\WINNT\System32\msstkprp.dll


А ты пытаешся использовать вот эту
Font Property Page
C:\WINNT\System32\MFC42.DLL



Самый простой способ выяснить это, выполнить вот этот код
    ISpecifyPropertyPages* pSpecProp;
    hr = pObj->QueryInterface(__uuidof(ISpecifyPropertyPages), (void**)&pSpecProp); 
    CAUUID pages;
    hr = pSpecProp->GetPages( &pages );



И если передать вот этот CLSID, то все будет Ok.
    //hr = CLSIDFromString(L"{0BE35200-8F91-11CE-9DE3-00AA004BB851}", &clsid); 
    clsid = *(pages.pElems);
Re[6]: Font Property Page
От: Dima2  
Дата: 26.07.02 13:25
Оценка:
Здравствуйте Vi2, Вы писали:

Vi2>Насколько я помню, для фонта есть специальное значение DISPID_FONT, по которому оно запрашивается. Или это не так в C#?


А с чего ты взял что это шарп?
Re[6]: Font Property Page
От: Thanatos Украина  
Дата: 28.07.02 11:05
Оценка:
Здравствуйте Dima2, Вы писали:

D>Здравствуйте Thanatos, Вы писали:


D>Понятно, я тут поковырялся и во что выяснилось.


D>Тебе надо вот использовать вот эту библ.

D>
D>MS Stock Font Property Page Object
D>C:\WINNT\System32\msstkprp.dll
D>


D>А ты пытаешся использовать вот эту

D>
D>Font Property Page
D>C:\WINNT\System32\MFC42.DLL
D>



D>Самый простой способ выяснить это, выполнить вот этот код

D>
D>    ISpecifyPropertyPages* pSpecProp;
D>    hr = pObj->QueryInterface(__uuidof(ISpecifyPropertyPages), (void**)&pSpecProp); 
D>    CAUUID pages;
D>    hr = pSpecProp->GetPages( &pages );
D>



D>И если передать вот этот CLSID, то все будет Ok.

D>
D>    //hr = CLSIDFromString(L"{0BE35200-8F91-11CE-9DE3-00AA004BB851}", &clsid); 
D>    clsid = *(pages.pElems);
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()

со ссылкой на интересующий меня проперти пейдж?
Лучший дар, который мы получили от природы и который лишает нас всякого права жаловаться – это возможность сбежать. /М.Монтень/
Re[7]: Font Property Page
От: Dima2  
Дата: 29.07.02 07:49
Оценка:
Здравствуйте Thanatos, Вы писали:

T> --- у кого ты запрашиваеш ISpecifyPropertyPages*? Если pObj — это мой класс, то ISpecifyPropertyPages* у точно нет, поскольку мне как раз надо подключить к нему соответствующий PropertyPage.


Ох, что-то я не пойму что ты хочеш сделать. Я примерно понимаю, но не понимаю твой путь.
Зачем ты ввел переменную m_pFont, как ты думаеш кто с ней у тебя работает, если ты не наследуеш CStockPropImpl. Или ты думаеш что кто-то ее найдет в твоем коклассе, если ты даже [id] свойства определил свой. Во первых как советовал Vi2 измени id твоего св-ва на DISPID_FONT, т.к. вполне вероятно что именно по id property page и ищет font св-во, я так думаю в этом все зарыто.
Re[7]: Font Property Page
От: Vi2 Удмуртия http://www.adem.ru
Дата: 29.07.02 08:22
Оценка:
Здравствуйте 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, если уж совсем невмоготу станет. Хотя я и не уверен, не для этого предназначен.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[8]: Font Property Page
От: Dima2  
Дата: 29.07.02 08:40
Оценка:
Здравствуйте Vi2, Вы писали:


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 прекрасно будет жить.
Re[7]: Font Property Page
От: Dima2  
Дата: 29.07.02 09:17
Оценка:
Здравствуйте Thanatos, Вы писали:


Глянь вот эти статьи:

Using Fonts in ATL Controls with NiceText.exe

MFC ActiveX Controls: Using Fonts

Смысл реализации stock и custom font property примерно одинаковый, просто реализация для stock св-ва уже есть, а для custom font property надо делать самому, но в обоих случаях надо использовать MSStockFont, см. в примере.

      PROP_ENTRY("Font", DISPID_FONT, CLSID_MSStockFont)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.