Google

星期二, 十二月 30, 2008

Free SWF software

You may also want to have a look at the following
software written by me.

* WinMorph Morphing Editor
* Wink Tutorial/Presentation Creator
* Wax Video Editing & Special Effects Software
* FrameServer
* Image Compression Toolbox
* DisC Decompilation Wizard

Have a nice time!

http://www.debugmode.com/

Adobe将Flash应用软件开发工具Flex转为开源

据国外媒体报道,Adobe系统公司4月25日宣布,将把其Flash应用软件开发工具Flex转为开放源码软件。

据悉,下一个版本的Flex代号为“Moxie”,将在六月份发行。最终版的软件名为Flex 3,发行日期将在今年年底。到年底时,Flex将成为一个比较完备的开源软件项目。

Adobe公司高层对外宣布了这一消息。据悉,在开源软件许可证书方面,Adobe公司将为Flex选择“Mozilla公共许可授权协议”。

该公司表示,Flex软件开发包将转为开源,其中包括一个编译器和库函数,这些都能帮助开发人员快速开发Flash应用软件。不过在开源同时,Adobe公司也将同时销售另外一个开发软件Flex Builder,以及服务器端工具“Flex数据服务”。

Flex可以开发基于Flash的客户端应用程序,支持互动的客户端界面。所开发的程序将可以在一个Flash播放器窗口中运行,同时支持Adobe公司最新的桌面应用容器“阿波罗”。

根据开源软件协议,Flex转为开源之后,其他人员可以对软件进行修改,软件同时可以免费使用。之前,开源运动的旗帜性企业Sun已经将许多Java开发工具专为开源。一般认为,开发工具专为开源之后,可以提高程序员采用这一技术的热情。

http://developer.weaseek.com/2008/01/12/21957019978.shtml

标签: , ,

Flash Developer

FlashDevelop is a popular free and open source ActionScript 2/3 and web development environment.
FlashDevelop seemlessly integrates with Adobe Flash IDE, Adobe Flex SDK, Mtasc, Haxe and Swfmill.

Main Features

* AS3 Project management with seamless and optimized Adobe Flex SDK integration
* AS2 Project management with seamless Swfmill and Mtasc integration (using a portable standalone command line tool)
* Advanced ActionScript 2 and ActionScript 3 completion & code exploration with automatic classpath detection (even without project)
* Smart contextual Actionscript code generators
* SWF and SWC classes and symbols exploration
* Test movie in Adobe Flash IDE and with clickable error results (Flash CS3)
* MTASC compilation/code checking with clickable error results

Other Features

* Types Explorer
* Automatically cleans ASO files of modified AS2 classes
* Files explorer (can create Flash 8 Trust Files for you)
* Automatic JavaDoc creation from methods
* Smart Actionscript help websearch on F1
* Jump to class/member declaration on F4
* XML, HTML/PHP, JS, CSS code highlighting,
* Multibyte character encoding
* Program menu customization with XML files
* as2api GUI for documentation generation
* Snippets
* Lines bookmarks
* Code folding
* Zoom

http://www.flashdevelop.org/community/index.php

标签:

How to set menu item right justified?

