VC++问题集6

51. 定义一个对话框类,创建时根据其ID创建。
 m_frame.Create(IDD_DIALOGFRAME);
 m_frame.ShowWindow(SW_SHOW);
 m_frame.ShowScrollBar(SB_VERT,false);//不显示滚动条
 m_frame.ShowScrollBar(SB_HORZ,false);
 m_picture.SetParent(&m_frame);//把一个位图控件与这个对话框相连

52.设置滚动信息
 m_frame.GetClientRect(rect); 
  int xpos = m_frame.GetScrollPos(SB_HORZ);
  if (xpos !=0)
   m_frame.ScrollWindow(xpos,0); //恢复窗口的水平滚动区域
  int ypos = m_frame.GetScrollPos(SB_VERT);
  if (ypos !=0)
   m_frame.ScrollWindow(0,ypos); //恢复窗口的垂直滚动区域
  
  SCROLLINFO vinfo; 
  vinfo.cbSize = sizeof(vinfo);
  vinfo.fMask = SIF_ALL;
  vinfo.nPage = bmp.bmHeight/10;
  vinfo.nMax= bmp.bmHeight-rect.Height()+bmp.bmHeight/10;
  vinfo.nMin = 0;
  vinfo.nTrackPos = 0;
  vinfo.nPos = 0; 
  //设置垂直滚动条信息
  m_frame.SetScrollInfo(SB_VERT,&vinfo);

  vinfo.fMask = SIF_ALL;
  vinfo.nPage = bmp.bmWidth/10;
  vinfo.nMax= bmp.bmWidth-rect.Width()+bmp.bmWidth/10;
  vinfo.nMin = 0;
  vinfo.nPos  = 0;
  vinfo.nTrackPos = 0;
  vinfo.cbSize = sizeof(vinfo);
  //设置水平滚动条信息
  m_frame.SetScrollInfo(SB_HORZ,&vinfo);
53.如何实现自定义滚动条
     要实现自定义的滚动条控件,主要有三种方法。一是利用钩子技术重新绘制滚动条,
 该方法实现起来比较复杂。
 二是获得滚动条的显示区域,将其扣除,然后在该区域显示自定义的滚动条控件。
 三是自定义一个滚动条控件,将其与对话框中的某个控件关联,在创建滚动条控件时,
 将对话框中的某个控件隐藏,并在该控件的位置显示滚动条控件。
54.画图时最好先用pDC->SetViewportOrg(100,245);来设置一下坐标原点,不然会默认为最左上角的
 一点为原点。

55.如何实现浮雕效果
 浮雕效果实际上是将图片中每一点像素都进行了处理,首先循环遍历每一点的像素,
 分别取出像素的R、G、B元素值把这些值减去相邻像素的元素值再加上128,
 因为这些元素值的取值在0--255之间,所以计算后超出了255将元素值赋值为255,
 小于0则赋值0.将这3个元素值重新组合赋予原来的像素。

56.如何使鼠标移到窗口前显示沙漏标。
 可以通过调用BeginWaitCursor函数,去除沙漏标可以调用EndWaitCursor函数。

57.如何查找一个目录下的所有文件或文件夹。
 我们来分析下面的代码吧
 CString CBmpView::Search(CString curstr)//传当前路径名
{
 long handle;//用来标识打开的文件
 if(curstr.IsEmpty())//如果传过来的路径名为空
  return "";
 if(_getcwd( buffer, 1000)==NULL)//获取当前工作路径
 {
  AfxMessageBox("没有当前路径,请打开一个图像文件!");
  return "";
 }

 CString m_sPartname;
 int len = curstr.GetLength();
 int i;
 for(i = len-1;curstr[i] != '//';i--)
  m_sPartname.Insert(0,curstr[i]);
 i++;
 while(i--<0)
  buffer[i]=curstr[i];
 if (_chdir(buffer) != 0)//改变当前的工作路径
  return "";
 
 bool b_notfinde=false;//先标识文件没找到
 struct _finddata_t filestruct;//用于存放文件的信息
 // 开始查找工作, 找到当前目录下的第一个实体(文件或子目录),
 // ″*″表示查找任何的文件或子目录, filestruct为查找结果
 handle = _findfirst("*", &filestruct);
 do{
  if((handle ==-1)) // 当handle为-1, 表示当前目录为空, 则结束查找而返回
   break;
  // 检查找到的第一个实体是否是一个目录
  if( ::GetFileAttributes(filestruct.name) & FILE_ATTRIBUTE_DIRECTORY )
  {
   continue ;
  }
  CString Filename=filestruct.name;
  {
   CString tailstr;
   //获取文件扩展名
   tailstr = Filename.Mid(Filename.GetLength()-3);
   tailstr.MakeUpper();
   Filename.MakeUpper();
   m_sPartname.MakeUpper();
   if(tailstr=="BMP")
   {
    if(b_notfinde==false)
    {
     if(m_sPartname==Filename)//标识为找到了,
       //进入下一次循环找下一个文件。
      b_notfinde=true;
    }
    else
    {
     _findclose(handle);
     return Filename;
    }  
   }         
  }    
 } while(_findnext(handle, &filestruct)==0);
 _findclose(handle);
 this->KillTimer(1);
 AfxMessageBox("已经到达最后一个图像文件!"); 
 return "";
}

58.滚动条的使用的示例代码
 void CBmpDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
 int pos,min,max,thumbwidth;

 SCROLLINFO vinfo;
 GetScrollInfo(SB_HORZ,&vinfo);

 pos = vinfo.nPos;
 min = vinfo.nMin;
 max = vinfo.nMax;
 thumbwidth = vinfo.nPage;

 switch (nSBCode)
 {

 break;
 case SB_THUMBTRACK: //拖动滚动块
  ScrollWindow(-(nPos-pos),0);
  SetScrollPos(SB_HORZ,nPos);

 break;

 case SB_LINELEFT : //单击左箭头
  SetScrollPos(SB_HORZ,pos-1);
  if (pos !=0)
   ScrollWindow(1,0);
 break;

 case SB_LINERIGHT: //单击右箭头
  SetScrollPos(SB_HORZ,pos+1);
  if (pos+thumbwidth <max)
   ScrollWindow(-1,0); 
 break;

 case SB_PAGELEFT: //在滚动块的左方空白滚动区域单击,增量为6

  SetScrollPos(SB_HORZ,pos-6);
  if (pos+thumbwidth >0)
   ScrollWindow(6,0);
 break;

 case SB_PAGERIGHT: //在滚动块的右方空白滚动区域单击,增量为6

  SetScrollPos(SB_HORZ,pos+6);
  if (pos+thumbwidth <max)
   ScrollWindow(-6,0);
 break;

 }
 CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}

59.放大和缩小图片
 可以使用StretchBlt,StretchBlt函数可以根据设置的比例大小重画图片。
60.如何获取位图大小?
 获取位图大小,最简单的方法就是使用Picture空间,当Picture空间加载图像时,
 会自动调整空间的大小,其大小就是图像的大小。
 例如:
  m_image.SetBitmap(m_hbitmap)//m_hbitmap是位图句柄
  CRect m_bitrect;
  m_image.GetWindowRect(m_bitrect);
 还可以通过Cbitmap累的GetObject方法获取位图大小。
 例如:
  CBitmap bitmap;
  BITMAPINFO bInfo;
  bitmap.Attach(m_hbitmap);
  bitmap.GetObject(sizeof(bInfo),&bInfo);
  int x=bInfo.bmiHeader.biWidth;
  int y=bInfo.bmiHeader.biHeight;

你可能感兴趣的:(工作,struct,search,buffer,扩展,vc++)