博文

Windows Gdi入门初级应用(2006-08-05 12:49:00)

摘要:这里带你离开 Graphics.h 古老的园地!!! GDI的绘图函数基本上都是有状态的,所有的函数都要求一个HDC类型的句柄。
这个HDC的获得有几个途径BeginPaint,GetWindowDC, GetDC.他们的参数都只需要一个HWND就差不多了。
记得调用了BeginPaint后要调用EndPaint进行清理,调用GetWindowDC和GetDC后要调ReleaseDC进行清理。
在MFC代码中常常遇到的CDC CPaintDC CWindowDC CClientDC。在这里稍作解释。
CDC :例如用GDI画矩形要Rectangle(hDC,...),而使用CDC则是dc.Rectangle(...),由此可见CDC主要是把原本需要HDC作为参数的GDI函数封装了一下,HDC成了它的一个成员变量。
CPaintDC CWindowDC CClientDC:他们都是从CDC继承,分别是对上面所说的BeginPaint,GetWindowDC, GetDC调用对进行封装(CPaintDC构造时调用BeginPaint,析构时调用EndPaint,其余同理)。
BeginPaint一般用在对WM_PAINT的响应函数中使用
GetWindowDC可获得整个Window的HDC,而GetDC仅能获得客户区的HDC,区别就在于----
前者有效地绘制区域是整个窗口(边框、标题栏、客户区的总和)。
后者有效地绘制区域仅限于客户区。
两者的坐标系都是相对坐标而非屏幕坐标,原点是(0,0)。即以自己可绘制区域的左上角作为原点。
这里可以顺带的讲讲RECT了,RECT是一个结构,依次有4个成员left,top,right,bottom用来代表一个矩形区域。CRect从RECT继承,提供了一些常用的操作(例如说位移,缩小等等),其实就是改变4个成员的值。完全不用CRect也可以。许多GDI函数都要求一个RECT作为参数,或者类似的用(x,y,cx,cy)作参数,其实也就是一个RECT变种,用了宽度和高度罢了。 基础知识介绍完毕,开始实例教程:
我们以如何绘制一个具有平面风格的状态栏为例:
首先从CStatusBar继承一个类:CStatusBarNew。(如果无法通过类向导做这件事,而你又......

阅读全文(15093) | 评论:1

破解求pi的怪异程序(2006-08-05 01:14:00)

摘要:Cong Wang
25th November,2005


Institute of Post and Telecommunication, Xi'an, PRC China
Network Engineering Dep.


引言
  网上流传着一个怪异的求pi程序,虽然只有三行却能求出pi值连小数点前共800位。这个程序如下:

/*某年Obfuscated C Contest佳作选录:*/
#include < stdio.h>
long a=10000, b, c=2800, d, e, f[2801], g;
main(){
for(;b-c;)f[b++]=a/5;
for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)
for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b);
}

/* (本程式可算出pi值连小数点前共800位)
(本程式录自sci.math FAQ,原作者未详)*/

咋一看,这程序还挺吓人的。别慌,下面就告诉你它是如何做到的,并且告诉你写怪异C程序的一些技巧。^_^

展开化简
  我们知道,在C语言中,for循环和while循环可以互相代替。

  for(statement1;statement2;statement3){
    statements;
  }

上面的for语句可以用下面的while语句来代替:

  statement1;
  while(statement2){
    statements;
    statement3;
  }

而且要写怪异的C程序,逗号运算符无疑是一个好的助手,它的作用是:
从左到右依次计算各个表达式的值,并且返回最右边表达式的值。
把它嵌入for循环中是写怪异代码的常用技巧之一。所以,上面的程......

阅读全文(4714) | 评论:1

多线程编程示例(2006-08-04 23:58:00)

