Friday 25 April 2008

EVC实现WIN CE下截屏并且保存到文件[By Erran]

在WinCE中, 由于WinCE的精简,有很多win32下的标准API不支持,所以有很多在vc上能够轻易实现的功能, 在evc中有点难度,必须变通一下,就拿截取屏幕来说,一个常用的函数GetDIBits在wince就Unsupported.当时为了实现这个功能,颇费了了一番心血,当然其主要还是因为对api不是很熟悉。

最初使用的截屏方法说来还真有些丢人,一个一个点的取得颜色值,再保存到bmp文件中去,这样程序运行的速度超慢,保存一个800X600的bmp差不多要一两分钟(研华8251板),觉得有些不对头,决定想办法改进一下,就使劲地看了一下Charles Petzold先生的《Programming Windows》(这本书很经典,值得好好研究一下),终于把时间缩短到几秒钟了,下面这个函数在evc和vc下都test pass(不用更改),有不足之处欢迎指正,函数:


// this function create a bmp file to save the current screen;
// supported eVC++ 4.0 (wince 4.0) and vc++ 6.0 , test pass;

void CSnapDlg::OnScreenSave(const char *filename)
{
    HDC hScrDC, hMemDC;        
    int width, height;

//the pointer will save all pixel point's color value
BYTE *lpBitmapBits = NULL;
       
//creates a device context for the screen device
    hScrDC = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);


//get the screen point size
    width = GetDeviceCaps(hScrDC, HORZRES);
    height = GetDeviceCaps(hScrDC, VERTRES);


    //creates a memory device context (DC) compatible with the screen device(hScrDC)
    hMemDC = CreateCompatibleDC(hScrDC);


//initialise the struct BITMAPINFO for the bimap infomation,
//in order to use the function CreateDIBSection
//
on wince os, each pixel stored by 24 bits(biBitCount=24)
//and no compressing(biCompression=0)

    BITMAPINFO RGB24BitsBITMAPINFO;
    ZeroMemory(&RGB24BitsBITMAPINFO, sizeof(BITMAPINFO));
    RGB24BitsBITMAPINFO.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    RGB24BitsBITMAPINFO.bmiHeader.biWidth = width;
    RGB24BitsBITMAPINFO.bmiHeader.biHeight = height;
    RGB24BitsBITMAPINFO.bmiHeader.biPlanes = 1;
    RGB24BitsBITMAPINFO.bmiHeader.biBitCount = 24;
  
//use the function CreateDIBSection and SelectObject
//in order to get the bimap pointer : lpBitmapBits

    HBITMAP directBmp = CreateDIBSection(hMemDC, (BITMAPINFO*)&RGB24BitsBITMAPINFO,
        DIB_RGB_COLORS, (void **)&lpBitmapBits, NULL, 0);
HGDIOBJ previousObject = SelectObject(hMemDC, directBmp);


// copy the screen dc to the memory dc
BitBlt(hMemDC, 0, 0, width, height, hScrDC, 0, 0, SRCCOPY);

//if you only want to get the every pixel color value,
//you can begin here and the following part of this function will be unuseful;
//the following part is in order to write file;


//bimap file header in order to write bmp file
BITMAPFILEHEADER bmBITMAPFILEHEADER;
ZeroMemory(&bmBITMAPFILEHEADER, sizeof(BITMAPFILEHEADER));
bmBITMAPFILEHEADER.bfType = 0x4d42; //bmp
    bmBITMAPFILEHEADER.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    bmBITMAPFILEHEADER.bfSize = bmBITMAPFILEHEADER.bfOffBits + ((width*height)*3); ///3=(24 / 8)

//write into file
FILE *mStream = NULL;
if((mStream = fopenfilename, "wb")))
{  
  //write bitmap file header
   fwrite(&bmBITMAPFILEHEADER, sizeof(BITMAPFILEHEADER), 1, mStream);
  //write bitmap info
   fwrite(&(RGB24BitsBITMAPINFO.bmiHeader), sizeof(BITMAPINFOHEADER), 1, mStream);
  //write bitmap pixels data
   fwrite(lpBitmapBits, 3*width*height, 1, mStream);
//close file
   fclose(mStream);
}

//delete
DeleteObject(hMemDC);
DeleteObject(hScrDC);
DeleteObject(directBmp);
DeleteObject(previousObject);
}