1. I have a menu M with M.OwnerDraw=false set at design-time.
2. Also at design-time, a menu item MI, belonging to a sub-sub-menu of M,
has
MI.OnAdvancedDrawItem set to an event handler procedure.
3. At run-time, in the form's OnCreate event handler, I try to modify MI's
fType flag as follows
-----------------------------
var mii : TMenuItemInfo;
begin
FillChar (mii, SizeOf (TMenuItemInfo), #0);
mii.cbSize := SizeOf (TMenuItemInfo);
mii.fMask := MIIM_TYPE;
GetMenuItemInfo (MI.Parent.Handle, MI.Command, false, mii);
mii.fType := mii.fType or MFT_OWNERDRAW;
SetMenuItemInfo (MI.Parent.Handle, MI.Command, false, mii);
end;
-----------------------------
4. When I open the menu and hover the mouse cursor till MI, the execution
doesn't enter the MI.OnAdvancedDrawItem code and MI is drawn in the default
Windows manner.

There must be something wrong in my above MFT_OWNERDRAW setting.
So, I am looking for a sample code which could let me to pinpoint my error.

Jacek

http://delphi.newswhat.com/geoxml/forumhistorythread?groupname=borland.public.delphi.rtl.win32&messageid=438ba88a@newsgroups.borland.com

标签: ,

[学习]DelphiZeus 9. 菜单和列表框--3

procedure CopyMenuItem;
begin
{这个过程将通过 GetMenuItemInfo 获取菜单项设置并在 menuListB2 最后一个菜单项
复制一次。}
MenuInfo.cbSize := SizeOf(MenuInfo);
MenuInfo.dwTypeData := @CharBuffer[0];
{给 MenuInfo.dwTypeData 赋值一个内存区域}
MenuInfo.cch := 256;
{由于使用 GetMenuItemInfo 获取一个字符串,你需要设置 MenuInfo.cch 。}
MenuInfo.fMask := MIIM_STATE or MIIM_ID or MIIM_TYPE or MIIM_DATA or
MIIM_SUBMENU or MIIM_CHECKMARKS;
{留个标志全部使用,这样不管菜单项是字符串、分隔符、子菜单还是位图,这将得到所有的设置。}
GetMenuItemInfo(menuFile, CopyNum, False, MenuInfo);
{GetMenuItemInfo 将放置所有菜单项的设置到 MenuInfo 里面,包括类型与状态。}
SetMenuItemInfo(menuListB2, 6, True, MenuInfo);
{SetMenuItemInfo 将复制 menuFile 的所有菜单项的设置到 menuListB2 菜单的 MenuInfo 。}
if CopyNum < stresult =" $FFFFFFFF" stresult =" StResult" fstate =" MenuInfo.fState" wparam =" 901" wparam =" 902" lparam =" 0"> 2 then
begin
if CFolder[Length(CFolder)] <> '\' then
CFolder := CFolder + '\';
if DirectoryExists(CFolder) then
begin
GetShortPathName(@Cfolder[1], Buffer, 82);
Cfolder := Buffer + '*.*';
SendMessage(hListBox1, LB_RESETCONTENT, 0, 0);
SendMessage(hListBox1, LB_DIR, DDL_READONLY or DDL_DIRECTORY,
Integer(PChar(CFolder)))
end
else
MessageBox(hForm1, '文件夹不存在', '无文件夹',
MB_OK or MB_ICONERROR);
end;
end;
mID_m2AddSel: SelToLB3(True);
mID_m2Clear: SendMessage(hListBox1, LB_RESETCONTENT, 0, 0);
mID_m2ChangeItem:
begin
{这里使用 SetMenuItemInfo 函数立即改变几个菜单项属性}
MenuInfo.cbSize := SizeOf(MenuInfo);
MenuInfo.fMask := MIIM_STATE;
GetMenuItemInfo(menuListB1, 205, False, MenuInfo);
if MenuInfo.fState = MenuInfo.fState or MFS_CHECKED then
begin
MenuInfo.fMask := MIIM_STATE or MIIM_TYPE;
MenuInfo.fType := MFT_STRING;
MenuInfo.fState := MFS_UNCHECKED;
MenuInfo.dwTypeData := '旧的 菜单项';
end
else
begin
MenuInfo.fMask := MIIM_STATE or MIIM_TYPE;
MenuInfo.fType := MFT_STRING;
MenuInfo.fState := MFS_CHECKED or MFS_GRAYED;
MenuInfo.dwTypeData := '新的 菜单项';
end;
SetMenuItemInfo(menuListB1, 205, False, MenuInfo);
{这里 SetMenuItemInfo 改变菜单项的三个属性:勾选、文本与变灰。}
Returned := GetMenuDefaultItem(menuListB1, 0, 0);
{如果没有默认菜单项则返回 4294967295 = $FFFFFFFF}
SetWindowText(hEdit1, PChar(Int2Str(Returned)));
end;
mID_m2Item: DoMessage;
{上面的所有菜单项 ID 使用常量名代替了。下面会直接使用菜单项的 ID 编号,
这样知道 ID 代表哪个菜单和哪个菜单项比较困难,这里使用百位数(301,401,
501)来表示不同的子菜单,但是你需要参照菜单创建部分了解数字(如 302)
表示哪个菜单项。使用菜单项 ID 的常量是比较好的做法,采用命名约定如
mID_m1New、mID_m2NewFolder,m1 和 m2 分辨表示子菜单1 和子菜单2 。}
301:
begin
CFolder := GetWindowStr(hEdit1);
if Length(CFolder) > 2 then
begin
if CFolder[Length(CFolder)] <> '\' then
CFolder := CFolder + '\';
if DirectoryExists(CFolder) then
GetFiles(Cfolder)
else
MessageBox(hForm1, '文件夹不存在', '无文件夹',
MB_OK or MB_ICONERROR);
end;
end;
302: SelToLB3(False);
303: SendMessage(hListBox2, LB_RESETCONTENT, 0, 0);
304: CopyMenuItem;
401..402: SortListBox;
403: SendMessage(hListBox3, LB_RESETCONTENT, 0, 0);
404: if MenuCheck(3, 4) = 0 then
SetWindowText(hEdit1, 'It was Checked');
405:
begin
RemoveMenu(MenuMain, 3, MF_BYPOSITION);
{RemoveMenu 将移除菜单项但是不销毁子菜单}
EnableMenuItem(menuFile, mID_m1Show, MF_BYCOMMAND or MF_ENABLED);
{"文件"菜单的"显示菜单"菜单项将可用}
DrawMenuBar(hForm1);
{DrawMenuBar 将重绘主菜单来显示变化}
end;
501: DoMessage;
502: MoveWindow(hWnd, 1, 1, Rect1.Right - Rect1.Left, Rect1.Bottom -
Rect1.Top, True);
503: MessageBox(hForm1, About, '关于', MB_OK or
MB_ICONINFORMATION);
504: PostMessage(hForm1, WM_CLOSE, 0, 0);
701..765:
begin
{ID 编号 701 到 765 是在 menuSubFolder1 中为 C 盘文件夹准备}
GetMenuStr(True);
Cfolder := 'C:\' + MenuInfo.dwTypeData;
GetShortPathName(@Cfolder[1], Buffer, 82);
Cfolder := Buffer + '\*.*';
if MessageBox(hForm1,
PChar('你希望显示'+ MenuInfo.dwTypeData + ' 内的文件和文件夹? ?'),
MenuInfo.dwTypeData, MB_YESNO or MB_ICONQUESTION) = IDYES then
begin
SendMessage(hListBox1, LB_RESETCONTENT, 0, 0);
SendMessage(hListBox1, LB_DIR, DDL_READONLY or DDL_DIRECTORY,
Integer(@Cfolder[1]));
end;
end;
801..865:
begin
{ID 编号 801 到 865 是在 menuSubFolder2 中为 C 盘文件夹准备}
GetMenuStr(False);
Cfolder := 'C:\' + MenuInfo.dwTypeData + '\';
DlgChk := True;
GetFiles(Cfolder);
end;
end; // case LOWORD(wParam)
end;
WM_INITMENUPOPUP: if wParam = menuSubFolder2 then
begin
{在子菜单显示前会发送 WM_INITMENUPOPUP 消息,你可以修改这个子菜单使之
在显示前符合要求。}
SetSubMenu(wParam);
end
else if wParam = hSysMenu then
SetWindowText(hEdit1, PChar('系统菜单 lParam 为 ' + Int2Str(lParam)));
WM_CTLCOLORLISTBOX: if lParam = hListBox3 then
begin
{WM_CTLCOLORLISTBOX 获取列表框使用的颜色}
SetTextColor(wParam, $0000FF);
SetBkColor(wParam, $FFFF00);
Result := GetStockObject(LTGRAY_BRUSH);
Exit;
end;
WM_DESTROY: ShutDown;
end; // case Msg
Result := DefWindowProc(hWnd, Msg, wParam, lParam);
end;

begin // * * * * * * * 主程序开始
CopyNum := mID_m1New;
wClass.hInstance := hInstance;
with wClass do
begin
Style := 0;
hIcon := LoadIcon(hInstance, 'MAINICON');
lpfnWndProc := @MessageFunc;
hbrBackground := COLOR_BTNFACE + 1;
lpszClassName := 'Text Class';
hCursor := LoadCursor(0, IDC_ARROW);
cbClsExtra := 0;
cbWndExtra := 0;
lpszMenuName := nil;
end;
RegisterClass(wClass);
{这里将在创建主菜单之前创建菜单栏的子菜单,因为它们必须被加入主菜单。第一个子
菜单为"文件"菜单,但是本程序不涉及任何文件操作,因此这个子菜单仅仅用于演示。}
menuFile := CreateMenu;
{CreateMenu 函数将创建一个空菜单,在使用前必须加入菜单项。这里使用了三个函数
添加菜单项:AppendMenu、 InsertMenu 和 InsertMenuItem 。}
{这个 menuFile 菜单将使用 AppendMenu 添加菜单项,它有四个参数。第三个参数
uIDNewItem 是 ID 编号,它将在菜单单击时通过 WM_COMMAND 消息的 LOWORD(wParam)
发送。AppendMenu 按照调用次序顺次添加菜单项,类似于 Delphi 的"Add" 过程。}
AppendMenu(menuFile, MF_STRING, mID_m1New, '&N新建');
AppendMenu(menuFile, MF_STRING or MF_GRAYED, mID_m1Open, '&O打开');
AppendMenu(menuFile, MF_STRING or MF_CHECKED, mID_m1Save, '&S保存');
{MF_CHECKED 将会勾选菜单项}
AppendMenu(menuFile, MF_STRING, mID_m1SaveAs, '另存为(&A)');
AppendMenu(menuFile, MF_STRING or MF_GRAYED, mID_m1Show, '显示菜单');
AppendMenu(menuFile, MF_SEPARATOR, 1, nil);
{MF_SEPARATOR 将在菜单中添加分隔线,后两个参数不使用}
AppendMenu(menuFile, MF_STRING, mID_m1Exit, 'E&退出');
{MF_STRING 参数将会添加文本菜单项,MF_BITMAP 参数将会添加位图,MF_OWNERDRAW
将会指定一个自定义绘制的菜单项。}
EnableMenuItem(menuFile, mID_m1New, MF_GRAYED);
{这里使用 EnableMenuItem 使"新建"菜单项变灰并禁用它,"打开"菜单也会变灰,因为
它使用了 MF_GRAYED 参数。}
SetMenuDefaultItem(menuFile, mID_m1Exit, 0);
{SetMenuDefaultItem 将会使默认菜单项变粗显示,在双击菜单时会执行此默认菜单项。}
menuSubFolder1 := CreateMenu();
{menuSubFolder1 是在后面创建的 menuListB1 的子菜单。这个 menuSubFolder1 将会
在程序运行时列出 C:\ 盘的所有文件夹。}
SetSubMenu(menuSubFolder1);
{SetSubMenu 只在创建永不更新的 menuSubFolder1 过程中使用,menuSubFolder2 则是
每次子菜单显示的时候都更新。}
menuListB1 := CreateMenu;
{menuListB1 将使用 AppendMenu 添加菜单项。另一个菜单项将在最后使用 InsertMenu
不按照前面的次序添加。}
AppendMenu(menuListB1, MF_STRING, mID_m2NewFolder, '&N编辑框指定的新文件夹');
AppendMenu(menuListB1, MF_STRING, mID_m2AddSel, '加入所选项列表框3 ');
AppendMenu(menuListB1, MF_STRING, mID_m2Clear, '清空');
AppendMenu(menuListB1, MF_SEPARATOR, 1, nil);
AppendMenu(menuListB1, MF_STRING, mID_m2ChangeItem, '改变 菜单项');
AppendMenu(menuListB1, MF_STRING, mID_m2Item, '菜单项');
{下面的 InsertMenu( ) 将在菜单的第二个位置放置一个子菜单项。uPosition 为 1,
如果 Count 大于 0,你不能为空的菜单项添加子菜单。}
if Count > 0 then
InsertMenu(menuListB1, 1, MF_BYPOSITION or MF_POPUP or MF_STRING,
menuSubFolder1, 'C 盘文件夹');
{使用 MF_POPUP 标志在 menuListB1 添加一个子菜单,句柄在第四个参数。}
menuSubFolder2 := CreateMenu();
{这里创建的 menuSubFolder2 只有一个菜单项,菜单项将会在菜单显示使用目录填充,
参见上面的 WM_INITMENUPOPUP 消息部分。}
AppendMenu(menuSubFolder2, MF_STRING, 799, ' ');
{子菜单必须有一个菜单项,才能成功加入到另一个菜单的菜单项。}
menuListB2 := CreateMenu;
{利用 TMenuItemInfo 记录,使用功能强大的 InsertMenuItem() 函数,菜单项将被
加入到这个 menuListB2 菜单。}
MenuInfo.cbSize := SizeOf(MenuInfo);
{在使用 TMenuItemInfo 前注意设置 cbSize }
MenuInfo.fMask := MIIM_ID or MIIM_TYPE;
{第一个菜单项是标准的字符串菜单项,ID 编号为 301 ,因此你需要设置
MIIM_ID or MIIM_标志。}
MenuInfo.fType := MFT_STRING;
{设置 MFT_STRING 标志为菜单项放入字符串}
MenuInfo.dwTypeData := '&N编辑框指定的新文件夹';
//MenuInfo.cch := 21;
{如果 fType 标志设置为 MFT_STRING ,那么 dwTypeData 将被读取为 PChar 字符串,
你不必设置 MenuInfo.cch 为字符串长度,因为它不会从 MenuInfo.cch 读取数据。cch
将在写入字符并且不会读入 dwTypeData 时使用。}
MenuInfo.wID := 301;
{如果设置 MIIM_ID 标志,那么 wID 会被作为 ID 编号使用。注意这里是 wID,暗示这
是 WORD 类型,最大值为 65534。}
//MenuInfo.fState := 0;
//MenuInfo.hSubMenu := 0;
//MenuInfo.hbmpChecked := 0;
//MenuInfo.hbmpUnchecked := 0;
{不需要设置 MenuInfo 的其他域成员因为它们会被忽略}
InsertMenuItem(menuListB2, 0, False, MenuInfo);
{如果第三个参数设置为 False 那么第二个参数被作为 ID 使用,但是如果设置第二个
参数为 0,它就像 AppendMenu( ) 函数一样使用,将会把菜单项加入到最后位置。}
MenuInfo.fMask := MIIM_SUBMENU or MIIM_TYPE;
MenuInfo.fType := MFT_STRING;
MenuInfo.dwTypeData := 'C 盘文件夹';
MenuInfo.hSubMenu := menuSubFolder2;
InsertMenuItem(menuListB2, 1, False, MenuInfo);
MenuInfo.fMask := MIIM_ID or MIIM_TYPE;
MenuInfo.fType := MFT_STRING;
MenuInfo.dwTypeData := '加入所选项列表框3 ';
MenuInfo.wID := 302;
InsertMenuItem(menuListB2, 2, False, MenuInfo);
{如果第三个参数设置为 True 那么第二个参数被作为菜单项位置使用,
类似于 InsertMenu( ) 函数。}
MenuInfo.fMask := MIIM_ID or MIIM_TYPE;
MenuInfo.fType := MFT_STRING;
MenuInfo.dwTypeData := '清空';
MenuInfo.wID := 303;
InsertMenuItem(menuListB2, 3, False, MenuInfo);
MenuInfo.fMask := MIIM_TYPE;
MenuInfo.fType := MFT_SEPARATOR;
{使用 MFT_SEPARATOR 则不需要其他成员}
InsertMenuItem(menuListB2, 4, True, MenuInfo);
MenuInfo.fMask := MIIM_ID or MIIM_TYPE;
MenuInfo.fType := MFT_STRING;
MenuInfo.dwTypeData := '复制 菜单项';
MenuInfo.wID := 304;
InsertMenuItem(menuListB2, 5, True, MenuInfo);
MenuInfo.fMask := MIIM_ID or MIIM_TYPE;
MenuInfo.fType := MFT_STRING;
MenuInfo.dwTypeData := '尚未复制';
MenuInfo.wID := 305;
InsertMenuItem(menuListB2, 6, True, MenuInfo);
TempDC := GetDC(0);
BmpDC := CreateCompatibleDC(TempDC);
{准备在 menuListB3 菜单使用位图菜单项,这里创建位图并在上面标注"清空"。}
Bitmap1 := CreateCompatibleBitmap(TempDC, 39, 18);
SelectObject(BmpDC, Bitmap1);
SetRect(Rect1, 0, 0, 39, 18);
FillRect(BmpDC, Rect1, GetStockObject(BLACK_BRUSH));
SelectObject(BmpDC, GetStockObject(WHITE_BRUSH));
SetBkColor(BmpDC, $FFFFFF);
Ellipse(BmpDC, 0, 0, 39, 18);
SelectObject(BmpDC, GetStockObject(ANSI_VAR_FONT));
SetTextColor(BmpDC, $000000FF);
TextOut(BmpDC, 7, 2, '清空', 5);
DeleteDC(BmpDC);
ReleaseDC(0, TempDC);

menuListB3 := CreateMenu;
AppendMenu(menuListB3, MF_STRING, 401, '&S排序');
AppendMenu(menuListB3, MF_STRING, 402, '允许拖放');
AppendMenu(menuListB3, MF_BITMAP, 403, PChar(Bitmap1));
{使用 MF_BITMAP 需要把 Bitmap 句柄强制转化为 PChar}
AppendMenu(menuListB3, MF_SEPARATOR, 1, nil);
AppendMenu(menuListB3, MF_STRING, 404, '勾选');
AppendMenu(menuListB3, MF_STRING, 405, '隐藏此菜单');
CheckMenuRadioItem(menuListB3, 0, 1, 1, MF_BYPOSITION);
{CheckMenuRadioItem 将会设置一组菜单项为单选按钮风格,这组菜单项只有一个能被
用圆点形式选中。这里放置菜单项第 0 和 1 位置到分组中。}
CanDrag := True;
menuMain := CreateMenu;
{这里创建了主菜单}
{TMenuItemInfo 记录包含所有需要创建的菜单项的信息,这里还有比 AppendMenu 更
丰富的可用选项。}
MenuInfo.fMask := MIIM_SUBMENU or MIIM_TYPE;
{fMask 域你需要设置标志告知系统产生什么样的菜单属性}
MenuInfo.fType := MFT_STRING;
MenuInfo.dwTypeData := '&F文件';
MenuInfo.hSubMenu := menuFile;
InsertMenuItem(menuMain, 0, True, MenuInfo);
MenuInfo.dwTypeData := '列表框&1';
MenuInfo.hSubMenu := menuListB1;
InsertMenuItem(menuMain, 1, True, MenuInfo);
MenuInfo.dwTypeData := '列表框&2';
MenuInfo.hSubMenu := menuListB2;
InsertMenuItem(menuMain, 2, True, MenuInfo);
MenuInfo.dwTypeData := '列表框&3';
MenuInfo.hSubMenu := menuListB3;
InsertMenuItem(menuMain, 3, True, MenuInfo);
SetRect(Rect1, 0, 0, 536, 321);
if not AdjustWindowRect(Rect1, WS_CAPTION or WS_MINIMIZEBOX or WS_SYSMENU,False) then
SetRect(Rect1, 0, 0, 542, 347);

hForm1 := CreateWindow(wClass.lpszClassName, '菜单与列表框',
WS_CAPTION or WS_MINIMIZEBOX or WS_SYSMENU,
(GetSystemMetrics(SM_CXSCREEN) div 2) - 276,
(GetSystemMetrics(SM_CYSCREEN)div 2) - 212,
Rect1.Right - Rect1.Left, Rect1.Bottom - Rect1.Top, 0,
menuMain, // handle to main menu
hInstance, nil);
{SendMessage(CreateWindow('Static', '菜单与列表框',
WS_VISIBLE or WS_CHILD, 6, 3, 300, 20, hForm1, 0, hInstance, nil),
WM_SETFONT,GetStockObject(ANSI_VAR_FONT),0);}

{通过 WS_EX_CLIENTEDGE 风格 CreateWindowEx( ) 可以获取这些列表框的 3D 风格外观,
使用 LBS_HASSTRINGS or LBS_NOTIFY 标志在列表框使用字符串并通知父窗体消息。}
hListBox1 := CreateWindowEx(WS_EX_CLIENTEDGE, 'LISTBOX', 'C:\',
WS_VISIBLE or WS_CHILD or LBS_HASSTRINGS or LBS_NOTIFY or WS_VSCROLL,
8, 30, 150, 220, hForm1, 101, hInstance, nil);
SendMessage(hListBox1, WM_SETFONT, GetStockObject(ANSI_VAR_FONT), 0);
SendMessage(hListBox1, LB_DIR, DDL_READONLY or DDL_DIRECTORY,
Integer(PChar('C:\*.*')));
{这里使用发送 LB_DIR 消息的老办法在列表框1 中列出文件夹项,它以短文件名形式
显示,LB_DIR 主要针对过时的 Windows 3.x ,对于显示 32 位的长文件名的程序则
没有太大用处。}

PListbox1Proc := Pointer(SetWindowLong(hListBox1, GWL_WNDPROC,
Integer(@Listbox1Proc)));
{列表框1 和列表框3 被子类化,所以可以通过处理它们的消息进行很多操作。}

hListBox2 := CreateWindowEx(WS_EX_CLIENTEDGE, 'LISTBOX', nil,
WS_VISIBLE or WS_CHILD or LBS_HASSTRINGS or LBS_NOTIFY or WS_VSCROLL,
168, 30, 160, 220, hForm1, 0, hInstance, nil);
SendMessage(hListBox2, WM_SETFONT, GetStockObject(ANSI_VAR_FONT), 0);

hListBox3 := CreateWindowEx(WS_EX_CLIENTEDGE, 'LISTBOX',
'ListBox 3 selected is ',
WS_VISIBLE or WS_CHILD or LBS_HASSTRINGS or LBS_NOTIFY or WS_VSCROLL,
338, 30, 188, 220, hForm1, 0, hInstance, nil);
SendMessage(hListBox3, WM_SETFONT, GetStockObject(ANSI_FIXED_FONT), 0);
SendMessage(hListBox3, LB_INSERTSTRING, 0, Integer(PChar('列表框 3')));
{使用 LB_INSERTSTRING 添加文本到一个列表框,你需要强制转化 LParam 为 PChar,
再转化为 Integer 类型。}
PListbox3Proc := Pointer(SetWindowLong(hListBox3, GWL_WNDPROC,
Integer(@Listbox1Proc)));
{列表框1 和列表框3的子类化函数都设置为 Listbox1Proc ,这样一个列表框函数就
可以处理这两个列表框的消息。}

hEdit1 := CreateWindowEx(WS_EX_CLIENTEDGE, 'Edit', 'Wacky',
WS_VISIBLE or WS_CHILD or ES_LEFT or ES_AUTOHSCROLL,
16, 272, 400, 21, hForm1, 0, hInstance, nil);
SendMessage(hEdit1, WM_SETFONT, GetStockObject(ANSI_VAR_FONT), 0);

if PListbox1Proc = PListbox3Proc then
SetWindowText(hEdit1, 'C:\WINDOWS');
{如果你测试 - if PListbox1Proc = PListbox3Proc - 它是相等的,因为系统只有
一个列表框消息处理过程,它区分不同的列表框的不同设置是通过发送给系统的消息
处理过程的列表框句柄来实现的。}

DlgChk := True;
GetFiles('C:\');
{和列表框1 不一样,在列表框2 中我们使用 GetFiles 中的 FindFirstFile,这样可以
获取长文件名和文件列表,这样你可以更好控制列出的文件。}
ShowWindow(hForm1, SW_SHOWDEFAULT);
{GetSystemMenu( ) 将会获取系统菜单句柄,你可以利用菜单相关 API 函数处理系统菜单。}
hSysMenu := GetSystemMenu(hForm1, False);
InsertMenu(hSysMenu, 0, MF_BYPOSITION or MF_STRING, 901, 'Added Item');
InsertMenu(hSysMenu, 4, MF_BYPOSITION or MF_STRING, 902, 'MOVE WINDOW');
{两个菜单项被加入系统菜单}

while GetMessage(MainMsg, 0, 0, 0) do
begin
TranslateMessage(MainMsg);
DispatchMessage(MainMsg);
end;
DlgEditText := '';
{由于 menuListB3 可以被移除,所以记得销毁它。一旦某个子菜单被移除,它就没有
Owner 来自动销毁。}
DestroyMenu(menuListB3);
end.

来源:http://blog.tom.com/jdzmc_wanqing/article/1632.html

标签: , ,

RS232 Linux C++类库

RS-232 data acquisition & control. Intuitive cmd-line Linux serial communications designed for RS232 devices & modules: Temperature, humidity, A/D, D/A, digital indicators, multimeters, scales, etc. Suitable for use in scripts, R.A.D., or cmdln diags.

Sjinn serial communications program用于RS-232数据获取和控制操作。它提供了为RS232设备和模块设计的直观的命令行式的Linux串行通信:模板,湿度,A/D, D/A,数字指示器,万用表,比例尺,等等。它适合在脚本,R.A.D., 或cmdln对话中使用。
来源: http://sourceforge.net/projects/sjinn/

标签: , ,

星期一, 十二月 29, 2008

vnc2swf Screen Recorder

Vnc2swf is a cross-platform screen recording tool for ShockWave Flash (swf) or Flash Video (flv) format.


http://davidf.sjsoft.com/files/pyvnc2swf/

标签: , , , ,

星期日, 十二月 28, 2008

亲爱的,我有多爱你

亲爱的,我有多爱你
我一直不知道,从来没有想起



标签:

星期五, 十二月 26, 2008

五线谱排版软件种类与介绍

面对现在市面上众多的乐谱、五线谱排版软件,这些软件都可以完成一般的音乐排版工作,但是它们也有不少使用、功能与其他一些情况的上的差别。以下将对目前使用人数较多用户评价较好的四种乐谱、
五线谱排版软件
Sibelius3.0、
Finale2003、
Encore4.5、
Overture3.0.2
做一下简略的介绍。

1.Finale2003
简介在较多的打谱软件中如果选择了Finale就等于一步到位选择了世界上最先进和生命力最强的打谱软件。根据需要,Finale能把所需要的音乐内容进行移调、倒影、逆行、逆行倒影处理,可以做到分声部的打印、拉宽节拍、紧缩节拍、做管弦乐总谱的缩写谱、把钢琴谱分成多声部谱、优化总谱、和弦辨认以及对照乐谱试听效果等等。Finale是一套有高品质及容易使用的乐谱软件。它有着满足专业的音乐人士及教师需求的特色,包括不限数量的五线谱及任意将你的乐谱搬移到你想要的位置等功能。它也允许你开启不限数量的乐谱。这是一套高品质、容易使用的音乐制作的乐谱软件。本文以Finale2003 版本为例进行说明。
其功能有:
1.不限数量的五线谱及任意将你的乐谱搬移到你想要的位置。
2.可打开不限数量的乐谱等功能。音乐的创作不是简单的事,要把它以五线谱纪录下来那更是一门高深的学问,唯有Finale可以让你轻松而完整地写下你音乐的每一个纤细律动。全新改版的 Finale新增了麦克风输入与扫描输入转谱的功能,同时还拥有网路出版的超炫功能,不管你是老师、学生、作曲家或是对音乐热爱的人士,Finale是你必备的创作工具。
Finale2003这款乐谱排版软件具有及其丰富的功能以及相当多的优秀之处,可以说是同类软件中的佼佼者。因此是很多音乐工作者以及音乐爱好者的首选乐谱排版软件。.

Finale2003的主要功能特色:
1.音符解析度可达128分音符。
2.可以制作高达32,768声部分谱及小节。各小节可输入无限多之音符数。
3.支持多达16种各式谱号。并可自行创作专用谱号。
4.可使用多种不同的音符输入方式。
5.支持屏幕线上直接输入歌词功能,并具爵士手写字体。
6.可制作吉他和弦谱并可自动加入吉他指谱表。
7.可输入输出包括TIFF, EPS, PICT, WMF等多种图形格式。方便进行图文整合排版。
8.具图形编辑功能,可编辑自己专属音乐符号,应用在乐谱上。
9.可使用多种不同的音符输入方式。
10.可直接读取Encore, Allegro, PrintMusic等软件的乐谱档,并保留其原始设定。
11.具备网路出版的功能,可将你的作品置于Finale Showcase网站上,透过Finale Web Viewer软件可让有兴趣者在网路上直接浏览、下载、列印或甚至试听。并可以设定限制使用者可以试听或是列印的层级。
12.可直接读取SmartScore, MIDIScan等软件的乐谱扫描档。
13.可直接存取标准MIDI歌曲档。
14.录放音解析度可达1024分之4分音符。
15.可同时演奏控制达64个MIDI声部。
16.资料可以在MAC与WINDOWS跨平台分享。

2.Encore
简介 ENCORE是由美国PASSPORT DESIGNS公司生产的专业五线谱打谱软件。Encore的英语原意是返场加演曲目,虽然好像与其功能并没有太大关系,但并没有印象它的功能。
此乐谱排版软件功能强大,谱面规范,智能性高,是目前为止最为专业的打印乐谱软件之一。乐谱制作可以说是为最后生成MIDI而进行的先期制作,也可以说是 MIDI音乐制作的附属产品,而Encore软件是一个专门为MIDI制作而设计的软件,其目的就是制作和打印专业而且又非常标准的五线谱。它的优点是界面简洁明了,没有专业学过打谱软件的人也能一用就会,它可以制作打印钢琴谱、带伴奏器乐声以及交响乐总谱等等一系列常用乐谱,基本上可以满足一般乐谱制作的要求。
另外Encore自带音序器,可以通过音源(声卡)来播放乐曲,功能非常实用。Encore虽然看上去比较简单,但是它的功能却一点儿也不少。主要功能与上面所介绍的Finale类似,在此不再一一的进行列举。但ENCORE也与其他乐谱编辑软件有一定的差别,ENCORE 4.5有自己独有的特点,本软件这些比较具有特色的方面,在下文将给予一定的说明。本文以ENCORE 4.5汉化版 为例进行说明。

3.Sibelius
简介 Sibelius是来自音乐巨匠西贝柳斯《芬兰颂》作者故乡的打谱软件,是现在世界上功能最强的乐谱、五线谱排版软件之一,它的功能丰富。很多作曲家都很喜欢用这个软件。它的乐谱记号十分全面的,基本上所有的乐谱都可以应付自如,只有Finale可与之匹敌。Sibelius同样也是一款优秀的乐谱、五线谱的排版软件,可以制作出丰富多彩富有个性的各种乐谱。与首先介绍的Finale具有基本相同的功能,但各自有其在功能的使用上特色与区别。是一款不错的乐谱、五线谱排版软件。以下本文均以Sibelius 3.0版本为例进行说明。
Sibelius 3.0有诸多特点,
主要特色如下:
1.支持Web乐谱发布
2.支持乐谱扫描,识别功能
3.智能录音功能。这是该软件做的最绝的地方,只有Cakewalk的In Concert可以实现,Finale的脚踏节拍器控制法尚不及
4.全新的导航器界面,专业排版视图,类似Pagemake、Photoshop的导航器,浏览乐谱极其方便。
5.屏幕刷新速度快。
6.强大的快捷键功能。
7.支持MIDI信息改变。
8.支持手写谱字体,除Sibelius以外的音乐字体,所有你可用的字体9.每行谱表支持8个复音声部,设置转换相当方便该软件为共享软件,在不注册的情况下有5天的试用时间。

4.Overture
简介 Overture是大名鼎鼎的Cakewalk公司(现被GenieSoft公司收购)出品的专业的记谱软件,在国内由流行钢琴网进行汉化,它能提供各种五线谱上的记号,整理谱面及输出打印,在写谱的时候当然可以边听边修改,而且打印效果远强于图片格式。
Overture 在国内由流行钢琴网首先推出并迅速发展壮大,迄今下载人数已经接近1000万,目前被钢琴爱好者乃至出版社广泛使用。流行钢琴网并提供大量 Overture制作的钢琴谱下载,流行钢琴网出版的众多钢琴谱集也是由 Overture 制作的。 以下本文均以此版本为例进行说明。

以上介绍了五种比较流行的国外出品的乐谱排版软件。当然,近些年此类软件在我国也有所发展,TT作曲家、作曲大师、乐音都是我国国产的乐谱排版软件,在功能上已经可以与国外软件相媲美,但与国外软件相比也有一些不足之处,虽然这样,还是已经得到了越来越多国人的支持与使用。

http://www.leafword.com/word/music/200704/419.html

标签:

星期三, 十二月 24, 2008

怎么在注册表里修改屏幕的分辨率

参考:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\Current\System\CurrentControlSet\SERVICES\IALM\DEVICE0]
"DefaultSettings.XResolution"=dword:00000500
"DefaultSettings.YResolution"=dword:00000400
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\Current\System\CurrentControlSet\SERVICES\IALM\DEVICE0\Mon80861100]
"DefaultSettings.XResolution"=dword:00000500
"DefaultSettings.YResolution"=dword:00000400

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\0001\System\CurrentControlSet\SERVICES\IALM\DEVICE0]
"DefaultSettings.XResolution"=dword:00000500
"DefaultSettings.YResolution"=dword:00000400
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\0001\System\CurrentControlSet\SERVICES\IALM\DEVICE0\Mon80861100]
"DefaultSettings.XResolution"=dword:00000500
"DefaultSettings.YResolution"=dword:00000400