摘要:#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
#include <windows.h>
#define DELAY 3
#define LEN_STD_STR 3
char stdandardStr[LEN_STD_STR] = "123"; DWORD ChildMain(); int main()
{  
 INT giThreadNumber = 1;
 DWORD dwThreadId;
 HANDLE hThread;
 DWORD dwCreationFlags = 0;
 time_t *t1 = NULL;
 time_t *t2 = NULL;
 int oldTime = 0, curTime = 0;
 oldTime = time(t1);
 hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ChildMain,
               (LPVOID)giThreadNumber, dwCreationFlags, &dwThreadId);
 
 for(;;){
     curTime = time(t2);
  if(curTime - oldTime >= DELAY){
      printf("Time up!\n");
   /* other function as follow */
   print......

阅读全文(570) | 评论:0

软考常用算法设计方法(一)(2006-08-04 00:17:00)

摘要:要使计算机能完成人们预定的工作,首先必须为如何完成预定的工作设计一个算法,然后再根据算法编写程序。计算机程序要对问题的每个对象和处理规则给出正确详尽的描述,其中程序的数据结构和变量用来描述问题的对象,程序结构、函数和语句用来描述问题的算法。算法数据结构是程序的两个重要方面。
  算法是问题求解过程的精确描述,一个算法由有限条可完全机械地执行的、有确定结果的指令组成。指令正确地描述了要完成的任务和它们被执行的顺序。计算机按算法指令所描述的顺序执行算法的指令能在有限的步骤内终止,或终止于给出问题的解,或终止于指出问题对此输入数据无解。
  通常求解一个问题可能会有多种算法可供选择,选择的主要标准是算法的正确性和可靠性,简单性和易理解性。其次是算法所需要的存储空间少和执行更快等。
  算法设计是一件非常困难的工作,经常采用的算法设计技术主要有迭代法、穷举搜索法、递推法、贪婪法、回溯法、分治法、动态规划法等等。另外,为了更简洁的形式设计和藐视算法,在算法设计时又常常采用递归技术,用递归描述算法。
  一、迭代法
  迭代法是用于求方程或方程组近似根的一种常用的算法设计方法。设方程为f(x)=0,用某种数学方法导出等价的形式x=g(x),然后按以下步骤执行:
  (1) 选一个方程的近似根,赋给变量x0;
  (2) 将x0的值保存于变量x1,然后计算g(x1),并将结果存于变量x0;
  (3) 当x0与x1的差的绝对值还小于指定的精度要求时,重复步骤(2)的计算。
  若方程有根,并且用上述方法计算出来的近似根序列收敛,则按上述方法求得的x0就认为是方程的根。上述算法用C程序的形式表示为:
  【算法】迭代法求方程的根
  { x0=初始近似根;
   do {
   x1=x0;
   x0=g(x1); /*按特定的方程计算新的近似根*/
   } while ( fabs(x0-x1)>Epsilon);
   printf(“方程的近似根是%f ”,x0);
  }
  迭代算法也常用于求方程组的根,令
   X=(x0,x1,…,xn-1)
  设方程组为:
   xi=gi(X) (I=0......

阅读全文(4267) | 评论:2

同步加载多个外部swf的方法(2006-07-30 22:44:00)

摘要:在 2006,且行且惜-Fdream's Blog上有更多精彩 连接:  http://www.afdream.com/blog/blogview.asp?logID=12 下面是加载多个 swf 的代码:

function manyLoadMovie(num, x, y, xscal, yscal, dis) {
for (var i = 0; i<num; i++) {
var Temp = createEmptyMovieClip("temp"+i, i);
var L = createEmptyMovieClip("load"+i, i+num);
Temp.t = i;
L.loadMovie(i+".swf");
L._xscale = xscal;
L._yscale = yscal;
L._x = x+i*dis;
L._y = y;
T = createTextField("txt"+i, i+10000, L._x, L._y, 100, 100);
Temp.onEnterFrame = function() {
var a = this._parent["load"+this.t].getBytesLoaded();
var b = this._parent["load"+this.t].getBytesTotal();
this._parent["txt"+this.t].text = int(a*100/b)+"%";
if (a>=b and a>10) ......

阅读全文(10685) | 评论:0

Turbo C位图和BMP位图格式分极及应用(2006-07-27 17:55:00)

摘要: Turbo C位图和BMP位图格式分极及应用
近来,图像功能在计算机上的应用十分广泛,一种方便快捷而实用的方法是首先利用图像扫描仪将图像数据自动生成并存入计算机,再利用Windows的PAINTBRUH功能进行加工修改,成为独立的图像文件。但是,仍然有一个问题:PAINTBRUH软件只能在Windows环境下运行。因此要显示一幅图像(.MSP位图、.BMP位图、PCX位图),也要运行庞大的Windows,显然不方便。为此,笔者编写了一个BMP位图文件直接显示在屏幕上的程序。利用Turbo C位图格式,将BMP格式进行转换,实现了这一功能。
一、Turbo C位图格式
Borlond公司的Turbo C是目前在微机上最为流行的C语言版本。它为软件开发者提供了丰富的屏幕操作与图形功能函数。其中getimage( )函数用于将屏幕内的某矩形区域复制到内存缓冲区,putimage( )函数将内存缓冲区中的内容再复制到屏幕上。但由于图像事先还没有出现在屏幕上,所以,不能使用getimage( )函数填写供putimage( )函数显示的内存图像数据。不过可以把图像数据按getimage( )函数产生的格式填于内存缓冲区中,然后调用putimage( )函数,显示内存缓冲区图像,下面分析getimage( )函数产生的格式:
getimage (int letf, int top, int night, int bottm, *buf)
其中,left, top——矩形区域左上角坐标(x,y)。
right, bottom——矩形区域右上角坐标(x,y)。
* buf——指向存储屏幕数据的内存指针。
在内存中,图像数据是按行存放的。头两个字节为图像的宽度,接下去两个字节为图像的高度(均为低字节在前,高字节在后)。后面是真正的图像数据,它以图像的宽度为单位,先是图像的第一行第三位面的内容,然后是第一行第二位面的内容;第一行第一位面的内容;第一行第零位面的内容。第一行完后,接第二行的四个位面,第三行的四......

阅读全文(3866) | 评论:2

51单片机扩展中断的简便方法(2006-06-23 00:43:00)

摘要:51单片机扩展中断的简便方法 MCS—51系列单片机内部只有两个外部中断源输入端,当外部中断源多于两个时,就必须进行扩展,下面介绍两种简单的扩展方法:
  一、采用硬件请求和软件查询的方法:
这种方法是:把各个中断源通过硬件“或非”门引入到单片机外部中断源输入端(INT0或INT1),同时再把外部中断源送到单片机的某个输入输出端口,这样当外部中断时,通过“或非”门引起单片机中断,在中断服务程序中再通过软件查询,进而转相应的中断服务程序。显然,这种方法的中断优先级取决于软件查询的次序。其硬件连接和软件编程如下:
          

  Void zhongduan (void) interrupt 0 using 3 //中断函数

EX0=0;//关中断
If(P0_0=1) { *****}//中断查询
If(P0_1=1) { *****}//中断查询
If(P0_2=1) { *****}//中断查询
EX0=1;开中断
}

  二、用定时器/计数器作外部中断
单片机的定时器/计数器是一个加一计数器,每当计数输入端有一个“1—0”的负跳变时,计数器加一,当加一计数器溢出时,就向CPU发出中断,利用这个特性来扩展中断的方法是:首先把定时器/计数器设置成计数方式,并预置满值,把外部中断源输入到P3口第4引脚或第5引脚(计数器输入端),这样就可以利用定时器/计数器作为单片机外部中断了。注意这种方法的中断服务的入口地址应在000BH或001BH。 http://www.zwmcu.com/News/2005,8/Article_375.htm
......

阅读全文(14279) | 评论:1

遗憾(2006-06-23 01:20:00)

摘要:遗憾 遗憾是你不可以尽情去爱一个人,当你可以的时候,已经没有机会了。
遗憾是回忆里的日子比现实美好。
遗憾不是没有一个对你一往情深的人,而是同时有两个人。
遗憾是无法对你所爱的人全然坦白。
遗憾是你无法像前那么爱一个人。
遗憾是你很想结婚,但不知道应该跟谁结婚。
遗憾是你发现你最想寻找的已经不是爱情,而是自我。
遗憾是你无法跟分手的情人做最好的朋友。
遗憾是你觉得自己仍然年轻,可惜你的身份证不是这样显示。
遗憾是你已经太老了才肯相信情人的承诺。
遗憾是爱情永远是患得患失的时候最甜蜜。
遗憾是你发现人生还是简单一点好,不过,你通常会在变得很复杂的时候才顿悟这个理。 遗憾不是你想欺骗自己所爱的人,而是你想欺骗自己。
遗憾是你发现爱情不是人生的全部。可是,你仍然会用全部的人生去追寻。
遗憾是你跟你所爱的人愈走愈远——朝不同的方向。
遗憾是当你爱一个人的时候,却无法占有。
 ......

阅读全文(12494) | 评论:0

测控专业介绍(2006-06-22 01:00:00)

摘要: 测控技术与仪器专业是部级重点学科、陕西省名牌专业、学校热门专业,是以信息检测技术、现代电子技术、智能信息处理技术、计算机技术、自动控制技术、通信技术为基础的电子信息类高新技术专业。主要学习电子测量技术、信息获取与处理技术、计算机测控技术、智能化仪器仪表技术等的基本理论,学习精密仪器的光学、机械与电子学基础理论、测量与控制理论和有关测控仪器设备的设计方法,受到现代测控技术和仪器应用的训练。培养能够从事信息现场检测、智能化仪器仪表设计与开发、测控系统工程设计、计算机网络测试与管理、信息智能化处理、精密仪器仪表设计、机电一体化设备设计与开发等方面的高级工程技术人才。   本专业的主要教学体系由理论教学和实践教学环节组成,按照专业规范的要求,理论教学环节主要由四类课程组成,分别为:   (1)电路、信号与系统类课程:电路分析理论、信号与系统、电子技术基础、数字电路及系统设计、高频电子线路、大规模可编程器件技术、频率合成技术;   (2)检测技术与仪器类课程:传感器原理与应用、仪器调理电路、电子测量技术、现代测试技术概论、自动测试技术、数字信号分析与处理、随机信号分析、现代仪器设计技术、精密机械设计基础、精密仪器设计、自动化仪表与系统、计量与测试技术、虚拟仪器设计;   (3)计算机及测控技术类课程:微机原理与系统设计、软件技术基础、单片机原理及程序设计、自动控制理论基础、计算机通信技术在仪器中的应用、计算机控制技术、电气控制技术、嵌入式系统技术、计算机网络技术、数字信号处理器技术、综合测试与故障诊断;   (4)专业拓宽类课程:工程力学、工程光学、通信技术基础、数字图象采集与处理、电磁场与电磁波、电磁兼容、微波电子线路、微波技术及检测。   实践教学环节主要由课程实验、生产实习、课程设计、毕业设计、工程设计、课外科技活动组成,培养学生具备较强的工程实践和系统综合能力。   测控技术与仪器专业在电子测量、计算机测控、智能化仪器仪表、通用电子测量、精密时频测试、智能信息处理等技术领域具有明显的专业优势,先后获得国家发明奖二项,获得国家级和省部级科技进步奖十多项。出版的电路、信号与系统方面的教材在国内有很高的知名度,承担全校性的“信号与系统”课程为陕西省精品课程。本专业十分注重学生理论与实践相结合能力的培养,建有“智能化应用技术”、“检测技术及现代仪器”两个本科生......

阅读全文(15573) | 评论:1

女生眼里的好男生(2006-06-20 01:12:00)

摘要:女生眼里的好男生
  http://blog.56.com/entry.php?u=lanxubo&e_id=252949 好男生不必要太帅。事实上,相貌出众的男生得到的爱慕最多,长相平平的男生得到的幸福却最多,从长远来看,当然还是后者更幸运一些。但是对于大多数女生来说,却希望他们的男朋友有那么一两点特征让自己格外动心。这些特征随各人爱好而不定,比如比较具体的眼睛和鼻子,以及比较抽象的眼神和笑容。 
好男生不必要口才太好。大家相聚的时候,女生更希望男朋友的注意力适当多地放在自己身上,而不是一直在向大家布道。一个比较奇怪的现象是,很多平时很少言寡语的男生到了自己女朋友面前,就变得很贫嘴;很多平时很木讷无味的男生在自己爱的女生身边,说起话来却相当动听。得出的结论是:甜言蜜语是男生的天性。对于女生来说,这当然是好事,如果口能常常对心,更加是万分幸运的事了。  好男生最好和运动沾点边。不管是野蛮的篮球足球,还是文静的乒乓球羽毛球,不管是群体的,还是个人的,都可以让一个平时不会吸引别人眼神的男生变得有了光彩。运动是有活力的表现,也是健康的特征,除非是本身就有点死气沉沉的女生,大多女生都会对某一种运动有一点兴趣的;更浪漫的是,一个好男生可以带动一个女生,让她也变得充满活力。  好男生不必要太有钱。因为既然称为“男生”,自然是处在事业尚未或刚刚起步的阶段,这个阶段的男生如果很有钱,往往是他老爸的功劳。这种荣耀只有庸俗的女生才会欣赏,这里不作讨论。但是好男生一定不能小气。刚刚开始交往的时候,如果女生觉得你已经在经济允许的范围内做到了最大可能的大方,后来她说不定会主动替你省钱,甚至为你花钱;但如果刚开始就让她觉得你有不愿投资的意向,可能根本没有后来了。对于大多数女生来说,大方又是有一定限度的,最好只限于自己女朋友和最好的朋友,范围再大的话,很多女生会开始担心你有一天会把她卖了去帮自己的朋友。  好男生可以表现出一定的邋遢,在讲卫生的范围内。一个常常忘记东西放在哪里,一次性洗一大堆衣服的男生往往会让女生倍感怜惜,也能够让她感觉到她自己的重要。男生细心绝对是优点,但其实女生真正勤快的也是少数(她们毕竟是“女生”而非“女人”),有洁癖的男朋友会让她们觉得有压力。  好男生应该懂一点......

阅读全文(12663) | 评论:2