科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件用Visual C++增强Notes打印功能

用Visual C++增强Notes打印功能

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

Lotus公司推出的Lotus Domino/Notes作为办公自动化系统的平台近年来在国内得到了广泛的应用

作者:邹龙泉 来源:yesky 2007年11月16日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
四 例程

  下面的程序段定义了一个带有默认值公式的名为"TextField"的域:

  char TextFieldName[] = "TextField";
  char TextDescription[] = "This is a Simple Text Field";
  char TextDefValFormula[] = "\"Default\"";
  char far *pBufferStart, far *pBuffer;
  HANDLE hMem;
  CDPABREFERENCE CDPabRef;
  CDPARAGRAPH CDPara;
  CDBEGINRECORD CDBegin;
  CDENDRECORD CDEnd;
  CDEXT2FIELD CDExt2Field;
  CDFIELD CDField;
  FONTIDFIELDS *pFontFields;

// 申请内存并锁定内存,获得指向该块内存的指针
  OSMemAlloc (0, wCDBufferLength, &hMem);
  pBufferStart = (char far *)OSLockObject(hMem);
  memset( pBufferStart, 0, (size_t) wCDBufferLength );
  pBuffer = pBufferStart;

// 填写 PARAGRAPH 结构
  // 结构体的长度
  CDPara.Header.Length = (BYTE) ODSLength(_CDPARAGRAPH);
  // 结构体的类型
  CDPara.Header.Signature = (BYTE)SIG_CD_PARAGRAPH;
  // 转换为Domino规范的形式写入申请的内存
  ODSWriteMemory( (void far * far *)&pBuffer, _CDPARAGRAPH, &CDPara, 1 );

// 填写 PABREF 结构
  CDPabRef.Header.Signature = (BYTE)SIG_CD_PABREFERENCE;
  CDPabRef.Header.Length = (BYTE) ODSLength(_CDPABREFERENCE);
  // 要引用的段定义的序号
  CDPabRef.PABID = wPabDefNumber;
  ODSWriteMemory( (void far * far *)&pBuffer, _CDPABREFERENCE, &CDPabRef, 1 );

// 填写CDBEGINRECORD 结构
  CDBegin.Header.Length = (BYTE)ODSLength(_CDBEGINRECORD);
  CDBegin.Header.Signature = SIG_CD_BEGIN;
  CDBegin.Version = 0;
  CDBegin.Signature = SIG_CD_FIELD;
  ODSWriteMemory( (void far * far *)&pBuffer, _CDBEGINRECORD,(void far *) &CDBegin, 1 );

// 填写CDEXT2FIELD 结构
  memset(&CDExt2Field, 0, sizeof(CDEXT2FIELD));
  CDExt2Field.Header.Length = (WORD)ODSLength(_CDEXT2FIELD);
  CDExt2Field.Header.Signature = SIG_CD_EXT2_FIELD;
  ODSWriteMemory( (void far * far *)&pBuffer, _CDEXT2FIELD, (void far *) &CDExt2Field, 1 );

// 填写CDFIELD 结构,定义文本域
  CDField.Header.Signature = SIG_CD_FIELD;
  CDField.Flags = FEDITABLE;
  CDField.DataType = TYPE_TEXT;
  CDField.ListDelim = LDDELIM_SEMICOLON;

  // 本域中不用数值格式参数,全部清零
  CDField.NumberFormat.Digits = 0;
  CDField.NumberFormat.Format = 0;
  CDField.NumberFormat.Attributes = 0;
  CDField.NumberFormat.Unused = 0;

  file://本域中不用时间格式参数,全部清零
  CDField.TimeFormat.Date = 0;
  CDField.TimeFormat.Time = 0;
  CDField.TimeFormat.Zone = 0;
  CDField.TimeFormat.Structure = 0;

  // 设定FontID
  pFontFields = (FONTIDFIELDS *)&CDField.FontID;
  pFontFields->Face = FONT_FACE_ROMAN;
  pFontFields->Attrib = 0;
  pFontFields->Color = NOTES_COLOR_BLACK;
  pFontFields->PointSize = 14;

  // 编译默认值公式
  NSFFormulaCompile(NULL, 0, TextDefValFormula, (WORD) strlen(TextDefValFormula), &hTextDefValFormula, &wTextDefValFormulaLen, &wdc, &wdc, &wdc, &wdc, &wdc))

  // 填写CDFIELD 结构的其余部分,因为DVLength值只有公式编译后才知道
  CDField.DVLength = wTextDefValFormulaLen;
  CDField.ITLength = 0;
  CDField.TabOrder = 0;
  CDField.IVLength = 0;
  CDField.NameLength = strlen(TextFieldName);
  CDField.DescLength = strlen(TextDescription);
  CDField.TextValueLength = 0;
  CDField.Header.Length = ODSLength(_CDFIELD) +CDField.DVLength +CDField.ITLength +CDField.IVLength +CDField.NameLength +CDField.DescLength +CDField.TextValueLength;

  // 保证CDFIELD域长度为偶数
  if (CDField.Header.Length % 2)
    CDField.Header.Length++;
  ODSWriteMemory( (void far * far *)&pBuffer, _CDFIELD, (void far *)&CDField, 1 );

  // 获取指向编译后公式的指针
  pTextDefValFormula = OSLock( char, hTextDefValFormula );
  // 写入公式内容到内存
  memcpy( pBuffer, pTextDefValFormula, wTextDefValFormulaLen );
  pBuffer += CDField.DVLength;
  // 解锁并释放公式占用的空间
  OSUnlockObject(hTextDefValFormula);
  OSMemFree(hTextDefValFormula);

  // 域名部分,直接写入
  memcpy( pBuffer, TextFieldName, CDField.NameLength );
  pBuffer += CDField.NameLength;

  // 域描述部分,直接写入
  memcpy( pBuffer, TextDescription, CDField.DescLength );
  pBuffer += CDField.DescLength;

  // 保证整个域定义的长度为偶数
  if ((pBuffer-pBufferStart) %2)
    pBuffer++;

// 填写CDENDRECORD结构
  CDEnd.Header.Length = (BYTE)ODSLength(_CDENDRECORD);
  CDEnd.Header.Signature = SIG_CD_END;
  CDEnd.Version = 0;
  CDEnd.Signature = SIG_CD_FIELD;
  ODSWriteMemory( (void far * far *)&pBuffer, _CDENDRECORD, (void far *) &CDEnd, 1 );

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章