Tuesday 22 April 2008

一次愉快的定向

虽然上午的火箭输掉了比赛让我很郁闷,再加上外面烟雨迷蒙,不过一切的美好经历都要经过一段欲扬先抑的过程的,自从小学以来就一直被辛勤的园丁们教育,所以我觉得写一篇小学生作文,是对教会我们写“一次愉快的xx”的老师们的最好的致敬。

 

在慢悠悠的去往物理楼的途中,无暇和强哥欣赏路上的美女,在细雨还在回味刚才火箭的失败,不过经过校训墙后,似乎雨停了,思绪便从遥远的美利坚转移到雨后的复旦了,发现文图背后开着很pp的白花,在雨后的清新中,绽放得那么骄傲,虽然之后捕捉到强哥一张稍微ws的笑脸有些不大和谐。小辉,曹頔(赞。。。发现google输入法有这个字^_^),还有曦曦已经在物理楼前守候了。我们的team既然已经人员齐整,于是留下一张合影便开始在有点冗长的开幕式之后取得题目开始出发了。

 

第一步到的是3108,有个问题是要找昨天晚上3108讲座的题目,询问管理员无果之后,我想到上bbs去search...于是很不hd的问里面一位自修的mm借来电脑,把她撇到一边满脸茫然的看着我们做无用功(可惜我当然在努力的做search,都没有关注那个mm pp否)。。。。其实,我觉得当然在3108自修的人看到忽然闯进来的这么多的参加定向的人,估计也是满脸的茫然。。。尤其是每个队伍手上都有一个队名标识的红丝带,保不准是什么藏独邪教组织呢。。。ms在旁边问管理员的时候,一个别的队的mm就被保安盘问了很久。。。。

 

然后是曦园 “书声琅琅”,四大书院,再到“绝情谷”,然后直奔新闻学院,找到邹韬奋的铜像,再赶赴南区,会面谢希德奶奶,和正大的三毛像。在跑步的过程中,充分体会到了平时拒绝曦曦的跑步邀请是件多么愚蠢的行为,虽然,经过了这次之后,好像我也不大会去跑步。。。基本上我们队的人跑动距离强哥>曦曦>小辉>曹頔>我T.T.....

 

然后转战本部,登辉环路,逸夫科技楼,北区三角地,莘莘学子像,再回归校史馆答题。。。这个时候已经落后前面的人蛮多了。。。中间还忘了和保安合影。。。。然后完成第一部分,进入第二部分。。。基本上就是从中找一个题,回答对了就到下一个地点找到下一个题,再一路下去,把所有的题收集完成到终点站东主楼13楼会合。。。在这个跑步环节下来之后。。。大家都差不多精疲力尽了。。

 

最后就是等结果的过程。。。大家无聊的坐在光华楼上的柱子下,后来提议去买雪糕。。。曦曦报告了我们雪糕,不过我们让强哥留守,很不幸的事情发生了。。。我们都忘了给强哥带上雪糕。。。最后强哥只能看到4跟雪糕棍子。。。不过ms强哥也没闲着,最后看相机发现他也借机tp了几位pp工作人员,真是邪恶。。。。

 

然后再经历一个更加冗长的颁奖和领导讲话阶段,把手上的礼炮都放响,再在一个板子上留下了自己的签名:) 还是蛮赞的。。。虽然,我的字依然惨不忍睹。。。。最后领取一个纪念奖。。。一个蛮pp的复旦校徽。。。。

 

不过一般作文到这里是不能够结束的,好像得再加一个高潮才是一个愉快的过程,于是我们便一起找了个地方吃饭。。。再饭桌上小辉和曹頔进行了友好而热烈的8g谈话,谈话的精神得到了与会代表强哥,曦曦和我的有条件的赞同,大家在热情而团结的气氛中结束了这愉快的一天。^_^

Saturday 5 April 2008

春之灰烬

所有的梦都会醒来
因为每一个孩子都要长大
转身的刹那繁花已不再
白色的鸟儿也就要离开

闲淡的靠着绿柳枝
看一个个绚丽的泡泡飞向天空
风儿已经吹走多雨的春季
为何土地还是这样的润湿

那些埋藏着秘密的洞中
小草正在成长
清澈或是混浊的小溪流
是春的生命在歌唱