[HKEY_CURRENT_CONFIG\System\CurrentControlSet\SERVICES\IALM\DEVICE0]
"DefaultSettings.XResolution"=dword:00000500
"DefaultSettings.YResolution"=dword:00000400
[HKEY_CURRENT_CONFIG\System\CurrentControlSet\SERVICES\IALM\DEVICE0\Mon80861100]
"DefaultSettings.XResolution"=dword:00000500
"DefaultSettings.YResolution"=dword:00000400

标签:

星期一, 十二月 22, 2008

无题

人无诚心难交友,
便是帝王亦孤单。
每日群臣金殿冷,
夜拥娇莺玉阶寒。

标签:

无题

昨夜心向雪,
梦向天女求,
天女不解语,
挼花向人丢。

昨夜梦求雪,
天女亦伤神,
愿人不解语,
碎挼花打人。

标签:

星期四, 十二月 18, 2008

Adobe Buzzword

Write and collaborate on documents anywhere, anytime

Adobe® Buzzword® is a new online word processor, perfect for writing reports, proposals, and anything else you need to access online or work on with others. It looks and behaves like your normal desktop word processor, but it operates inside a web browser, so there's no installation required. It's free, so sign up now.
Create print-perfect documents

What you see on the screen is what you'll get when you print. Fonts, letter spacing, colors, and graphics are all reproduced exactly.
Collaborate with any number of co-authors

