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