VC++问题集12

来源:互联网 发布:log4j配置输出sql语句 编辑:程序博客网 时间:2024/05/06 02:44

121.增加属性页的方法有:
 (1) 用CTabCtrl类中的InsertItem方法。
 (2)
 CPropertySheet sheet("属性页对话框");
 CPage1 page1;//CPage1为CPropertyPage派生出来的类
 CPage2 page2;//CPage2为CPropertyPage派生出来的类
 sheet.AddPage(&page1);
 sheet.AddPage(&page2);
 sheet.DoModal();

122.在程序中操作Excel表格和Word文档
 在程序中操作Excel表格,需要启动Excel应用程序,然后获得当前激活的工作簿管理对象(Workbooks),通过工作簿管理对象添加
 工作簿对象(_Workbook),激活工作表管理对象(Worksheets),通过工作簿对象添加工作表对象(_Wordsheet),通过工作表对象获
 得选区(Range),利用选区取得工作表的行列信息,并编辑单元格.

 在程序中操作Word文档,需要先在程序中启动Word应用程序,然后获得Word文档管理对象(Documents),通过文档管理对象添加
 文档对象(_Document),由文档对象获得选区(Range),再通过选区向文档中添加表格(Tables),最后通过(Selection)移动光标
 位置并向表格中插入数据.

123.DEVMODE 结构体包含了有关打印机初始化和环境变量的信息。其定义如下:
 typedef struct _devicemode {    // dvmd
     BCHAR  dmDeviceName[CCHDEVICENAME];
     WORD   dmSpecVersion;
     WORD   dmDriverVersion;
     WORD   dmSize;  
     WORD   dmDriverExtra;
     DWORD  dmFields;
     union {
       struct {
         short dmOrientation;
         short dmPaperSize;
         short dmPaperLength;
         short dmPaperWidth;
       };
       POINTL dmPosition;
     };
     short  dmScale;
     short  dmCopies;
     short  dmDefaultSource;
     short  dmPrintQuality;
     short  dmColor;
     short  dmDuplex;
     short  dmYResolution;
     short  dmTTOption;
     short  dmCollate;
     BCHAR  dmFormName[CCHFORMNAME];
     WORD  dmLogPixels;
     DWORD  dmBitsPerPel;
     DWORD  dmPelsWidth;
     DWORD  dmPelsHeight;
     DWORD  dmDisplayFlags;
     DWORD  dmDisplayFrequency;
 #if(WINVER >= 0x0400)
     DWORD  dmICMMethod;
     DWORD  dmICMIntent;
     DWORD  dmMediaType;
     DWORD  dmDitherType;
     DWORD  dmReserved1;
     DWORD  dmReserved2;
 #if (WINVER >= 0x0500) || (_WIN32_WINNT >= 0x0400)
     DWORD  dmPanningWidth;
     DWORD  dmPanningHeight;
 #endif
 #endif /* WINVER >= 0x0400 */
 } DEVMODE;
 
124.实现记录用户浏览过网站的网址。
 要实现此功能需要使用到SHDocVw组建和MSHTML组建。SHDocVw组建中的IWebBrowser2Ptr指针
 主要对应这IE浏览器,MSHTML组建中的IHTMLDocument2Ptr指针主要对应着浏览器所浏览的内容。
 我们主要通过SHDocVw组建的IShellWindowsPtr指针的GetCount方法获得浏览器的个数,再将
 IShellWindowsPtr指针的Item对象付给IWebBrowser2Ptr,然后通过IWebBrowser2Ptr指针的
 GetDocument方法获得ihtmldocument2ptr指针对象,最后通过IHTMLdocument2ptr指针对象的
 Geturl方法获得浏览器地址栏的内容。