Write, edit, and comment on documents with only the people you choose. Control access levels and track edits by contributor.

Access your documents from anywhere

All your documents are online, so there's no need to e-mail attachments back and forth.
Control versions and keep track of changes

Avoid editing and reviewing conflicts since everyone works with the same version of the same document.

标签:

浣溪纱*公交梳妆

云想衣裳花想容,
公交梳妆亦相逢,
小镜描眉绘双瞳。

职场风云如山重,
便是须眉也从风,
无奈对窗笑莹莹。

标签:

星期二, 十二月 16, 2008

Open Screen Project

The Open Screen Project is an industry-wide initiative, led by Adobe with the participation of industry leaders, with one clear vision: enable consumers to engage with rich Internet experiences seamlessly across any device, anywhere. Partners in the Open Screen Project are working together to provide a consistent runtime environment for open web browsing and standalone applications — taking advantage of Adobe® Flash® Player and, in the future, Adobe® AIR™. This consistent runtime environment will remove barriers to publishing content and applications across desktops, mobile phones, televisions, and other consumer electronics.


http://www.openscreenproject.org/

星期六, 十二月 06, 2008

浅谈输入法编程

作者:启程软件

代码下载

摘要:本文拟结合作者的亲身体验简要介绍一下在Windows环境下如何编写输入法程序。

