VC++问题集7

61.图片反色处理。
·要实现图像的反色处理可以有多种实现方法。例如可以获取图片中每个像素点的颜色值,
 然后对颜色值进行取反。如下代码:
 CDC* pDC = m_image.GetDC();
 CRect m_rect;
 m_image.GetClientRect(m_rect);
 BYTE r,g,b;
 for (int i=1; i<]m_rect.Width();i++)
  for (int j=1;j<m_rect.Height();j++)
  {
   COLORREF clr= pDC->GetPixel(i,j);
   r = GetRValue(clr);
   g = GetGValue(clr);
   b = GetBValue(clr);
   
   r = abs(255-r);
   g = abs(255-g);
   b = abs(255-b);
   pDC->SetPixel(i,j,RGB(r,g,b));
  }
 也可以调用CDC类中的InvertRgn方法,该方法将制定区域的颜色取反。
 如下示例代码:
  CDC* pDC = m_image.GetDC();
 CRect m_rect;
 m_image.GetClientRect(m_rect);
 CRgn m_rgn;
 m_rgn.CreateRectRgn(m_rect.left,m_rect.top,m_rect.right,m_rect.bottom);
 pDC->InvertRgn(&m_rgn);

62.如何在VC++ 中显示JPG图片。
·在Visual c++中,MFC类库没有提供相应的控件显示JPG图像。
 JPG图像采用压缩形式存储,存储结构复杂。为了简单化,可以采用流的形式读取JPG文件。
 首先利用CFile对象读取JPG文件,获取JPG文件的长度,然后利用GlobalAlloc函数在堆中
 划分一个和文件大小相同的区域,接着调用GlobalLock函数锁定该区域,返回一个指向堆
 的指针,将文件数据写入该区域中,最后调用CreateStreamOnHGlobal函数在堆中创建流
 对象,调用OleLoadPicture函数根据流对象创建图像对象IPicture,调用IPicture的
 Render方法将如下显示在指定的画布上。
 如下示例代码:
 void CShowJPGDlg::OnOK()
{
 //定义打开文件的对话框,获取文件的路径
 CFileDialog m_dlg(TRUE,"JPG",NULL,NULL,"JPG(*.jpg)|*.JPG|gif|*.gif",this);
 if (m_dlg.DoModal()==IDOK)
 {
  CString m_filename =m_dlg.GetPathName();//获取文件路径
  
  m_dir.SetWindowText(m_filename);

  CFile m_file(m_filename,CFile::modeRead );//定义文件流对象
  
  //获取文件长度
  DWORD m_filelen = m_file.GetLength();
  
  //在堆上分配空间
  HGLOBAL m_hglobal = GlobalAlloc(GMEM_MOVEABLE,m_filelen);

  LPVOID pvdata = NULL;
  //锁定堆空间,获取指向堆空间的指针
  pvdata = GlobalLock(m_hglobal);

  //将文件数据读区到堆中
  m_file.ReadHuge(pvdata,m_filelen);

  IStream*  m_stream;

  GlobalUnlock(m_hglobal);

  //在堆中创建流对象
  CreateStreamOnHGlobal(m_hglobal,TRUE,&m_stream);

  //利用流加载图像
  OleLoadPicture(m_stream,m_filelen,TRUE,IID_IPicture,(LPVOID*)&m_picture);
 
  m_picture->get_Width(&m_width);
  m_picture->get_Height(&m_height); 

  CDC* dc = GetDC();
  
  m_IsShow = TRUE;
  CRect rect;
  GetClientRect(rect);
  SetScrollRange(SB_VERT,0,(int)(m_height/26.45)-rect.Height());
  SetScrollRange(SB_HORZ,0,(int)(m_width/26.45)-rect.Width());

  m_picture->Render(*dc,1,50,(int)(m_width/26.45),(int)(m_height/26.45),
    0,m_height,m_width,-m_height,NULL);
  
 }
}
63.如何通过一个点坐标知道点所处在的窗口?
 我们可以通过ChildWindowFromPoint函数来实现。
 ChildWindowFromPoint  Windows API 函数。
  函数原型:HWND ChildWindowFromPoint (HWND hWnd, LONG xPoint, LONG yPoint);
   函数功能:返回父窗口中包含了指定点的第一个子窗口的句柄。
   函数参数:hWnd 父窗口的句柄
   xPoint 点的X坐标,以像素为单位
   yPoint 点的Y坐标,以像素为单位
   返回值:发现包含了指定点的第一个子窗口的句柄。如未发现任何窗口,则返回hWnd(父窗口的句柄)。如指定点位于父窗口外部,则返回零。

64.如何实现旋转的文字?
 要实现字体的旋转,首先创建一个字体,在创建字体时指定倾斜角,然后利用设备上下文
 选中字体,最后输出文字就可以了。文字就会在某一位置按照字体指定的角度倾斜。
 创建一个字体可以调用CFont类的CreateFont方法。

