VC++问题集15

151:编译错误:initialization of 'text' is skipped by 'case' label
代码:switch(m_mode){
 case 0:
  ....
  CString str;
  CString text;
  ....
  break;
 case 1:
  ....
  text="ad";
  ....
  break;
 }
原因:运行swtich中的case 1:时忽略了case 0:中初始化string strv,和text。所以出错。
解决办法:把CString str;CString text;定义为全局变量。

152:如何用Release版本编译:
点击"组件"---"配置"---"添加"--"Release",把Debug版本删除即可。

153.基于对话框的应用程序执行顺序:
 先执行全局变量theApp,从C**App对象中的InitInstance()函数进入对话框。
 所以在对话框中要用到的初始化必须在InitInstance()函数的开头部分写。

154.如何获得毫秒时间:
 调用函数GetTickCount();retrieves the number of milliseconds that have elapsed since Windows CE was started.

155.关于设置CRgn的问题:
 举个例子,有5个HRGN hRgn[5];(已经创建好)用定时器每隔一段时间就SetWindowRgn(hRgn[++i%5])一下,会发现第一轮的时候,5个都正 常,但是当第二轮的时候,SetWindowRgn(hRgn[++i%5]);的调用全都失败。
分析原因:
 msdn中解释,第一次SetWindowRgn(hRgn)时,hRgn就由系统来管理了,hRgn之后不能在用于其他任何函数。
 The operating system does not make a copy of the region, so do not make any further function calls with this region   handle, and do not close this region handle 的意识是说,你用过了HRGN之后,它就没有意义了,你的HRGN已经不是你最初创建 的HRGN了,你需要重新创建HRGN。
解决办法:
 每调用一次,当第二次调用时要把前次调用的删了重新创建。
测试代码为:
 CTestDlg里声明了
 CRgn m_Rgn[6];

 构造函数里创建对象:
 m_Rgn[0].CreateEllipticRgn(0,0,100,100);
 m_Rgn[1].CreateEllipticRgn(0,0,200,200);
 m_Rgn[2].CreateEllipticRgn(50,50,100,100);
 m_Rgn[3].CreateEllipticRgn(0,0,300,300);
 m_Rgn[4].CreateEllipticRgn(100,100,500,500);
 m_Rgn[5].CreateEllipticRgn(300,300,500,500);


 在InitalDialog里设置一个定时器:

 SetTimer(1,500,NULL);
 定时器处理函数
 void CTestDlg::OnTimer(UINT nIDEvent)
 {
 // TODO: Add your message handler code here and/or call default
 int rz = SetWindowRgn(m_Rgn[m_iIndex],TRUE);
 if (rz==0)//等于0 说明所以的对象已经设置了一遍
 {
                 //和原来的对象解除关系
 for (int i=0;i <6;i++)
 {
 m_Rgn[i].Detach();
 }
                 //重新创建
 m_Rgn[0].CreateEllipticRgn(0,0,100,100);
 m_Rgn[1].CreateEllipticRgn(0,0,200,200);
 m_Rgn[2].CreateEllipticRgn(50,50,100,100);
 m_Rgn[3].CreateEllipticRgn(0,0,300,300);
 m_Rgn[4].CreateEllipticRgn(100,100,500,500);
 m_Rgn[5].CreateEllipticRgn(300,300,500,500);
 }
 
 m_iIndex++;
 m_iIndex %= 5;

 CDialog::OnTimer(nIDEvent);
 }
对测试代码的分析:
 以上的测试代码可以成功,但是绝对有GDI句柄的不断增加Bug。
 在Timer中应该这样写:
 .............
 HRGN hRgn = CreateRectRgn(0,0,0,0);    //创建一个空的RGN
  ::GetWindowRgn(hwnd, hRgn);              //获取原先的Windows RGN
  ::SetWindowRgn(hwnd, NULL);              //将窗口区域清空
  ::DeleteObject(hRgn);                  //释放原先的RGN
  ::SetWindowRgn(hRgn[++i%5]);             //应该木问题老
    .............

156.如何得到任务栏窗口(原问题:如何得到任务栏高度)
 要得到任务栏的窗口可以通过FindWindow函数。
 HWND   hWnd   =   FindWindow("Shell_TrayWnd",   0);  这样就得到了任务栏的窗口指针。
 RECT   Rect;  
 if   (GetWindowRect(hWnd,   &Rect))    
   {  
          //Rect.bottom-Rect.top   就是任务栏的高度。  
   }

157.GDI: graphics device interface

158.数据库中的表名最好不能命名为:user(Access数据库)

159.关于CTabCtrl::GetItem的问题:
 TCITEM tcItem;
 int m_CurS=m_TabCtrlMessage.GetCurSel();
 tcItem.mask=TCIF_TEXT;  
 m_TabCtrlMessage.GetItem(m_CurS,&tcItem);// (m_TabCtrlMessage为CTabCtrl控件)

 CString szID=tcItem.pszText; //出现异常
 AfxMessageBox(szID);
问题所在:
 tcItem.pszText为无用指针。
代码应写成:
 TCITEM      tcItem; 
 int      m_CurS=m_TabCtrlMessage.GetCurSel(); 
 tcItem.mask=TCIF_TEXT;
 char  buf[200]={0}; 
 tcItem.pszText=buf;//把pszText这个结构体成员用一个指向申请好的一块内存区域的指针赋值  
 tcItem.cchTextMax=20; //指定要获取多长的字符串 
 m_TabCtrlMessage.GetItem(m_CurS,&tcItem); 
 AfxMessageBox(buf);
160.在类中定义的静态变量在链接时出现连接错误,如:
A.h文件
 class A {
  public :
     static *B b;
 }
 B=new B();
对B的赋值应该放在A.cpp文件中。

你可能感兴趣的:(VC++问题集15)