2009-04-28

嫉妒的母狮



  一头年轻的母狮第一次生育,仅产下了一头小狮子。对于母狮来说,抚养一只小狮子与抚养七、八只小狮子付出的劳动是一样的,于是这位母亲遗弃了自己的小女儿。
  小狮子被动物保护者收养,为了让它最终能回归自然,动物保护者们搬到野外居住,养育小狮子并让它熟悉自然环境。人们想过把小狮子偷偷送给正在哺乳期的母狮,因为狮子不识数,它分辨不出自己的孩子多了一个或少了一个。但同时这也存在着危险:母狮一旦从小狮子身上嗅出陌生的味道,就会毫不留情地咬死小狮子。动物保护者们经过激烈的争论,最终放弃了这个想法。
  动物保护者的宿营地靠近狮群,晚上会有公狮到宿营地活动,其中有小狮子的父亲,但它也不认识自己的孩子,所以一旦见到小狮子,它很可能会杀死小狮子。小狮子慢慢长大。
  动物保护者们把小狮子放进狮群,狮群中的公狮都对这只陌生的小母狮感兴趣,但母狮们去不欢迎这名新伙伴,它们一起赶走小母狮。小母狮惊慌失措地越过有鳄鱼的小河,跑回动物保护者的宿营地。以后的日子里,小母狮一心想重返狮群,它远远地望着狮群,渐渐与狮群中的公狮熟识,甚至狮群中的某只母狮也对它产生了好感,肯和它做朋友。狮子的发情期到了,某天晚上,小母狮靠近一只公狮并与其交配,公狮的其他几位妻子不满小母狮的行为,趁小母狮交配的时候扑上去咬了它。小母狮的身上受了几处皮外伤,尾巴被咬得很重,并且感染了,几周以后,它死了,它没有回归狮群,也没来得及做一次母亲。

2009-04-19

免费品尝了吉野家的粽子

  上午在磁器口地铁站出来后,在吉野家门口遇到一位该餐厅的工作人员,她邀请女朋友免费品尝粽子,并做问卷调查。
  回答了一系列问题后,先后端上来三个粽子,粽子很袖珍,分别是豆沙馅、蜜枣馅和紫米花生馅的,每品尝完一个粽子还要回答一堆问题。粽子很袖珍,不过我们刚吃了饭,女朋友表示吃不下那么多,工作人员说每个只尝一口就可以,女朋友觉得有点浪费,所以就把她吃剩下的都给我吃了。味道比较一般,似乎没有什么特别之处。不过,这种认真态度很值得称道啊。吉野家似乎是台湾的餐饮企业,大陆的餐饮企业好像就不是特别注重细节。

2009-04-16

元大都遗址公园

  现在住的地方离这里比较近,上周六下午随便溜达了一圈。












MessageBox显示自定义图标

  主要是用到了API函数MessageBoxIndirect,代码如下所示:


LOCAL loMessageBox
loMessageBox = CREATEOBJECT("MessageBox")
? loMessageBox.ShowMessageBox("看到MessageBox显示自定义图标了吗?", ;
128 + 4, "提示信息", 16)

*---------------------------------------------------
*- MessageBox类
*---------------------------------------------------
DEFINE CLASS MessageBox AS Custom

#DEFINE HEAP_ZERO_MEMORY 0x00000008

#DEFINE DONT_RESOLVE_DLL_REFERENCES 1
#DEFINE LOAD_LIBRARY_AS_DATAFILE 2
#DEFINE LOAD_WITH_ALTERED_SEARCH_PATH 3

#DEFINE MB_ICONHAND 0x10
#DEFINE MB_ICONQUESTION 0x20
#DEFINE MB_ICONEXCLAMATION 0x30
#DEFINE MB_ICONASTERISK 0x40

#DEFINE MB_USERICON 0x80
#DEFINE MB_ICONWARNING MB_ICONEXCLAMATION
#DEFINE MB_ICONERROR MB_ICONHAND
#DEFINE MB_ICONINFORMATION MB_ICONASTERISK
#DEFINE MB_ICONSTOP MB_ICONHAND

#DEFINE MB_OK 0x0
#DEFINE MB_OKCANCEL 0x1
#DEFINE MB_ABORTRETRYIGNORE 0x2
#DEFINE MB_YESNOCANCEL 0x3
#DEFINE MB_YESNO 0x4
#DEFINE MB_RETRYCANCEL 0x5

#DEFINE MB_DEFBUTTON1 0x0
#DEFINE MB_DEFBUTTON2 0x100
#DEFINE MB_DEFBUTTON3 0x200
#DEFINE MB_DEFBUTTON4 0x300