记得那年那日那个地方
可是冬天里走过的冰面已经消融
此刻已然在彼岸
那些回不去的还有蝴蝶在飞舞

阳光开始灼伤眼睛
可是一颗受伤的心依然在找寻光明
那些值得相信的
并没有因为沉重被抛弃在旅途

那些早晚要老去的往昔
是放在角落里的篮球
生活是如此的荒谬
所以眼泪是如此珍贵
梦想是一条找不到大海的河流
在青春的圆舞中奔流不休


存在于幻想中的未来
是春天里的最后的灰烬
它们在旷野中飞扬
和一个个美丽的童话一起埋葬

Friday 4 April 2008

无题

清明时节雨纷纷
路上行人欲断魂
此情可待成追忆
只是当时已惘然


Thursday 3 April 2008

一些网络小说

等了很久 撒冷
的更新,终于等到了一个结尾,还是很失望的。。。。《天擎》一开始给我的期望太大了,而且前半部分的yy和感情都很足够,足够到让我去体会其中。可惜段天
狼重生之后整个情节就开始不行了,虽然有过一些精彩的章节,不过不像小说,更像是一个大纲。好的小说除了一个好的情节之外,还得有一个好的细节与描
述。。。天擎 的前半部分和后半部分差距太大了,后面的那个结尾也确实不行。。。。不过ms撒冷的书 都是这样的。。


前看的一部《艳遇谅解备忘录》。。。前面yy的那么爽,后面却硬生生的给截断了。。。一个出人意料的结尾,就好像吃一顿美食吃到最后吃出一个苍蝇。。。整
个故事变的无趣了,前面还平白无故的留那么多伏笔。。。还有一部《苍老的少年》也是这样。。。这不小说的名字最喜欢了。。。也算不错的,至少结尾没有《艳
遇谅解备忘录》那么白痴。。。。

也许写网络小说都是这样吧,一开始把摊子铺的大大的,然后后来就力不从心了,于是草草收场,光凭其中的YY就可以让许多人看得很爽了。而且作为连载,时间拖的过长,受读者的影响太大。。。于是最后让看的我很不爽。
还有一部《小兵传奇》也是一样,一开始写的很赞,到了后面就无法控制节奏与场面了,于是变成了主人公的YY秀,从一开始狂high到最后,很多东西都无力为之,也只能草草的征服宇宙最后成就宇宙之王,YY完毕。。。。

之相比,感觉《星之海洋》写的还是很好的,而且尤其是从一而终,结尾没有失去水准,同时也yy的很有真实感,和角色代入感,整部小说都有一丝淡淡的忧伤笼
罩着。背景是用星际作为背景的,里面还有很多《eva》
《银河英雄传说》的痕迹,看起来很有感觉,我们的征途是星辰大海,喜欢这句话,也喜欢它的那个外传《春之灰烬》。
幸好我看到这本书的时候已经完结了,不如从它跨越年份来说,不知道我是否有耐心去等待。


还有就是莫仁的几本书,写无元世纪的,完
全构造出了一部属于莫仁的编年史,他的书那几本无元世纪的书我都收藏了电子版,还有不全的几本实体书,还是高中的时候在某个书摊淘到的,可惜。。。只有一
点点。最经典的还是《梦华传说》,当初看这本书基本是痴狂状态,虽然我看好些电子书都是一天什么不干,从早上起床到晚上睡觉,中间除了吃饭上厕所就是盯着
屏幕。。。不过当时可是整整连着暑假里的一个星期。。。估计还要长。。。。看完之后,顿觉人生空虚,渺无追求。。。。

也看过一些架空历史
的小说的,不过印象最深刻的类似的书,还是在《科幻世界》上看到的的关于韩信的一个小说,名字叫什么忘了,也不高兴上网查了。。其他的都觉得无趣。。看过
《新宋》,看过《1911新中华》,觉得到了一半就没意思了。。。所谓了历史,本身就这么有意思了,何必去架空更改呢。。。所以还是去追着当年明月的《明
朝的那些事儿》比较有意思一些,有空再去history版逛逛,才真是有意思的事情。

Tuesday 1 April 2008

vc调试查看所用内存

void TraceMemroy(CString locStr)
{
MEMORYSTATUS    memInfo;
   memInfo.dwLength = sizeof(memInfo);
GlobalMemoryStatus(&memInfo);
TRACE(TEXT("in location: %s