font.txt
上传用户:yangzi5763
上传日期:2007-01-02
资源大小:239k
文件大小:4k
源码类别:

ActiveX/DCOM/ATL

开发平台:

Visual C++

  1. xPropertiesWnd - Font picker, update version.
  2.  xPropertiesWnd ActiveX Control has now a new feature: font property. You can set one or more properties to be font property, either in design mode by chosing Font item from subfolder Type, or at runtime with:
  3.   InsertProperty function, pass as type the string _T("Font"). Too, the font property has a color for , color font. This type is
  4.   in fact a buttom, witch open a CFontDialog, for chosing a system font and a color for this.
  5.   To set a default value, you can call SetValue function. As last parameter, function requires
  6.   a variant member. If this variant is numeric type, like integer, long, the SetValue will set
  7.   the color for font property. If the variant type is a font interface (property Font in VB,
  8.   or IFont* in VC) the function SetValue will set the new font for one font property. 
  9.   If you want to retrieve value of a font property , you have to call GetValue function with
  10.   last parameter 0.(nColumn = 0). This will return a IFont*. If you want to retrieve the colour just call the same function
  11.   with last parameter 1. (nColumn = 1). In that case, the function will return a unsigned long, witch represents the colour of 
  12.   font property. 
  13.   VB sample code.
  14.    xProp.SetValue(0,0, Me.Font, 0), where xProp is a XPropertiesWnd ActiveX Control,
  15.    In first page (0), at first item you have a font property. This function will set as default
  16.    value font property to be the form font.
  17.    xProp.SetValue(0,0,255,0), will set the color of font to be red.
  18.   VC++ sample code:
  19.    In C++ you need two functions (CreateOleFont, CreateFontDisp) for conversion IFont* throw CFont* and reverse.
  20.    
  21.    Using SetValue for a font property into VC++
  22.  
  23.    VARIANT v;
  24.    v.vt = VT_DISPATCH;
  25.    v.pdispVal = CreateOleFont(pFont) // see below
  26.    xProp.SetValue(0,0,v,0)
  27.   
  28.    , where pFont is a pointer to a CFont. With this snnipet, you choose for the first 
  29.    font property (0,0), font pFont 
  30.    Using GetValue for a font property into VC++
  31. static CFont font;
  32. font.DeleteObject();
  33. VERIFY(CreateFontDisp(xProp.GetValue(0,0,0).pdispVal, font)); // see below
  34. , in font you will have a copy of selected font from (0,0) property.
  35.  Another changes into controls:
  36.   SetValue - for color picker: this function will set the new selected color, if the variant paramember is 
  37.   one of numeric type, else this function will work like SetDefaultValue.
  38.   GetValue - the same.
  39. #include <atlconv.h>
  40. // Function name : CreateOleFont
  41. // Description     : Create a IFontDisp interface for font pFont. 
  42. // Return type : IDispatch* 
  43. // Argument         : CFont* pFont
  44. IDispatch* CreateOleFont(CFont* pFont)
  45. {
  46. IDispatch* pDispatch = NULL;
  47. USES_CONVERSION;
  48. if (pFont)
  49. {
  50. LOGFONT logfont;
  51. if (pFont->GetLogFont(&logfont))
  52. {
  53. LOGFONT* pLogFont = &logfont;
  54. FONTDESC fd;
  55. fd.cbSizeofstruct = sizeof(FONTDESC);
  56. fd.lpstrName = T2OLE(pLogFont->lfFaceName);
  57. fd.sWeight = (short)pLogFont->lfWeight;
  58. fd.sCharset = pLogFont->lfCharSet;
  59. fd.fItalic = pLogFont->lfItalic;
  60. fd.fUnderline = pLogFont->lfUnderline;
  61. fd.fStrikethrough = pLogFont->lfStrikeOut;
  62. long lfHeight = pLogFont->lfHeight;
  63. if (lfHeight < 0)
  64. lfHeight = -lfHeight;
  65. fd.cySize.Lo = lfHeight * 720000 / 96;
  66. fd.cySize.Hi = 0;
  67. if (FAILED(::OleCreateFontIndirect(&fd, IID_IFontDisp, (void**)&pDispatch)))
  68. pDispatch = NULL;
  69. }
  70. }
  71. return pDispatch;
  72. }
  73. // Function name : CreateFontDisp
  74. // Description     : Create a font from a IFont interface
  75. // Return type : BOOL 
  76. // Argument         : IDispatch* pDispatchFont
  77. // Argument         : CFont& font
  78. BOOL CreateFontDisp(IDispatch* pDispatchFont, CFont& font)
  79. {
  80. HFONT hFont = NULL;
  81. TRY
  82. {
  83. IFont* pIFont = (IFont*)pDispatchFont;
  84. if (!FAILED(pIFont->get_hFont(&hFont)))
  85. {
  86. LOGFONT logFont;
  87. CFont::FromHandle(hFont)->GetLogFont(&logFont);
  88. return font.CreateFontIndirect(&logFont);
  89. }
  90. }
  91. CATCH_ALL(e)
  92. {
  93. e->Delete();
  94. }
  95. END_CATCH_ALL;
  96. return FALSE;
  97. }