#DEFINE MB_APPLMODAL 0x0
#DEFINE MB_SYSTEMMODAL 0x1000
#DEFINE MB_TASKMODAL 0x2000

#DEFINE MB_HELP 0x4000
#DEFINE MB_SETFOREGROUND 0x10000
#DEFINE MB_DEFAULT_DESKTOP_ONLY 0x20000
#DEFINE MB_TOPMOST 0x40000
#DEFINE MB_RIGHT 0x80000
#DEFINE MB_RTLREADING 0x100000
#DEFINE MB_SERVICE_NOTIFICATION 0x200000

#DEFINE MB_TYPEMASK 0xF
#DEFINE MB_ICONMASK 0xF0
#DEFINE MB_DEFMASK 0xF00
#DEFINE MB_MODEMASK 0x3000
#DEFINE MB_NOFOCUS 0x8000
#DEFINE MB_MISCMASK 0xC000

#DEFINE IDOK 1
#DEFINE IDCANCEL 2
#DEFINE IDABORT 3
#DEFINE IDRETRY 4
#DEFINE IDIGNORE 5
#DEFINE IDYES 6
#DEFINE IDNO 7

*#DEFINE MB_OK 0
*#DEFINE MB_OKCANCEL 1
*#DEFINE MB_ICONHAND 16
*#DEFINE MB_ICONQUESTION 32
*#DEFINE MB_ICONEXCLAMATION 48
*#DEFINE MB_ICONASTERISK 64
*#DEFINE MB_ICONMASK 240

PROTECTED hResource

PROCEDURE Init
LOCAL lcResourceFile
lcResourceFile = ADDBS(GETENV("windir")) + "SYSTEM32\Shell32.DLL"
THIS.DeclareDlls()
THIS.hResource = LoadLibraryEx(lcResourceFile, 0, ;
LOAD_LIBRARY_AS_DATAFILE)
ENDPROC

PROTECTED PROCEDURE DeclareDlls
DECLARE INTEGER LoadLibraryEx IN KERNEL32 ;
STRING lpLibFileName, ;
INTEGER hFile, ;
INTEGER dwFlags
DECLARE INTEGER FreeLibrary IN KERNEL32 ;
INTEGER hLibModule
DECLARE INTEGER HeapCreate IN KERNEL32 ;
INTEGER flOptions, ;
INTEGER dwInitialSize, ;
INTEGER dwMaximumSize
DECLARE INTEGER HeapAlloc IN KERNEL32 ;
INTEGER hHeap, ;
INTEGER dwFlags, ;
INTEGER dwBytes
DECLARE RtlMoveMemory IN KERNEL32 ;
INTEGER Destination, ;
STRING @Source, ;
INTEGER nLength
DECLARE INTEGER MessageBeep IN USER32 ;
INTEGER wType
DECLARE INTEGER MessageBoxIndirect IN USER32 ;
STRING @lpMsgBoxParams
ENDPROC

PROTECTED PROCEDURE ClearDlls
CLEAR DLLS "LoadLibraryEx", "FreeLibrary", ;
"HeapCreate", "HeapAlloc", "RtlMoveMemory", ;
"MessageBeep", "MessageBoxIndirect"
ENDPROC

