打開designer提示初始化失敗 C#中的initializecomponent()方法?
C#中的initializecomponent()方法?通常是用處初始化操作designer時(shí)拖到Form上的driving的。假如你拖上取一個(gè)TextBox,他放進(jìn)Form的什么位置拉,TextBo
C#中的initializecomponent()方法?
通常是用處初始化操作designer時(shí)拖到Form上的driving的。假如你拖上取一個(gè)TextBox,他放進(jìn)Form的什么位置拉,TextBox的一些屬性拉。以及new這個(gè)TextBox都放在旁邊那個(gè)函數(shù)里面一次性處理的。這個(gè)函數(shù)定義在(vs2005)文件中。具體詳細(xì)你也可以跟蹤監(jiān)視到里面看下。
想編寫一個(gè)有界面的工程速算小程序,我是該學(xué)MATLAB GUI呢,還是從0開始學(xué)Python呢?
在MATLAB的命令窗口(Command Window)中運(yùn)行程序guide命令,來先打開GUIDE界面,不勝感激:
然后把,選擇空模板(BlangGUI),直接點(diǎn)擊可以啦,即可可以打開GUIDE的設(shè)計(jì)界面,如下:
然后點(diǎn)擊工具欄上的菜單編輯器(MenuEditor),先打開菜單編輯器,如下:
在Menu
Bar中新建任務(wù)一個(gè)菜單項(xiàng),名字為“文件”,其他設(shè)置請(qǐng)看下圖:
在“文件”菜單下去添加菜單項(xiàng):“打開”,“保存到”,“退出”。見下圖:
假如不需要在菜單項(xiàng)“逃離”上面去添加一個(gè)分割線的話,選中“Separator
abovethisitem”就行了。
保存我的界面為
能保存完畢后之后,會(huì)自動(dòng)打開pjimage.m
文件,而我們所有的程序是要寫在這個(gè)M文件里面的。在編程中,我們的每一個(gè)鼠標(biāo)動(dòng)作都填寫一個(gè)Callback函數(shù)。那你我們的菜單項(xiàng)都是這般的。
在界面上,右擊鼠標(biāo)右鍵中,選擇“PropertyInspector”,即可再打開屬性窗口。當(dāng)我們點(diǎn)擊完全不同的控件時(shí),其填寫的屬性都會(huì)在這里會(huì)顯示,我們也可以通過改。最主要的屬性莫過于Tag屬性和String屬性。
設(shè)置中當(dāng)前Figure窗口的Tag屬性為:figure_pjimage,窗口的標(biāo)題(Name屬性)為:圖像處理實(shí)例。不勝感激:
后再,再點(diǎn)工具欄的保存按鈕。之后,點(diǎn)擊工具欄的運(yùn)行按鈕(RunFigure)。特別注意,工具欄的圖標(biāo)都會(huì)有提示的,像運(yùn)行按鈕的電腦提示是runFigure.
我們會(huì)注意到不勝感激的界面:
那說明,我們存放的.fig
文件的目錄也不是當(dāng)前目錄,但沒關(guān)系啊,我們?nèi)绻苤苯狱c(diǎn)擊“ChangeDirectory”來變動(dòng)當(dāng)前目錄??隙?,如果不是你想把當(dāng)前目錄去添加到MATLAB路徑也可以,的話再點(diǎn)“Addneed
Path”就行啦了。我不在這里我推薦然后點(diǎn)擊“ChangeDirectory”,畢竟沒有什么太大必要把其直接添加到MATLAB路徑中,就像是工具箱是需要去添加或者我們的函數(shù)或程序沒寫完了,而在MATLAB的命令窗口找不到我們的函數(shù)的時(shí)候,我們可以將函數(shù)或程序所在的位置的目錄再添加到MATLAB路徑。
當(dāng)然吧,點(diǎn)那個(gè)按鈕,要看個(gè)人的愛好了。論然后點(diǎn)擊兩個(gè)按鈕的那一個(gè)按鈕,都會(huì)對(duì)的的運(yùn)行程序的。
我們的程序運(yùn)行時(shí)的樣子,是這樣的:
文件下面的菜單項(xiàng)和快捷鍵我們都能注意到,不過我們是沒有寫程序,所以即使點(diǎn)也沒有什么響應(yīng)。還有一個(gè)假如不打算設(shè)置里快捷鍵,可以不在Menu
Editor中設(shè)置,只要你把其中,選擇為Ctrlnone就行了,如下:
這樣的話,存放項(xiàng)就沒有了快捷鍵了。我們是可以是從上面的按鈕“View”來查看該菜單項(xiàng)的響應(yīng)函數(shù),也就是Callback函數(shù)。也可以不在pjimage.m
中看,.例如保存的Tag屬性是m_file_save,這樣的話它按的Callback函數(shù)的名字是m_file_save_Callback。乘以2了。
下面我們來寫打開菜單項(xiàng)的函數(shù),要先打開一個(gè)圖片,當(dāng)然了要用然后打開對(duì)話框了。在界面編程中,打開對(duì)話框的函數(shù)是uigetfile.
麻煩問下它的具體一點(diǎn)的說明用helpuigetfile命令一欄。下面是再打開菜單的響應(yīng)函數(shù):
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
文件,并運(yùn)行程序。然后點(diǎn)擊“文件”下的“先打開”,會(huì)先打開如下的打開對(duì)話框:
你選擇一個(gè)文件之后,程序中的filename應(yīng)該是你你選擇的文件的文件名,pathname就是該文件所在的位置的目錄的路徑。比如:filename
,pathnameC:DocumentsbecauseSettingsAdministratorMy
Documents。
這樣的話完成路徑之后,我們要怎么樣才能讀入和不顯示一個(gè)圖片呢?寫入到圖片是可以用imread函數(shù),而顯示也可以在一個(gè)坐標(biāo)軸上。這樣的話我們需要在界面上畫上一個(gè)坐標(biāo)軸,為了對(duì)比,我們畫兩個(gè)坐標(biāo)軸,一個(gè)會(huì)顯示去處理前,一個(gè)會(huì)顯示處理后的。但是將如何處理前的坐標(biāo)軸的Tag屬性改為axes_src,處理后的坐標(biāo)軸的Tag屬性為axes_dst。改之后,需要保存。追加:
后再在m_file_open_Callback程序原先的基礎(chǔ)上,再直接添加萬分感謝的程序:
axes(_src)%用axes命令設(shè)定好當(dāng)前不能操作的坐標(biāo)軸是axes_src
fpath[pathname
filename]%將文件名和目錄名組合成一個(gè)發(fā)下的路徑
imshow(imread(fpath))%用imread輸入數(shù)據(jù)圖片,用長(zhǎng)imshow在axes_src上會(huì)顯示
運(yùn)行程序,是從“然后打開”菜單項(xiàng),先打開一個(gè)圖片。效果萬分感謝:
那就如何來保存到一副圖片?用imwrite命令。但iplimage命令的第一個(gè)參數(shù)是你讀入的圖片數(shù)據(jù),也就是imread的返回值。這樣的話,我們還得將m_file_open_Callback中的程序做一點(diǎn)小小的修改后。將到最后一句話(imshow(imread(fpath))),改為兩句,追加:upload_srcimread(fpath)imshow(obj_src)
不僅僅如此,我們的保存菜單的Callback函數(shù),該如何去完成打開菜單的Callback函數(shù)下的obj_src變量呢?這里也要將img_src來充當(dāng)一個(gè)共享的數(shù)據(jù)。許多界面編程的朋友,不喜歡用global聲明。我個(gè)人不比較喜歡這樣用,是因?yàn)橛懈玫姆椒?。那就是用setappdata和getappdata兩個(gè)函數(shù)。我們也可以為界面上面的任何一個(gè)更具Tag屬性的空間直接添加應(yīng)用程序數(shù)據(jù)。其實(shí)我都很不喜歡將這些鏈接共享的應(yīng)用程序數(shù)據(jù)統(tǒng)一規(guī)定去添加到Figure窗口上,只不過這樣太容易記,假如一個(gè)控件一個(gè),覺得不大容易記。
你在.m
文件中會(huì)發(fā)現(xiàn)以外各個(gè)菜單項(xiàng)的Callback函數(shù)以外,還有兩個(gè)函數(shù):pjimage_OpeningFcn和pjimage_OutputFcn.而pjimage_OpeningFcn就超過界面的初始化函數(shù),而pjimage_OutputFcn則是界面的輸出函數(shù),也就是當(dāng)你不運(yùn)行程序fig,而調(diào)用.m
文件時(shí)的返回值。
因此,我們要在pjimage_OpeningFcn中添加:的程序,來共享這個(gè)upload_src矩陣。代碼萬分感謝:
setappdata(_pjimage,'image2_src',0)
接著,在m_file_open_Callback函數(shù)的最后寫上不勝感激程序:
setappdata(_pjimage,'image2_src',imageurl_src)
這樣,我們?cè)趍_file_save_Callback函數(shù)中就可以像這樣的來再提取obj_src,不勝感激:
imageurl_srcgetappdata(_pjimage,'imageurl_src')
那么保存到的時(shí)候,恐怕會(huì)用到保存到對(duì)話框了。要用保存對(duì)話框,現(xiàn)在就要都用到uiputfile函數(shù)了,具體的請(qǐng)用help
uiputfile一欄。
那你,存放菜單項(xiàng)下的程序(m_file_save_Callback),是可以這樣的寫:
[filename,
pathname]uiputfile({*.bmp,BMPfiles*.jpg,JPGfiles},Pick anImage)
ifisequal(filename,0)||isequal(pathname,0)
return%要是點(diǎn)了“取消后”
ignore
fpathfullfile(pathname,
filename)%額外全路徑的另一種方法
end
imageurl_srcgetappdata(_pjimage,imageurl_src)%提出再打開圖片的數(shù)據(jù)
imwrite(obj_src,fpath)%需要保存圖片
下面是再次菜單項(xiàng)的程序的。要后退界面,如果能用closed函數(shù)就行了,不過正常情況都會(huì)有提示的。例如你如果沒有參與了處理圖片,而又就沒存放處理后的圖片,那就在關(guān)閉的時(shí)候就應(yīng)該能提供提示,問過是否需要通過存放。但,在這里,我們先不做這個(gè)工作,等后面有需要的時(shí)候再寫吧。并且,這里的退出菜單項(xiàng)的程序那是又說了一句,不勝感激:
close(_pjimage)
其實(shí),用delete函數(shù)也可以的,那是:delete(_pjimage)看你的心情了。
但正常運(yùn)行程序的時(shí)候,你會(huì)發(fā)現(xiàn),當(dāng)你打開圖片的時(shí)候,如果沒有點(diǎn)“可以取消”按鈕,這樣的話在MATLAB的命令窗口會(huì)自動(dòng)彈出錯(cuò)誤,那是而且我們沒有去處理取消后的情況。下面我們來去處理下這個(gè)問題,只需把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)
下面我們來做一個(gè)圖像二值化的一個(gè)圖像處理。用上面的方法去添加一個(gè)“圖像處理”菜單,追加:
在其下面先添加一個(gè)“圖像二值化”的菜單項(xiàng),不勝感激:
接著,再點(diǎn)“可以了”關(guān)閉菜單編輯器,并保存到整個(gè)界面。如果不是我們的.m
文件中沒有不對(duì)應(yīng)的Callback時(shí),我們是可以點(diǎn)擊上圖中的“View”菜單按鈕來生成沉淀一個(gè)Callback函數(shù)。圖像二值化,有一個(gè)閾值的設(shè)置,那么我們是可以空白文檔一個(gè)界面,在這個(gè)界面上放一個(gè)滑動(dòng)條來設(shè)置里圖像二值化的閾值。同樣的,有一個(gè)文本,不顯示當(dāng)前上下移動(dòng)條的值。那你我們新建項(xiàng)一個(gè)空白界面,在它上面畫個(gè)Static
Text和Slider控件,然后再用工具欄的角點(diǎn)工具(AlignObjects),來對(duì)其這兩個(gè)空間。不勝感激:
然后把,將這個(gè)界面需要保存為im2bw_
。整個(gè)設(shè)計(jì)如下:
你可以系統(tǒng)設(shè)置Static
Text的FontSize屬性為10,這樣字體會(huì)更大一點(diǎn)。設(shè)置里Static
Text的Tag屬性為txt_display,系統(tǒng)設(shè)置滾動(dòng)條的Tag屬性為slider_val。為了能在滾動(dòng)條滾動(dòng)時(shí),Static
Text沒顯示滾動(dòng)條的值,需要在滾動(dòng)條的Callback中寫了萬分感謝程序,你可以在滾動(dòng)條上然后點(diǎn)擊右鍵,選擇“ViewCallbacks”下的“Callback”再進(jìn)入滾動(dòng)條的Callback函數(shù)(slider_val_Callback)。
valget(hObject,Value)
set(handles.txt_display,String,num2str(val))
保存到,運(yùn)行程序,就可以不來回滑動(dòng)滾動(dòng)條,而Static
Text變會(huì)總是顯示或者的值。在figure上右鍵點(diǎn)擊先打開figure(有方塊的底層窗口)的屬性窗口,將其Tag屬性設(shè)置里為“figure_im2bw”,將其Name屬性設(shè)置里為“設(shè)置圖像二值化閾值”。接著,需要保存界面。運(yùn)行程序時(shí),不勝感激:
那就,我們想的是,當(dāng)來回滑動(dòng)條滑動(dòng)時(shí),將二值化的圖像不顯示在
中的axes_dst坐標(biāo)軸上的。這樣怎么辦啊呢?簡(jiǎn)單的方法,再做的是,當(dāng)再點(diǎn)擊
菜單“圖像處理”下的“圖像二值化”的時(shí)候,會(huì)可以打開im2bw_
。這會(huì)兒就是我們要?jiǎng)討B(tài)鏈接庫im2bw_args.m
的時(shí)候了。當(dāng)我們內(nèi)部函數(shù)它的時(shí)候,會(huì)返回一個(gè)句柄,而這個(gè)句柄就是正指向先打開的im2bw_
的。麻煩問下更詳細(xì)點(diǎn)的,你可以主要參考文獻(xiàn)im2bw_args.m
文件的最前面的注釋,其中有這樣的寫:
%
HIM2BW_ARGSreturnsthehandledidanewIM2BW_ARGS同問thehandlewant
%the
existing
singleton*.
那你只能證明,我們可以睽車志的先打開im2bw_
。所以在“圖像二值化”的Callback函數(shù)(m_image_2bw_Callback)下,寫上萬分感謝的程序:
him2bw_args
后再,需要保存另外那就是,建議將im2bw_
和
保存在一個(gè)目錄下面。接著,運(yùn)行
,可以看見,當(dāng)再點(diǎn)擊“圖像二值化”的時(shí)候會(huì)先打開im2bw_,同樣的滑動(dòng)條滑動(dòng)時(shí)也會(huì)顯示發(fā)令的值。
下面來告訴我怎么在來回滑動(dòng)條滑動(dòng)時(shí),將滑動(dòng)后的二值化圖像會(huì)顯示到pjimage的axes_dst坐標(biāo)軸中。
簡(jiǎn)單的方法,我們要我得到pjimage的figure的句柄,這個(gè)可以不實(shí)際findobj函數(shù)來完成,之后將返回值用guihandles來可以轉(zhuǎn)換成一個(gè)句柄。之后,就可以不用這個(gè)轉(zhuǎn)化后的句柄來摘錄
中的任何一個(gè)控件了。所以,我們?cè)趇m2bw_
下的滑動(dòng)條的Callback函數(shù)中先添加:函數(shù):
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)
后再,保存到,運(yùn)行程序。效果萬分感謝:
可是,如果不是在我們也沒再打開圖片的情況下,就算點(diǎn)擊了“圖像二值化”會(huì)出現(xiàn)什么問題呢?可以清晰的看到不顯示的圖像是全黑的,全部沒有意義。因此,我們可以在是沒有然后點(diǎn)擊“打開”菜單項(xiàng)的時(shí)候,使“圖像處理”菜單不可用。
那么在pjimage.m
的OpeningFcn中,直接添加萬分感謝程序:
set(handles.m_image,Enable,back)
在“先打開”菜單項(xiàng)的Callback函數(shù)的最后,去添加不勝感激程序:
set(handles.m_image,Enable,on)
這樣的話,只要你不點(diǎn)“先打開”,就不能用“圖像處理”菜單中的命令,效果不勝感激:
直接點(diǎn)擊“打開”之后,就能使用了。
下面,我們來告訴我前面的問題,那是去問如何確定保存圖片的問題。簡(jiǎn)單的方法,我們要設(shè)置里兩個(gè)標(biāo)志:一個(gè)是圖片是否需要被如何處理過了,二是圖片是否被保存到了。那你我們?cè)趐jimage_OpeningFcn中,先添加如下的兩個(gè)應(yīng)用程序數(shù)據(jù)。
setappdata(_pjimage,bSave,false)
setappdata(_pjimage,bChanged,false)
接著在“圖像二值化”菜單項(xiàng)的Callback函數(shù)中,變化bChanged的值為true,即去添加不勝感激程序:
setappdata(_pjimage,bChanged,true)
的原因我們要需要保存的是坐標(biāo)軸axes_dst中的圖像,而我們“文件”下的“需要保存”,實(shí)質(zhì)上保存的是坐標(biāo)軸axes_src中的圖像,那該怎么辦啊呢?只得再先添加一個(gè)“需要保存”菜單項(xiàng)了。這回,我們?cè)谧鴺?biāo)軸axes_dst中添加右鍵菜單。
打開工具欄的菜單編輯器,你選擇Context
Menu(上下文菜單),萬分感謝:
然后把,新建任務(wù)一個(gè)Context
Menu,其Tag屬性為:axes_dst_menu,不勝感激:
然后為其添加菜單項(xiàng):“能保存”,其Tag屬性為axes_dst_menu_save.如上圖。然后,在坐標(biāo)軸axes_dst上右鍵,選擇“PropertyInspector”。將該坐標(biāo)軸的UIContextMenu屬性更改為axes_dst_menu.
如下圖:
接著,保存,運(yùn)行。在axes_dst上點(diǎn)右鍵就能看到“存放”菜單了。下面來寫其函數(shù)。
[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)
不過然后你會(huì)發(fā)現(xiàn),沒有寫入到圖片之前,在axes_dst點(diǎn)右鍵是有菜單的,若是二值化之后,再一次點(diǎn)右鍵就沒有菜單了。
只不過,當(dāng)我們把右鍵菜單axes_dst_menu,去添加到figure窗口(在沒有控件的地方,鼠標(biāo)雙擊,即可然后打開figure的屬性窗口)的UIContextMenu的時(shí)候,就不可能再次出現(xiàn)上面的問題,不過一切運(yùn)行算正常。畢竟,當(dāng)你去添加到axes_dst之后,否則的話坐標(biāo)軸的內(nèi)容決定,變會(huì)將右鍵菜單只附加到父對(duì)象上。所以,要是當(dāng)然是需要在坐標(biāo)軸上不顯示右鍵菜單,還要程序創(chuàng)建戰(zhàn)隊(duì)了。怎么創(chuàng)建,咱們先再說,先說說把坐標(biāo)軸axes_dst保存到完畢后,逃離程序的時(shí)候的處理。
將以前的m_file_exit_Callback可以修改為如下程序:
bChangedgetappdata(_pjimage,bChanged)%完成是否更改
bSavegetappdata(_pjimage,bSave)%完成如何確定需要保存
if
bChangedtrueampampbSavefalse,%改了,而沒保存到時(shí)
btnNamequestdlg(您也你要改了圖片,但也沒保存。要存放嗎?,提示,保存,不保存到,需要保存)%用提問對(duì)話框
switchbtnName,
case保存,%不能執(zhí)行axes_dst_menu_save_Callback的功能
feval(@axes_dst_menu_save_Callback,_dst_menu_save,eventdata,handles)
case不保存,%什么也不做
end
end
hfindobj(Tag,figure_im2bw)%查找有無可以打開設(shè)置里圖像二值化參數(shù)窗口
if
~isempty(h),%找不到的話,則關(guān)了
closed(h)
end
close(findobj(Tag,figure_pjimage))%關(guān)掉主窗口
下面來為程序先添加一個(gè)工具欄,右鍵單擊工具欄上那個(gè)的ToolbarEditor,先打開::
選擇“PredefinedTools”下的Open,再點(diǎn)“Add”。又一次你選“Save”,點(diǎn)擊“Add”。并將Open選擇按鈕的Tag屬性更改為tbl_open,Save按鈕的Tag屬性更改為tbl_save,萬分感謝:
點(diǎn)“View”,來可以找到Open設(shè)置按鈕的Callback,在它的下面來動(dòng)態(tài)鏈接庫菜單中的然后打開菜單項(xiàng)的Callback,是需要在Open設(shè)置按鈕的Callback下隨手寫下不勝感激程序:
feval(@m_file_open_Callback,handles.m_file_open,eventdata,handles)
用則是的方法,不能找到Save按鈕的Callback,并在它的下面寫上保存到程序,可是,我們要判斷看看你是不是上次需要保存,如果沒有是,則用存放對(duì)話框;如果不是,我們就保存到在第二次能保存的路徑中就可以了。那么,我們我還是必須系統(tǒng)設(shè)置幾個(gè)應(yīng)用程序數(shù)據(jù)的,第一個(gè)應(yīng)該是資料記錄有無是一次能保存,第二個(gè)是記錄一次保存的路徑。這樣的話,我們?cè)趐jimage_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”按鈕都萬不可用,只能直接點(diǎn)擊“文件”下的“再打開”或工具欄下的“打開”的時(shí)候,它們才可用。那就不需要在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)
那樣的話一個(gè)小程序,算是成功了。
如果您能明確的上面的步驟交了任務(wù)這個(gè)小小的程序的話,這樣的話界面編程中的問題你早掌握到的也差不多了。