选择题小程序的几个问题

原创 2012年03月07日 02:10:49
 一个小程序,用于进行选择题的自测。

  从一个题库中随机抽出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,MERGE COPY);

  在网上查这个问题时看到的网页的摘要:

  ——————————————————————

  在 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<CString> m_ImageName;

  ///////////////////////////cpp文件中//////////////////////

  CFileFind finder;

  CString ImageName;

  finder.FindFile("Image\\*.*");

  while(finder.FindNextFile())

  {

  ImageName=finder.GetFileName(); if(ImageName.Find(".bmp")!=-1||ImageName.Find(".jp g")!=-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/20031030 77003673.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函数是自己添加的。

微信小程序-js实现单选功能

初次接触js弄了好长时间才出来效果,但是还是觉的不做梦完美,希望有更好的方式进行交流;实现效果如下: 虽说这个小功能但是对于我这个新手来说还是有点难;具体代码如下: WXML: ...
  • d617973306
  • d617973306
  • 2016年10月27日 14:45
  • 3241

选择题小程序的几个问题

一个小程序,用于进行选择题的自测。   从一个题库中随机抽出100个题目,然后在程序界面上每道题每道题的显示给用户供用户回答。包含了多个界面,各个界面之间按照一定关联相互切换。主要界面——“答...
  • b6281564
  • b6281564
  • 2012年03月07日 02:10
  • 302

答题微信小程序实现(5):大功告成,整个模板,题库导入/切换/积分/选择对错判断/闯关成功

哎呀妈呀,总算弄完了,可以干点别的去了。 第1个是初始页面,第2个是选错的样子,选对了是绿色,第3个是全答完了,跳转题库告罄的页面,第四个结构。 data文件夹下面有一个post-data.j...
  • sinat_41310868
  • sinat_41310868
  • 2018年01月29日 21:13
  • 411

选择题Applet小程序

虽然很对不起舍友阿亮= =不过我还是要整一整他
  • u013930716
  • u013930716
  • 2014年05月27日 11:01
  • 448

回复几个问题

上周末跟老朋友聚会,谈到技术的时候,有一个共识,软件开发方面真正有价值的进步,应当是有利于用户、有利于项目管理、有利于解决领域问题,而不是有利于程序员。多年以来,主流语言和系统的很多改进,其目的都是为...
  • myan
  • myan
  • 2010年09月14日 22:41
  • 36416

WINFORM选择题评分系统

  • 2008年02月29日 18:12
  • 69KB
  • 下载

java练习题,每天一个java小程序-1…

JAVA练习题,能做多少就做多少。http://bbs.csdn.net/topics/110067294 这个是从CSDN看到的。每天一个吧 。 【程序11】  题目:有1、2、3、4个数...
  • orz365
  • orz365
  • 2013年07月03日 17:37
  • 4238

1058. 选择题(20)

批改多选题是比较麻烦的事情,本题就请你写个程序帮助老师批改多选题,并且指出哪道题错的人最多。输入格式:输入在第一行给出两个正整数N(...
  • wanmeiwushang
  • wanmeiwushang
  • 2016年10月09日 16:44
  • 932

主席树 专题

poj2104poj 2104 静态区间第k大,没有修改,所以时间是O(nlogn),空间也是O(nlogn)静态区间第k大,没有修改,所以时间是O(nlogn),空间也是O(nlogn) 模版,...
  • Miracle_ma
  • Miracle_ma
  • 2016年09月28日 23:39
  • 389

从程序员的角度分析微信小程序

昨天朋友圈被微信小程序刷爆了。我赶快在书架上拿出三年前买的书,把上面的土擦干净,压压惊。作为一个并不是资深的程序员。 从程序员的角度分析一下微信小程序,欢迎指点。首先吐槽微信小程序只发了200个邀请号...
  • yulianlin
  • yulianlin
  • 2016年09月22日 11:51
  • 41093
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:选择题小程序的几个问题
举报原因:
原因补充:

(最多只允许输入30个字)