65.如何获取当前系统字体列表。
 Windows操作系统提供了一个EnumFontFamiliesEx函数,该函数用于获取系统字体列表。
 具体语法请查阅MSDN。
 如下示例代码:
 CStringList fontlist;
 //下面是定义的一个回调函数
 int CALLBACK EnumFontList (const ENUMLOGFONTEX *lpelfe, const NEWTEXTMETRICEX *lpntme, unsigned long FontType, LPARAM lParam)
 {
  POSITION pos = fontlist.Find(lpelfe->elfLogFont.lfFaceName);
  if (pos == NULL)
   fontlist.AddTail(lpelfe->elfLogFont.lfFaceName);
  return 1 ;
 }
 LOGFONT m_logfont;//定义一个用于描述字体信息的LOGFONT结构体指针。如果设置
 memset(&m_logfont,0,sizeof(m_logfont));//LOGFONT结构的lfCharset成员为DEFAULT_CHARSET
 m_logfont.lfCharSet = DEFAULT_CHARSET;//函数将列举所有字符的字体,否则只列举
           //指定的字符集字体。
 m_logfont.lfFaceName[0] =NULL;

 EnumFontFamiliesEx(dc->m_hDC,&m_logfont,(FONTENUMPROC)EnumFontList,100,0);

66.让一个矩形向中心缩小
 要让一个矩形向中心缩小指定的像素我们可以调用GetClientRect函数,此函数的具体使用
 方法请查阅MSDN。
 如下示例:
 m_demo.GetClientRect(m_rect);//两个变量都是矩形
 m_rect.DeflateRect(1,1,1,1);
67.如何实现空心文字?
 Windows提供了一个空心字体---华文彩云,该字体在设备上输出时是空心的,效果比较好。
 现在我们来实现宋体空心文本。
 要实现字体的空心显示,可以利用设备上下文CDC类的通道方法。CDC类提供了多个通道方法,
 其主要方法如下:
 1)BeginPath//该方法用于开始一个通道。
 2)EndPath//该方法用于结束一个通道。
 3)StrokePath//该方法用当前的画笔绘制一个通道。
 示例程序如下:
 CDC* pDC = GetDC();
 CRect m_rect;
 GetClientRect(m_rect);
 m_font.CreateFont(-32,-28,0,0,600,0,0,0,
   DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,
   CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FF_ROMAN,"宋体");
 pDC->BeginPath();
 pDC->SelectObject(&m_font);
 pDC->SetBkMode(TRANSPARENT);
 pDC->TextOut(100,70,"明日科技");
 CPen pen(PS_SOLID,1,RGB(255,0,255));
 pDC->SelectObject(&pen);
 pDC->EndPath();
 m_font.Detach();
 pDC->StrokePath();
68.如何提取并保存应用程序图标
 提取应用程序的图标可以利用ExtractIcon  API函数来实现。具体语法请查看MSDN。
 函数返回一个图标的句柄。
 保存应用程序的图标会比较复杂,需要了解图标的结构。图标文件由三部分组成,

 第一部分
 是图标文件头,结构如下:
 typedef struct
 {
    WORD     idReserved;           //保留,(必须是0)
    WORD     idType;               //资源类型(1标识ICON)
    WORD     idCount;              //文件所含图片的数量

   ICONDIREDTRY  idEntries[1];     //每个图片的入口
 }ICONDIR,*LPICONDIR;
 一个图标文件可以包含多个图标,成员idCount用于确定文件包含的图标数量。

 第二部分是图标资源索引目录,结构如下:
 typedef struct
 {
    byte        bwidth;          // 图像宽度,以像素为单位
    byte        bheight;         // 图像高度,以像素为单位
    byte        bcolorcount;     //图像中的颜色数,如果是大于8的位图,此值为零
    byte        breserved;       //保留,必须为零
    WORD        wplanes;         //位面数,一般为1
    WORD        wbitcount;       //每像素所占位数
    DWORD       dwbytesinres;    // 资源的字节数
    DWORD       dwimageoffset;   //图像数据距离资源开始处偏移位置
 } icondirentry, *lpicondirentry;

 第三部分是图标数据,结构如下:
 typedef struct
 {
     LPBITMAPINFO   icheader;  // 位图信息头,可参照上节的位图头信息结构
     RGBQUAD         iccolors; //色彩表,同位图的色彩表。
     LPBYTE   lpXOR;   
     LPBYTE   lpAND; 
           // AND掩码
 } iconimage, *lpiconimage;

69.创建状态栏并显示相关信息?
 如下示例为创建具有4个窗口的状态栏
 UINT array[5];
 for (int i=0;i<5;i++)
 {
  array[i] = 1001+i;
 }
 先定义状态栏变量 CStatusBar m_statusbar;
 调用Create函数,m_statusbar.Create(this); //创建状态栏窗口
 m_statusbar.SetIndicators(array,sizeof(array)/sizeof(UINT)); //添加面板
 for (int n = 0; n<4;n++)
 {
  m_statusbar.SetPaneInfo(n,array[n],0,155);//设置面板宽度
 }
 m_statusbar.SetPaneInfo(3,array[3],0,700);
 //设置状态栏中显示的信息
 CTime time;
 time=time.GetCurrentTime();
 CString stime;
 stime.Format("当前时间:%s",time.Format("%y-%m-%d %H:%M:%S"));
 m_statusbar.SetPaneText(0,stime);
 ...
 RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);重新定位

70. Windows Media Player 控件的主要方法
 1.GetMute              获得静音属性
 2.GetPlayState         获得播放状态
 3.GetVolume            获得音量
 4.Open                 打开播放文件
 5.Pause                暂停
 6.Play                 播放
 8.SetShowControls      设置十分显示控制面板

你可能感兴趣的:(windows,Stream,struct,null,vc++,byte)