125.在一个网段内,如果网卡被设置为混合模式,当网络中有数据传输事,无论数据是否属于本机,网卡
 都会接收到该数据报。在网络中数据是以帧的形式传输的。以TCP为例,当用户发送数据时,
 在传输层,用户数据的前端会附上TCP首部,TCP首部包括源端口号、目的端口号、位序号、
 确认序号登信息。在网络层会附上IP首部,IP首部包括数据报的源地址和目标地址登信息,
 在链路层附加地址解析协议和逆向地址解析协议,用于转换IP层和网络接口层使用的地址。
 为了获得网络中传输的数据,首先需要创建一个原始套接字,该套接字获得的数据是IP层
 的数据报,包含IP首部、TCP或UDP首部、用户数据等信息,然后对获得的数据报去除IP首部,
 根据IP首部获得数据报的源地址、目标地址、采用的协议及数据报的长度等信息,接着根据
 不同的协议去除TCP或UDP首部,根据TCP或UDP首部确定源端口号和目的端口号,最后数据报
 剩余的部分既是用户数据。
 //定义Ip数据报头结构,20个字节
 typedef HeadIP {
  unsigned char headerlen:4;//首部长度,占4位
  unsigned char version:4;//版本,占4位
  unsigned char servertype;//服务类型,占8位,即一个字节
  unsigned short totallen;//总长度,占16位
  unsigned short id;//与idoff构成标识,用占16位,前3位是标识,后13位是片偏移
  unsigned short idoff;
  unsigned char ttl;//生存时间,占8位
  unsigned char proto;//协议,占8位
  unsigned short checksum;//首部检验和,占16位
  unsigned int sourceIP;//源IP地址,占32位
  unsigned int destIP;//目的的IP地址,占32位
 }HEADIP;
 //定义TCP数据报首部
 typedef struct HeadTCP {
  WORD   SourcePort;    //16位源端口号
  WORD   DePort;        //16位目的端口
  DWORD  SequenceNo;    //32位序号
  DWORD  ConfirmNo;     //32位确认序号
  BYTE   HeadLen;       //与Flag为一个组成部分, 首部长度,
          //占4位,保留6位,6位标识,共16位  
  BYTE   Flag;
  WORD   WndSize;       //16位窗口大小
  WORD   CheckSum;      //16位校验和
  WORD   UrgPtr;        //16位紧急指针
 } HEADTCP;
 //定义UDP数据报首部
 typedef struct HeadUDP {
  WORD SourcePort;  //16位源端口号
  WORD DePort;      //16位目的端口
  WORD Len;         //16为UDP长度
  WORD ChkSum;      //16位UDP校验和
 } HEADUDP;
 
 //定义ICMP数据报首部
 typedef struct HeadICMP {
  BYTE Type;    //8位类型
  BYTE Code;    //8位代码
  WORD ChkSum;  //16位校验和
 } HEADICMP;

126.如何用程序查看一个数据库文件中有几个表?
 ADO 中Connection对象的OpenSchema方法可以从提供者获取数据库纲要信息,如数据库,
 数据表字段类型等。
 语法如下:
 _RecordsetPtr OpenSchema(enmu SchemaEumn Schema,
    const _variant_t &Restrictioins=vtMissing,     const _variant_t &SchemaID=vtMissing);
 返回值包含纲要信息的Recordset对象。Recordset将以只读、静态游标打开。
 参数说明:
 Schema:所要运行纲要的查询类型。
 Restrictions: 默认变量,每个Schema选项的查询限制条件数组
 SchemaID:由于OLE DB规范没有定义提供者纲要查询的GUID,如果Schema设置为 adschemaproviderspecific,则需要该参数,否则不使用它。
 如下示例代码:
 CString strname,strTable;
 strname.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Persist     Security Info=False",strText);
 try
 {
  m_pConnection.CreateInstance("ADODB.Connection");
  _bstr_t strConnect=strname;
  m_pConnection->Open(strConnect,"","",adModeUnknown);
 }
 catch(_com_error e)
 {
  AfxMessageBox(e.Description());
 }
 m_pRecordset = m_pConnection->OpenSchema(adSchemaTables);
 while(!m_pRecordset->adoEOF)
 {
  strTable = (char*)(_bstr_t)m_pRecordset->GetFields()->GetItem    ("TABLE_TYPE")->Value;
  if(strTable == "TABLE")
  {
m_List.AddString((char*)(_bstr_t)m_pRecordset->GetFields()->GetItem("TABLE_NAME")->Value);
  }
  m_pRecordset->MoveNext();
 }
 
127.CDC类中的StartDoc("print")中的参数代表了什么,与StartDoc("printinformation")有什么区别?

128.CDC中StretchBlt方法和BitBlt方法的区别:
 在Windows系统中,打印机的输出与屏幕的显示都是通过设备上下文CDC实现的。CDC提供了StretchBlt和BitBlt方法用于绘制位图。在涉及到图像打印时,一定要使用StretchBlt方法,因为该方法会根据源设备区域和目标设备区域的不同自动调整绘图的比率。二打印机的分别分辨率与屏幕的分辨率通常是不同的。


129.Windows的消息机制允许程序间通过使用PostMessage、SendMessage之类的函数进行相互通信,程序间
 可以通过WM_USER常量加上一个值创建一个消息标识,然后使用这个消息标识进行相互通信。如果其他程序与发送程序定义了相同的消息标识,可能会产生预想不到的结果,基于这个原因,用户最好用RegisterWindowMessage函数注册一个唯一的消息标识,用于进程间的通信。
实现进程间的通信首先需要的敬意或注册消息,然后发送消息,最后有接收端接收并处理消息。

130.实现进程间的通信可以有多种方法:
 方法一:通过发送消息的方式,用全局函数PostMessage(....)
 方法二:利用内存映射的方式实现。