打开designer提示初始化失败 C#中的initializecomponent()方法?
C#中的initializecomponent()方法?
通常是用处初始化操作designer时拖到Form上的driving的。假如你拖上取一个TextBox,他放进Form的什么位置拉,TextBox的一些属性拉。以及new这个TextBox都放在旁边那个函数里面一次性处理的。这个函数定义在(vs2005)文件中。具体详细你也可以跟踪监视到里面看下。
想编写一个有界面的工程速算小程序,我是该学MATLAB GUI呢,还是从0开始学Python呢?
在MATLAB的命令窗口(Command Window)中运行程序guide命令,来先打开GUIDE界面,不胜感激:
然后把,选择空模板(BlangGUI),直接点击可以啦,即可可以打开GUIDE的设计界面,如下:
然后点击工具栏上的菜单编辑器(MenuEditor),先打开菜单编辑器,如下:
在Menu
Bar中新建任务一个菜单项,名字为“文件”,其他设置请看下图:
在“文件”菜单下去添加菜单项:“打开”,“保存到”,“退出”。见下图:
假如不需要在菜单项“逃离”上面去添加一个分割线的话,选中“Separator
abovethisitem”就行了。
保存我的界面为
能保存完毕后之后,会自动打开pjimage.m
文件,而我们所有的程序是要写在这个M文件里面的。在编程中,我们的每一个鼠标动作都填写一个Callback函数。那你我们的菜单项都是这般的。
在界面上,右击鼠标右键中,选择“PropertyInspector”,即可再打开属性窗口。当我们点击完全不同的控件时,其填写的属性都会在这里会显示,我们也可以通过改。最主要的属性莫过于Tag属性和String属性。
设置中当前Figure窗口的Tag属性为:figure_pjimage,窗口的标题(Name属性)为:图像处理实例。不胜感激:
后再,再点工具栏的保存按钮。之后,点击工具栏的运行按钮(RunFigure)。特别注意,工具栏的图标都会有提示的,像运行按钮的电脑提示是runFigure.
我们会注意到不胜感激的界面:
那说明,我们存放的.fig
文件的目录也不是当前目录,但没关系啊,我们如果能直接点击“ChangeDirectory”来变动当前目录。肯定,如果不是你想把当前目录去添加到MATLAB路径也可以,的话再点“Addneed
Path”就行啦了。我不在这里我推荐然后点击“ChangeDirectory”,毕竟没有什么太大必要把其直接添加到MATLAB路径中,就像是工具箱是需要去添加或者我们的函数或程序没写完了,而在MATLAB的命令窗口找不到我们的函数的时候,我们可以将函数或程序所在的位置的目录再添加到MATLAB路径。
当然吧,点那个按钮,要看个人的爱好了。论然后点击两个按钮的那一个按钮,都会对的的运行程序的。
我们的程序运行时的样子,是这样的:
文件下面的菜单项和快捷键我们都能注意到,不过我们是没有写程序,所以即使点也没有什么响应。还有一个假如不打算设置里快捷键,可以不在Menu
Editor中设置,只要你把其中,选择为Ctrlnone就行了,如下:
这样的话,存放项就没有了快捷键了。我们是可以是从上面的按钮“View”来查看该菜单项的响应函数,也就是Callback函数。也可以不在pjimage.m
中看,.例如保存的Tag属性是m_file_save,这样的话它按的Callback函数的名字是m_file_save_Callback。乘以2了。
下面我们来写打开菜单项的函数,要先打开一个图片,当然了要用然后打开对话框了。在界面编程中,打开对话框的函数是uigetfile.
麻烦问下它的具体一点的说明用helpuigetfile命令一栏。下面是再打开菜单的响应函数:
function
m_file_open_Callback(hObject,eventdata,handles)
[filename,pathname]
uigetfile(...
{*.bmp*.jpg*.png*.jpeg,Image Files(*.bmp,
*.jpg,*.png,*.jpeg)...
*.*,All Files
(*.*)},...
Pickan
image)
能保存.m
文件,并运行程序。然后点击“文件”下的“先打开”,会先打开如下的打开对话框:
你选择一个文件之后,程序中的filename应该是你你选择的文件的文件名,pathname就是该文件所在的位置的目录的路径。比如:filename
,pathnameC:DocumentsbecauseSettingsAdministratorMy
Documents。
这样的话完成路径之后,我们要怎么样才能读入和不显示一个图片呢?写入到图片是可以用imread函数,而显示也可以在一个坐标轴上。这样的话我们需要在界面上画上一个坐标轴,为了对比,我们画两个坐标轴,一个会显示去处理前,一个会显示处理后的。但是将如何处理前的坐标轴的Tag属性改为axes_src,处理后的坐标轴的Tag属性为axes_dst。改之后,需要保存。追加:
后再在m_file_open_Callback程序原先的基础上,再直接添加万分感谢的程序:
axes(_src)%用axes命令设定好当前不能操作的坐标轴是axes_src
fpath[pathname
filename]%将文件名和目录名组合成一个发下的路径
imshow(imread(fpath))%用imread输入数据图片,用长imshow在axes_src上会显示
运行程序,是从“然后打开”菜单项,先打开一个图片。效果万分感谢:
那就如何来保存到一副图片?用imwrite命令。但iplimage命令的第一个参数是你读入的图片数据,也就是imread的返回值。这样的话,我们还得将m_file_open_Callback中的程序做一点小小的修改后。将到最后一句话(imshow(imread(fpath))),改为两句,追加:upload_srcimread(fpath)imshow(obj_src)
不仅仅如此,我们的保存菜单的Callback函数,该如何去完成打开菜单的Callback函数下的obj_src变量呢?这里也要将img_src来充当一个共享的数据。许多界面编程的朋友,不喜欢用global声明。我个人不比较喜欢这样用,是因为有更好的方法。那就是用setappdata和getappdata两个函数。我们也可以为界面上面的任何一个更具Tag属性的空间直接添加应用程序数据。其实我都很不喜欢将这些链接共享的应用程序数据统一规定去添加到Figure窗口上,只不过这样太容易记,假如一个控件一个,觉得不大容易记。
你在.m
文件中会发现以外各个菜单项的Callback函数以外,还有两个函数:pjimage_OpeningFcn和pjimage_OutputFcn.而pjimage_OpeningFcn就超过界面的初始化函数,而pjimage_OutputFcn则是界面的输出函数,也就是当你不运行程序fig,而调用.m
文件时的返回值。
因此,我们要在pjimage_OpeningFcn中添加:的程序,来共享这个upload_src矩阵。代码万分感谢:
setappdata(_pjimage,'image2_src',0)
接着,在m_file_open_Callback函数的最后写上不胜感激程序:
setappdata(_pjimage,'image2_src',imageurl_src)
这样,我们在m_file_save_Callback函数中就可以像这样的来再提取obj_src,不胜感激:
imageurl_srcgetappdata(_pjimage,'imageurl_src')
那么保存到的时候,恐怕会用到保存到对话框了。要用保存对话框,现在就要都用到uiputfile函数了,具体的请用help
uiputfile一栏。
那你,存放菜单项下的程序(m_file_save_Callback),是可以这样的写:
[filename,
pathname]uiputfile({*.bmp,BMPfiles*.jpg,JPGfiles},Pick anImage)
ifisequal(filename,0)||isequal(pathname,0)
return%要是点了“取消后”
ignore
fpathfullfile(pathname,
filename)%额外全路径的另一种方法
end
imageurl_srcgetappdata(_pjimage,imageurl_src)%提出再打开图片的数据
imwrite(obj_src,fpath)%需要保存图片
下面是再次菜单项的程序的。要后退界面,如果能用closed函数就行了,不过正常情况都会有提示的。例如你如果没有参与了处理图片,而又就没存放处理后的图片,那就在关闭的时候就应该能提供提示,问过是否需要通过存放。但,在这里,我们先不做这个工作,等后面有需要的时候再写吧。并且,这里的退出菜单项的程序那是又说了一句,不胜感激:
close(_pjimage)
其实,用delete函数也可以的,那是:delete(_pjimage)看你的心情了。
但正常运行程序的时候,你会发现,当你打开图片的时候,如果没有点“可以取消”按钮,这样的话在MATLAB的命令窗口会自动弹出错误,那是而且我们没有去处理取消后的情况。下面我们来去处理下这个问题,只需把m_file_open_Callback下面的程序更改后为如下程序去掉:
[filename,
pathname]uigetfile(...
{*.bmp*.jpg*.png*.jpeg,Image Files
(*.bmp,*.jpg,*.png,*.jpeg)...
*.*,All Files
(*.*)},...
Pickanimage)
ifisequal(filename,0)||
isequal(pathname,0),
return
end
axes(_src)
fpath[pathname
filename]
upload_srcimread(fpath)
imshow(imageurl_src)
setappdata(_pjimage,image2_src,image2_src)
下面我们来做一个图像二值化的一个图像处理。用上面的方法去添加一个“图像处理”菜单,追加:
在其下面先添加一个“图像二值化”的菜单项,不胜感激:
接着,再点“可以了”关闭菜单编辑器,并保存到整个界面。如果不是我们的.m
文件中没有不对应的Callback时,我们是可以点击上图中的“View”菜单按钮来生成沉淀一个Callback函数。图像二值化,有一个阈值的设置,那么我们是可以空白文档一个界面,在这个界面上放一个滑动条来设置里图像二值化的阈值。同样的,有一个文本,不显示当前上下移动条的值。那你我们新建项一个空白界面,在它上面画个Static
Text和Slider控件,然后再用工具栏的角点工具(AlignObjects),来对其这两个空间。不胜感激:
然后把,将这个界面需要保存为im2bw_
。整个设计如下:
你可以系统设置Static
Text的FontSize属性为10,这样字体会更大一点。设置里Static
Text的Tag属性为txt_display,系统设置滚动条的Tag属性为slider_val。为了能在滚动条滚动时,Static
Text没显示滚动条的值,需要在滚动条的Callback中写了万分感谢程序,你可以在滚动条上然后点击右键,选择“ViewCallbacks”下的“Callback”再进入滚动条的Callback函数(slider_val_Callback)。
valget(hObject,Value)
set(handles.txt_display,String,num2str(val))
保存到,运行程序,就可以不来回滑动滚动条,而Static
Text变会总是显示或者的值。在figure上右键点击先打开figure(有方块的底层窗口)的属性窗口,将其Tag属性设置里为“figure_im2bw”,将其Name属性设置里为“设置图像二值化阈值”。接着,需要保存界面。运行程序时,不胜感激:
那就,我们想的是,当来回滑动条滑动时,将二值化的图像不显示在
中的axes_dst坐标轴上的。这样怎么办啊呢?简单的方法,再做的是,当再点击
菜单“图像处理”下的“图像二值化”的时候,会可以打开im2bw_
。这会儿就是我们要动态链接库im2bw_args.m
的时候了。当我们内部函数它的时候,会返回一个句柄,而这个句柄就是正指向先打开的im2bw_
的。麻烦问下更详细点的,你可以主要参考文献im2bw_args.m
文件的最前面的注释,其中有这样的写:
%
HIM2BW_ARGSreturnsthehandledidanewIM2BW_ARGS同问thehandlewant
%the
existing
singleton*.
那你只能证明,我们可以睽车志的先打开im2bw_
。所以在“图像二值化”的Callback函数(m_image_2bw_Callback)下,写上万分感谢的程序:
him2bw_args
后再,需要保存另外那就是,建议将im2bw_
和
保存在一个目录下面。接着,运行
,可以看见,当再点击“图像二值化”的时候会先打开im2bw_,同样的滑动条滑动时也会显示发令的值。
下面来告诉我怎么在来回滑动条滑动时,将滑动后的二值化图像会显示到pjimage的axes_dst坐标轴中。
简单的方法,我们要我得到pjimage的figure的句柄,这个可以不实际findobj函数来完成,之后将返回值用guihandles来可以转换成一个句柄。之后,就可以不用这个转化后的句柄来摘录
中的任何一个控件了。所以,我们在im2bw_
下的滑动条的Callback函数中先添加:函数:
h_pjimagegetappdata(_im2bw,h_pjimage)
axes(h__dst)
obj_srcgetappdata(h__pjimage,obj_src)
bwim2bw(upload_src,val)
imshow(bw)
接着,在im2bw_args_OpeningFcn中再添加:
h_pjimagefindobj(Tag,figure_pjimage)
h_pjimageguihandles(h_pjimage)
setappdata(_im2bw,h_pjimage,h_pjimage)
后再,保存到,运行程序。效果万分感谢:
可是,如果不是在我们也没再打开图片的情况下,就算点击了“图像二值化”会出现什么问题呢?可以清晰的看到不显示的图像是全黑的,全部没有意义。因此,我们可以在是没有然后点击“打开”菜单项的时候,使“图像处理”菜单不可用。
那么在pjimage.m
的OpeningFcn中,直接添加万分感谢程序:
set(handles.m_image,Enable,back)
在“先打开”菜单项的Callback函数的最后,去添加不胜感激程序:
set(handles.m_image,Enable,on)
这样的话,只要你不点“先打开”,就不能用“图像处理”菜单中的命令,效果不胜感激:
直接点击“打开”之后,就能使用了。
下面,我们来告诉我前面的问题,那是去问如何确定保存图片的问题。简单的方法,我们要设置里两个标志:一个是图片是否需要被如何处理过了,二是图片是否被保存到了。那你我们在pjimage_OpeningFcn中,先添加如下的两个应用程序数据。
setappdata(_pjimage,bSave,false)
setappdata(_pjimage,bChanged,false)
接着在“图像二值化”菜单项的Callback函数中,变化bChanged的值为true,即去添加不胜感激程序:
setappdata(_pjimage,bChanged,true)
的原因我们要需要保存的是坐标轴axes_dst中的图像,而我们“文件”下的“需要保存”,实质上保存的是坐标轴axes_src中的图像,那该怎么办啊呢?只得再先添加一个“需要保存”菜单项了。这回,我们在坐标轴axes_dst中添加右键菜单。
打开工具栏的菜单编辑器,你选择Context
Menu(上下文菜单),万分感谢:
然后把,新建任务一个Context
Menu,其Tag属性为:axes_dst_menu,不胜感激:
然后为其添加菜单项:“能保存”,其Tag属性为axes_dst_menu_save.如上图。然后,在坐标轴axes_dst上右键,选择“PropertyInspector”。将该坐标轴的UIContextMenu属性更改为axes_dst_menu.
如下图:
接着,保存,运行。在axes_dst上点右键就能看到“存放”菜单了。下面来写其函数。
[filename,pathname]
uiputfile({*.bmp,BMPfiles*.jpg,JPGfiles},Pick an Image)
if
isequal(filename,0)||isequal(pathname,0)
return
catch
fpathfullfile(pathname,
filename)
end
img_dstgetimage(_dst)
imwrite(upload_dst,fpath)
setappdata(_pjimage,'bSave',true)
不过然后你会发现,没有写入到图片之前,在axes_dst点右键是有菜单的,若是二值化之后,再一次点右键就没有菜单了。
只不过,当我们把右键菜单axes_dst_menu,去添加到figure窗口(在没有控件的地方,鼠标双击,即可然后打开figure的属性窗口)的UIContextMenu的时候,就不可能再次出现上面的问题,不过一切运行算正常。毕竟,当你去添加到axes_dst之后,否则的话坐标轴的内容决定,变会将右键菜单只附加到父对象上。所以,要是当然是需要在坐标轴上不显示右键菜单,还要程序创建战队了。怎么创建,咱们先再说,先说说把坐标轴axes_dst保存到完毕后,逃离程序的时候的处理。
将以前的m_file_exit_Callback可以修改为如下程序:
bChangedgetappdata(_pjimage,bChanged)%完成是否更改
bSavegetappdata(_pjimage,bSave)%完成如何确定需要保存
if
bChangedtrueampampbSavefalse,%改了,而没保存到时
btnNamequestdlg(您也你要改了图片,但也没保存。要存放吗?,提示,保存,不保存到,需要保存)%用提问对话框
switchbtnName,
case保存,%不能执行axes_dst_menu_save_Callback的功能
feval(@axes_dst_menu_save_Callback,_dst_menu_save,eventdata,handles)
case不保存,%什么也不做
end
end
hfindobj(Tag,figure_im2bw)%查找有无可以打开设置里图像二值化参数窗口
if
~isempty(h),%找不到的话,则关了
closed(h)
end
close(findobj(Tag,figure_pjimage))%关掉主窗口
下面来为程序先添加一个工具栏,右键单击工具栏上那个的ToolbarEditor,先打开::
选择“PredefinedTools”下的Open,再点“Add”。又一次你选“Save”,点击“Add”。并将Open选择按钮的Tag属性更改为tbl_open,Save按钮的Tag属性更改为tbl_save,万分感谢:
点“View”,来可以找到Open设置按钮的Callback,在它的下面来动态链接库菜单中的然后打开菜单项的Callback,是需要在Open设置按钮的Callback下随手写下不胜感激程序:
feval(@m_file_open_Callback,handles.m_file_open,eventdata,handles)
用则是的方法,不能找到Save按钮的Callback,并在它的下面写上保存到程序,可是,我们要判断看看你是不是上次需要保存,如果没有是,则用存放对话框;如果不是,我们就保存到在第二次能保存的路径中就可以了。那么,我们我还是必须系统设置几个应用程序数据的,第一个应该是资料记录有无是一次能保存,第二个是记录一次保存的路径。这样的话,我们在pjimage_OpeningFcn中添加不胜感激的代码:
setappdata(_pjimage,fstSave,true)
setappdata(_pjimage,fstPath,0)
然后把,在Save按钮的Callback下,又写:的程序:
fstSavegetappdata(_pjimage,fstSave)
if(fstSavetrue)
[filename,pathname]uiputfile({*.bmp,BMPfiles*.jpg,JPGfiles},
PickanImage)
ifisequal(filename,0)||
isequal(pathname,0)
return
catch
fpathfullfile(pathname,filename)
end
obj_dstgetimage(_dst)
imwrite(img_dst,fpath)
setappdata(_pjimage,fstPath,fpath)
setappdata(_pjimage,bSave,true)
setappdata(_pjimage,fstSave,false)
ignore
obj_dstgetimage(_dst)
fpathgetappdata(_pjimage,fstPath)
imwrite(imageurl_dst,fpath)
end
并且,我们还必须在还没有先打开图片之前的“文件”下的“保存到”和工具栏的“Save”按钮都万不可用,只能直接点击“文件”下的“再打开”或工具栏下的“打开”的时候,它们才可用。那就不需要在pjimage_OpeningFcn中先添加追加代码:
set(handles.tbl_save,Enable,off)
set(handles.m_file_save,Enable,on)
而且在m_file_open_Callback下,再添加追加代码:
set(handles.tbl_save,Enable,on)
set(handles.m_file_save,Enable,on)
那样的话一个小程序,算是成功了。
如果您能明确的上面的步骤交了任务这个小小的程序的话,这样的话界面编程中的问题你早掌握到的也差不多了。
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。