关键字:输入法编程

一直想写一点关于输入法编程的东西,今天终于有点时间,希望对后来者有点帮助。在此要特别感谢“自由拼音”的作者李振春,我刚开始的几个问题都是在他的帮助下才解决。

首先我们需要明白输入法是什么东西。目前常用的输入法基本上有两种类型:外挂式(如早期的万能五笔)及输入法接口式(Input Method Editor-IME)。外挂式比较简单,就是一个exe文件,通过模拟一些Windows输入消息来给当前处于活动状态的编辑窗口输入文字,一个显著的优点是输入法只要启动一次,就可以在所有进程中使用;但缺点不不容忽视,首先实现起来也不容易,一个更大的不足是兼容性不够好,通常一个Windows版本需要一人对应的输入法版本,此外这类输入法为了能够截获用户输入,通常需要挂接键盘钩子,容易造成系统不稳定或者效率不高。大部分的输入法还是采用 IME来实现,下面本文主要讨论一下IME编程需要注意的问题及解决办法。

IME是什么?IME是在 Windows平台上使用的标准的输入法接口规范。它实质是一个DLL,Windows为这个DLL定义一系列的接口,不同的接口实现指定的功能。程序员在编写输入法程序时只需要实现这些接口并导出就可以作为输入法使用。关于具体接口的定义不是本文的重点,如果您需要了解只需要在网络中搜索“输入法编程指南”就可以明白 ,更多信息参考MSDN。

