注意:本例中我们没有必要调用showwindow来显示编辑控件,因为在创建时在其风格中已设置了ws_visible标志位,在创建父窗口时也可以使用这个小技巧。
;==============================================
; initialize the members of openfilename structure
;==============================================
mov ofn.lstructsize,sizeof ofn
push hwnd
pop ofn.hwndowner
push hinstance
pop ofn.hinstance
mov ofn.lpstrfilter, offset filterstring
mov ofn.lpstrfile, offset buffer
mov ofn.nmaxfile,maxsize
创建完编辑控件后,我们初始话ofn变量的成员。因为稍后在保存文件时还要使用该结构体变量,所以此处只初始化要用到的公共部分。wm_create 消息的处理部分是进行这种初始化的绝佳之处。
.elseif umsg==wm_size
mov eax,lparam
mov edx,eax
shr edx,16
and eax,0ffffh
invoke movewindow,hwndedit,0,0,eax,edx,true
当主窗口的客户区部分大小改变时,我们的应用程序将接收到wm_size 消息。当然该窗口第一次显示时,我们也将接收到该消息。要接收到该消息,主窗口必须有cs_vredraw和cs_hredraw风格。我们应该把缩放编辑控件的动作放到此处。我们要把编辑控件变成和我们的窗口客户区一样大,所以先得要得到父窗口客户区的大小。这些值包含在参数lparam中,lparam的高字部分是客户区的高,底字部分是客户区的宽。然后我们调用movewindow函数来重新调整编辑控件的大小,该函数不仅能够移动窗口的位置,而且能够改变窗口的大小。
.if ax==idm_open
mov ofn.flags, ofn_filemustexist or \
ofn_pathmustexist or ofn_longnames or\
ofn_explorer or ofn_hidereadonly
invoke getopenfilename, addr ofn
当用户选择了file/open菜单项时,我们填充ofn的其他成员,然后调用getopenfilename函数显示一个“打开文件”对话框。
.if eax==true
invoke createfile,addr buffer,\
generic_read or generic_write ,\
file_share_read or file_share_write,\
null,open_existing,file_attribute_archive,\
null
mov hfile,eax
如果用户选择了一个文件时,我们调用createfile函数来打开。我们设置标志位来让该函数的文件能够读写。文件打开后我们把返回的文件句柄保存在一个全局变量中以便以后使用。createfile函数应用非常广泛,其原型如下:
createfile proto lpfilename:dword,\
dwdesiredaccess:dword,\
dwsharemode:dword,\
lpsecurityattributes:dword,\
dwcreationdistribution:dword\,