选择题自测小程序中的几个问题

选择题自测小程序中的几个问题
2012年01月02日
   一个小程序,用于进行选择题的自测。
  从一个题库中随机抽出100个题目,然后在程序界面上每道题每道题的显示给用户供用户回答。包含了多个界面,各个界面之间按照一定关联相互切换。主要界面――“答题界面”需要做背景,文本显示在背景图片上。几个编程过程中以前没遇到过的问题。
  第一:关于CDC的StretchBlt函数
  CDC类的StretchBlt函数能够缩放图片,但是在缩放的时候会有一定的失真。解决方法,在调用之前调用SetStretchBltMode函数对CDC进行设置。具体代码:
  CDC dc(this);
  dc->SetStretchBltMode(HALFTONE);
  dc->StretchBlt(0,0,800,500,&m_mdc,0,0,800,600,MERGECOPY);
  在网上查这个问题时看到的网页的摘要:
  ――――――――――――――――――――――
  在 VC 中使用 StretchBlt 会碰到一些与点阵图大小缩放相关的一些问题。在扩展一个点阵图时,StretchBlt必须复制图素行或列。如果放大倍数不是原图的整数倍,那么此操作会造成产生的图像有些失真。
    如果目的矩形比来源矩形小,那么StretchBlt在缩小图像时就必须把两行(或列)或者多 行(或列)的图素合并到一行(或列)。完成此操作有四种方法,它根据装置内容伸展模式属性来选择其中一种方法。您可使用 SetStretchBltMode 函数来修改这个属性。
  SetStretchBltMode (hdc, iMode) ;
  Mode 可取下列值:
  BLACKONWHITE 或者 STRETCH_ANDSCANS(内定):如果两个或多个图素得合并成一个图素,那么StretchBlt会对图素执行一个逻辑AND运算。这样的结果是只有全部的原始图素是白色时该图素才为白 色,其实际意义是黑色图素控制了白色图素。这适用于白背景中主要是黑色的单色点阵图。
  WHITEONBLACK 或 STRETCH_ORSCANS:如果两个或多个图素得合并成一个图素,那么StretchBlt 执行逻辑OR运算。这样的结果是只有全部的原始图素都是黑色时才是黑色,也就是说由白色图 素决定颜色。这适用於黑色背景中主要是白色的单色点阵图。
  COLORONCOLOR 或 STRETCH_DELETESCANS:StretchBlt 简单地消除图素行或列,而没有任何逻辑组合。这是通常是处理彩色点阵图的最佳方法。
  HALFTONE 或 STRETCH_HALFTONE:Windows根据组合起来的来源颜色来计算目的的平均颜色。
  ―――――――――――――――――――――――――
  第二个:窗口切换和隐藏
  各个窗口之间相互切换,有时候需要隐藏一些窗口,有时候需要显示一些隐藏的窗口,有时需要将一些窗口置顶。这些问题其实都是基本问题,只是以前没做过。
  隐藏某个窗口:调用窗口的ShowWindow(SW_HIDE)函数。
  将新弹出的窗口置于原窗口之上:
  这里我试过将原窗口(A窗口)作为新弹出窗口(B窗口)的父窗口,但是却没有效果。因也需要在B窗口中调用A窗口,所以我再B窗口中添加了一个CWnd的指针,自己写了一个Init函数将A窗口从Init函数在B窗口初始化后传入。于是就凑巧有了B窗口在A窗口之上的效果。不清楚具体原因,但方法可行。
  将新弹出的窗口置于原窗口之上并禁用原窗口:
  这个直接在现实新窗口的时候,需要禁用窗口调用EnableWindow(false)函数,在需要恢复的时候再调用EnableWindow(true)。这里我将原窗口的指针传到了新窗口中,并在新窗口关闭时恢复原窗口。
  第三个:从外部某文件夹中读入图片,并显示。
  这个我是在网上找了个别人写的类,原文网址丢失,标题为《使用IPicture接口读取和显示BMP,GIF,JPG,ICO,EMF,WMF图像》。直接复制了他的代码,然后进行了一些修改,毫无压力的解决了图片的读取和显示。代码比较多,不贴了。
  不过读取的时候需要文件的文件名。于是添加了读取某个文件夹内所有需要的格式的文件的功能。我用了CFileFind类和一个CString数组完成功能。
  具体代码:
  //h文件中///
  vector m_ImageName;
  ///cpp文件中//
  CFileFind finder;
  CString ImageName;
  finder.FindFile("Image\\*.*");
  while(finder.FindNextFile())
  {
  ImageName=finder.GetFileName();
  if(ImageName.Find(".bmp")!=-1||ImageName.Find(".jpg")!=-1||ImageName.Find(".JPG")!=-1||ImageName.Find(".BMP")!=-1)
  {
  ImageName="Image\\"+ImageName;
  m_ImageName.push_back(ImageName);
  }
  }
  /*********************/
  我只识别了jgp和bmp格式的文件。
  第四个:透明CStatic控件
  这个走了不少弯路。后来在网上找到一个帖子,(地址:http://www.codesky.net/article/doc/200310/2003103077003673.htm )重写CStatic类的OnPaint函数。具体代码:
  但是帖子中的代码无法解决我的问题,因此做了些的修改。开始是在重写的CStatic函数中绘制图片,能达到效果,但是由于重写的CStatic类没有占据整个窗口,所以效果很差。于是又再窗口中绘制图片,重写的CStatic调用DrawText绘制文字。然后就是各种弯路了。DrawText函数不分行显示文本,文本过多时就显示不全了,然后我又不知道可以设置成多行显示,所以又回到使用SetWindowText函数,可是SetWindowText函数没有透明效果,搞得我各种纠结,然后自己写了个分行的功能。采用一个CString类来保存需要显示的文本,然后根据每行的宽度和文字的宽度计算每行显示的文本数,显示完后删除这部分文本,可是CString类用2个保存一个汉字,所以删除时候采用删除偶数个,可是出现了各种乱码,一个汉字删了一半,跟着的都成了乱码,各种伤。后来查到DrawText的是可以设置成多行显示的,相当的无语。
  在CStatic里头加入的一个用于绘文字的函数,具体代码是:
  void CMyStatic::drawText(CString szText)
  {
  m_szText=szText;
  CClientDC dc(this);
  CRect client_rect;
  GetClientRect(client_rect);
  dc.SelectObject(&m_Font);
  dc.SetBkMode(TRANSPARENT);
  dc.SetTextColor(RGB(m_r,m_g,m_b));
  if(m_bCenter)
  dc.DrawText(m_szText, client_rect, DT_CENTER|DT_WORDBREAK);
  else
  dc.DrawText(m_szText, client_rect,DT_WORDBREAK);
  }
  m_szText是CMyStatic用来保存需要显示的文本的CString类。因为有些文本需要居中显示,有些不要,所以有了if语句和bool值m_bCenter。DrawText函数中DT_WORDBREAK参数就是表示多行显示。
  第五个:各种控件被绘制的图片覆盖
  窗口类是基于资源中窗口资源创建的窗口,然后一绘图就把原本在窗口上的控件都覆盖掉了。解决方法就是简单的在绘图完后每个控件都调用各自的SetFocus函数,重新获得一下焦点。
  第六个:窗口关闭消息获取
  窗口关闭时需要进行一些必要的处理,一些对话窗口可以通过按窗口上的某个按钮进行关闭,这个时候只要响应相应的按钮消息就行,不过在如果是按了窗口标题栏上的那个叉叉关闭的,不拦截下消息就无法进行处理。解决方法是在消息映射图中拦截WM_CLOSE消息。同时自己写一个响应这个消息的函数。具体代码:
  //消息映射图
  ON_MESSAGE(WM_CLOSE,Onclose)
  /**********************/
  这里的Onclose函数是自己添加的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
微信小程序源码(含截图)题库:选择选项,切换至下一题微信小程序源码(含截图)题库:选择选项,切换至下一题微信小程序源码(含截图)题库:选择选项,切换至下一题微信小程序源码(含截图)题库:选择选项,切换至下一题微信小程序源码(含截图)题库:选择选项,切换至下一题微信小程序源码(含截图)题库:选择选项,切换至下一题微信小程序源码(含截图)题库:选择选项,切换至下一题微信小程序源码(含截图)题库:选择选项,切换至下一题微信小程序源码(含截图)题库:选择选项,切换至下一题微信小程序源码(含截图)题库:选择选项,切换至下一题微信小程序源码(含截图)题库:选择选项,切换至下一题微信小程序源码(含截图)题库:选择选项,切换至下一题微信小程序源码(含截图)题库:选择选项,切换至下一题微信小程序源码(含截图)题库:选择选项,切换至下一题微信小程序源码(含截图)题库:选择选项,切换至下一题微信小程序源码(含截图)题库:选择选项,切换至下一题微信小程序源码(含截图)题库:选择选项,切换至下一题微信小程序源码(含截图)题库:选择选项,切换至下一题微信小程序源码(含截图)题库:选择选项,切换至下一题微信小程序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值