原文

星期三, 十二月 03, 2008

About Trixul

Trixul is an XML and JavaScript GUI toolkit that supports MacOS X, Linux, and Windows environments directly via Cocoa, Gtk+, and .NET native implementations. JavaScript code can call C++ directly.
Trixul development is managed at Source Forge. Click here to visit the Source Forge page. Developers are currently being sought to take Trixul from its current form into something that can be used for large-scale development.

A blog chronicles the early development of Trixul.

Trixul supports the following features:

* an XML UI description language inspired by XUL
* integration of the cross-platform, Mozilla-based JavaScript engine for the C programming language (SpiderMonkey)
* support for component-based development. C++ classes can be instantiated from JavaScript code, and functions and properties associated with these classes can be interacted with, again from JavaScript.
* variant types are used to support communication of data between components and JavaScript
* extensible support for native GUI toolkits. Trixul supports Windows .NET Forms on Windows XP (and presumably on Windows Vista as well), Gtk+ on Linux, and Cocoa on Mac OS X. Other toolkits and platforms are relatively easy to add.
* support for localizable strings via XML DTD files.

标签: ,

[学习]分布式词频统计

一个规模庞大的多语言语料库,已经经过预处理,分成了12个文件,每个文件存放在一台服务器中。每个文件中包含800亿个单词,每个单词占一行,平均每个单词40字节。假设服务器都已经联网,每台服务器有双CPU和4G的内存,4×400GB的硬盘,换句话说,每台服务器就是一个高配置的PC机。请设计一个方案,找出出现频率最高的一百万个单词。