PROCEDURE ShowMessageBox
LPARAMETERS tuMessage, tnStyle, tcCaption, tnIconIndex, tnSoundIndex
LOCAL lnReturnValue, lcMsgBoxParams, lnMessageHeap, lnMessageAddress, ;
lnCaptionHeap, lnCaptionAddress, lnSoundIndex
IF TYPE("tuMessage") <> "C"
tuMessage = TRANSFORM(tuMessage)
ENDIF
IF TYPE("tnStyle") <> "N"
tnStyle = 0
ENDIF
IF TYPE("tcCaption") <> "C"
tcCaption = _SCREEN.Caption
ENDIF
IF TYPE("tnIconIndex") <> "N"
tnIconIndex = 0
ENDIF
IF TYPE("tnSoundIndex") <> "N"
tnSoundIndex = 0
ENDIF
lnReturnValue = -1
lcMsgBoxParams = ""
lnMessageHeap = 0
lnMessageAddress = 0
lnCaptionAddress = 0
lnCaptionHeap = 0
tuMessage = IIF(ASC(RIGHT(tuMessage, 1)) = 0, tuMessage, ;
tuMessage + CHR(0))
tcCaption = IIF(ASC(RIGHT(tcCaption, 1)) = 0, tcCaption, ;
tcCaption + CHR(0))
lnMessageHeap = HeapCreate(0, LEN(tuMessage), 0)
lnMessageAddress = HeapAlloc(lnMessageHeap, HEAP_ZERO_MEMORY, ;
LEN(tuMessage))
= RtlMoveMemory(lnMessageAddress, @tuMessage, LEN(tuMessage))
lnCaptionHeap = HeapCreate(0, LEN(tcCaption), 0)
lnCaptionAddress = HeapAlloc(lnCaptionHeap, HEAP_ZERO_MEMORY, ;
LEN(tcCaption))
= RtlMoveMemory(lnCaptionAddress, @tcCaption, LEN(tcCaption))
lnSoundIndex = 0
DO CASE
CASE BITAND(tnStyle, BITNOT(MB_ICONMASK)) <> tnStyle
lnSoundIndex = MB_ICONMASK
CASE BITAND(tnStyle, BITNOT(MB_ICONASTERISK)) <> tnStyle
lnSoundIndex = MB_ICONASTERISK
CASE BITAND(tnStyle, BITNOT(MB_ICONEXCLAMATION)) <> tnStyle
lnSoundIndex = MB_ICONEXCLAMATION
CASE BITAND(tnStyle, BITNOT(MB_ICONQUESTION)) <> tnStyle
lnSoundIndex = MB_ICONQUESTION
CASE BITAND(tnStyle, BITNOT(MB_ICONHAND)) <> tnStyle
lnSoundIndex = MB_ICONHAND
CASE BITAND(tnStyle, BITNOT(MB_OKCANCEL)) <> tnStyle
lnSoundIndex = MB_OKCANCEL
ENDCASE
IF BITAND(tnStyle, BITNOT(MB_USERICON)) <> tnStyle
lnSoundIndex = tnSoundIndex
ENDIF
lcMsgBoxParams = BINTOC(40, "4RS") + ;
BINTOC(_SCREEN.HWnd, "4RS") + ;
BINTOC(THIS.hResource, "4RS") + ;
BINTOC(lnMessageAddress, "4RS") + ;
BINTOC(lnCaptionAddress, "4RS") + ;
BINTOC(tnStyle, "4RS") + ;
BINTOC(tnIconIndex, "4RS") + ;
BINTOC(0, "4RS") + ;
BINTOC(0, "4RS") + ;
BINTOC(VAL(SYS(3004)), "4RS")
= MessageBeep(lnSoundIndex)
lnReturnValue = MessageBoxIndirect(@lcMsgBoxParams)
RETURN lnReturnValue
ENDPROC

PROCEDURE Destroy
= FreeLibrary(THIS.hResource)
THIS.ClearDlls()
ENDPROC

ENDDEFINE


  效果图:


  上面的代码用到了WINDOWS\SYSTEM32目录下的SHELL32.DLL文件,ShowMessageBox方法中的tnIconIndex参数即是SHELL32.DLL文件中图标的顺序号。其实完全可以自行创建一个包含图标的纯资源DLL文件。
  例如,在D盘下创建一个文件夹ResourceDll,然后将rc.exe、rcdll.dll、cvtres.exe、link.exe、mspdb50.dll这些文件(可以在http://www.masm32.com/masmdl.htm下载m32v10r.zip,解压后运行安装程序安装MASM32开发工具包,然后在安装目录下可以找到这些文件)放到ResourceDll文件夹下,然后在ResourceDll下创建Resource文件夹,将DLL中要包含的图标放到该目录下,然后在该目录下创建资源文件Resource.RC,内容大致如此:

  1 ICON "360.ico"
  2 ICON "aptana.ico"
  3 ICON "close.ico"
  4 ICON "connect.ico"
  5 ICON "delete.ico"

然后打开命令提示窗口,切换到D:\ResourceDll目录下,依次执行下面的命令:

  rc.exe /v resource/resource.rc
  cvtres.exe /machine:ix86 resource/resource.res
  link.exe /SUBSYSTEM:WINDOWS /DLL /NOENTRY resource/resource.res

就可以得到Resource.DLL文件了,然后我们可以像调用SHELL32.DLL那样使用Resource.DLL中的图标了。

2009-04-09

[转载]Flex垃圾回收


1.  flash.system.System.gc();

2.  try
   {
     var lc1:LocalConnection = new LocalConnection();
     var lc2:LocalConnection = new LocalConnection();
     lc1.connect("gcConnection");
     lc2.connect("gcConnection");
   }
   catch (e:Error)
   {
   }


出处