这个问题基本上可能有两种思路。第一种需要先在每台服务器,完成对单词词频的统计,进行排序,然后每两台服务器把词频统计结构进行合并,12个服务器合并到6个,然后3个,然后2个,直到所有的结果合并到一台服务器中我们就可以找出这一百万个高频词了。由于单词在服务器之间的分布可能不均匀,即使一个单词在所有的服务器中出现频率都不高,合在一起仍有可能有较高的频率,此算法几乎没有优化的余地。

举个例子,单词A只出现在一台机器上,出现了10万次。单词B在每台机器上都出现1万次。从每台服务器看来,A是高频词,而B不是,但总体来说则可能正相反。每次合并统计结果时,本地机器中所有词频高于第一百万个高频词的词频的1/N的单词都要通过网络传输到另一台机器中。这里N是当下包含词频统计的服务器的数目。总体来说这个方法效率比较低。

另一个方案要每台服务器负责一部分单词的词频统计,之后再采用分布式的分割算法找出前一百万个高频词。个人觉得这个算法更加可行,下面详细描述:

1. 定义一个哈希函数将每个单词映射为1到12之间的一个数字,从而把单词均匀分割为12组。这样我们可以确定哪台服务器负责维护这个单词的词频。
2. 每台服务器建立12个分离的结构,用于统计每一组单词的词频。可以用哈希表也可以用前缀树。
3. 每台服务器中统计词频的过程很简单,关键的问题在于当内存不足的时候如何处理。这里要作一点区分,对于第N个服务器中:
1. 除第N组单词以外词频信息占用内存最多的是第X组单词,我们可以直接将现有的统计结果发送到第X个服务器中。第X个服务器会将它自身的第X组单词的统计结果和接收到的统计结果进行合并。
2. 第 N组单词的统计信息如果占用了过多的内存也会导致整个过程变慢。因而,当它占用内存超过比如说2G时,我们可以将当前的统计信息写入硬盘,这样可以腾出更多的内存。只要我们保证在磁盘中和在内存里统计信息按相同的顺序排列,我们可以非常高效的将两组统计信息合并。不如说按照字典序(使用前缀树)或者按照哈希值加字典序(使用哈希表)
4. 当每台服务器处理完本地的语料库後,将所有的不是自己负责的单词的统计信息发送到对应的服务器中,并进行合并。这样每个单词的词频统计信息都唯一的出现在一台服务器中。
5. 采用和《中间值》类似的分布式算法,我们可以轻易地将频率最高的一百万单词和剩下的单词分开来。注意这里我们并没有为这些单词排序。


记N为每台计算机上的单词数,M为不同的单词数。

每台服务器进行词频统计的计算复杂度为 O(N)。
总通讯量为O(M)。
寻找分割点时服务器的总计算量为O(M)
寻找分割点时协调人的额外计算量O(log M)

原文:分部式词频统计

标签:

星期一, 十二月 01, 2008

周六的云

我喜欢拍云。在这个世界里,拍云不会招白眼。云彩兄一会象个绵羊,一会象个狗熊还非常的可爱。它默默无闻。在有沙尘的天气,只有它爬个高,远远的飘浮在天空的29楼,与我相伴。工作中的辛劳就忘掉了大半,剩下的是大半的开心,和满世界里跑疯追逐的幻想。

大连的云彩十分美丽,这应该托海的福。每天远远望去北面一面黄沙之色。但是到了傍晚,西边就泛起玫瑰色的紫~~一层层,华美的过渡着。那一刻,心就在星海湾,醉在夕阳的畅想里。从没去拍过。看到好多人拍到景致,不必亲为已然享受。人生如此美好。

周六的云是冬来临的序曲。它毫不客气地张扬,不拘于自己的形状,将阳光筛成细细的雾。这个冬天必然多姿多采。我讶异它奇幻,还有它透过阳光告诉我们的不屈的神采。

我很庆幸我的旅程让我在短时间内见到了不同区域的景致。这感触让我每天四处追寻。







标签: ,

辽ICP备05003652号
流风洄雪听天籁,轻云蔽日看落花

Powered by Blogger