MFC之很重要的地方之輸入焦點的傳遞

2021-07-04 04:59:06 字數 4313 閱讀 1061

這裡的目的是為了實現 多行編輯框之間的焦點迴圈,

這裡其實我以前是弄懂了,但是現在想做的時候突然又記不起來咋做了;

hwnd setfocus(hwnd hwnd);

這裡是設定焦點來實現;

還有乙個就是hwnd getnextwindow(hwnd hwnd,uint wcmd);

wcmd可以設定為 gw_hwndnext;

這個函式是得到下乙個視窗的控制代碼;

cwnd::getwindow

cwnd* getwindow( uint ncmd ) const;

返回值:

返回要求的視窗指標;如果沒有,則返回null。

返回的指標可能是臨時的,不應儲存以供將來使用。

引數:

ncmd

指定了cwnd和返回的視窗之間的關係。可以取下列值之一:

·gw_child

標識了cwnd的第乙個子視窗。

·gw_hwndfirst

如果cwnd是乙個子視窗,則返回它的第乙個兄弟視窗;否則返回列表中的第乙個頂層視窗。

·gw_hwndlast

如果cwnd是乙個子視窗,則返回最後乙個兄弟視窗;否則返回列表中的最後乙個頂層視窗。

·gw_hwndnext

返回視窗管理器中的下乙個視窗。

·gw_hwndprev

返回視窗管理器中的前乙個視窗。

·gw_owner

標識了cwnd的擁有者。 

cwnd::setwindowpos

bool setwindowpos(

const cwnd* pwndinsertafter,

int x, int y,

int cx, int cy,

uint nflags

);返回值:如果函式成功,則返回非零值;否則返回0。

引數:

pwndinsertafter

標識了在z軸次序上位於這個cwnd物件之前的cwnd物件。這個引數可以是指向cwnd物件的指標,也可以是指向下列值的指標:

wndbottom

將視窗放在z軸次序的底部。如果這個cwnd是乙個頂層視窗,則視窗將失去它的頂層狀態;系統將這個視窗放在其它所有視窗的底部。

wndtop

將視窗放在z軸次序的頂部。

wndtopmost

將視窗放在所有非頂層視窗的上面。這個視窗將保持它的頂層位置,即使它失去了活動狀態。

wndnotopmost

將視窗重新定位到所有非頂層視窗的頂部(這意味著在所有的頂層視窗之下)。這個標誌對那些已經是非頂層視窗的視窗沒有作用。

有關這個函式以及這些引數的使用規則參見說明部分。 x

指定了視窗左邊的新位置。

y指定了視窗頂部的新位置。

cx指定了視窗的新寬度。

cy指定了視窗的新高度。

nflags

指定了大小和位置選項。這個引數可以是下列值的組合:

swp_drawframe

圍繞視窗畫出邊框(在建立視窗的時候定義)。

swp_framechanged

向視窗傳送一條wm_nccalcsize訊息,即使視窗的大小不會改變。如果沒有指定這個標誌,則僅當視窗的大小發生變化時才傳送wm_nccalcsize訊息。

swp_hidewindow

隱藏視窗。

swp_noactivate

不啟用視窗。如果沒有設定這個標誌,則視窗將被啟用並移動到頂層或非頂層視窗組(依賴於pwndinsertafter引數的設定)的頂部。

swp_nocopybits

廢棄這個客戶區的內容。如果沒有指定這個引數,則客戶區的有效內容將被儲存,並在視窗的大小或位置改變以後被拷貝回客戶區。

swp_nomove

保持當前的位置(忽略x和y引數)。

swp_noownerzorder

不改變擁有者視窗在z軸次序上的位置。

swp_noredraw

不重畫變化。如果設定了這個標誌,則不發生任何種類的變化。這適用於客戶區、非客戶區(包括標題和滾動條)以及被移動視窗覆蓋的父視窗的任何部分。當這個標誌被設定的時候,應用程式必須明確地無效或重畫要重畫的視窗和父視窗的任何部分。

swp_noreposition

與swp_noownerzorder相同。

swp_nosendchanging

防止視窗接收wm_windowposchanging訊息。

swp_nosize

保持當前的大小(忽略cx和cy引數)。

swp_nozorder

保持當前的次序(忽略pwndinsertafter)。

swp_showwindow

顯示視窗。

說明:呼叫這個成員函式以改變子視窗、彈出視窗和頂層視窗的大小、位置和z軸次序。

視窗在螢幕上按照它們的z軸次序排序。在z軸次序上處於頂端的視窗將程式在所有其它視窗的頂部。

子視窗的所有座標都是客戶座標(相對于父視窗客戶區的左上角)。

視窗可以被移動到z軸次序的頂部,既可以通過將pwndinsertafter引數設為&wndtopmost,並確保沒有設定swp_nozorder標誌,也可以通過設定視窗的z軸次序使它位於所有現存的頂層視窗上方。當乙個非頂層視窗被設為頂層視窗時,它擁有的視窗也被設為頂層的。它的擁有者不發生變化。

如果頂層視窗被重新定位到z軸次序的底部(&wndbottom)或任何非頂層視窗之後,則它將不再是頂層視窗。當頂層視窗被變為非頂層視窗時,它所有的擁有者和它擁有的所有視窗都被變為非頂層視窗。

如果既沒有指定swp_noactive標誌也沒有指定swp_nozorder標誌(這意味著應用程式要求視窗被同時啟用並放入指定的z軸次序),則pwndinsertafter引數中指定的值將只在下列環境下適用:

·在pwndinsertafter引數中既沒有指定&wndtopmost也沒有指定&wndnotopmost。

·這個視窗不是活動視窗。

應用程式不能啟用乙個非活動視窗但同時又不把它帶到z軸次序的頂部。應用程式可以沒有任何限制地改變活動視窗的z軸次序。

非頂層視窗可能擁有乙個頂層視窗,但是反之則不成立。任何被頂層視窗擁有的視窗(例如對話方塊)都將自己變為頂層視窗,以確保所有被擁有的視窗位於它們的擁有者上方。

在windows 3.1或更新的版本中,可以將視窗移動到z軸次序的頂部,並通過設定它們的ws_ex_topmost風格而將之鎖定在那裡。這種頂層視窗即使在失去活動狀態以後也會保持頂層位置。例如,選擇winhelp的always on top命令會使幫助視窗變為頂層,並且在你返回應用程式之後它還保持可見。

要建立乙個頂層視窗,應在呼叫setwindowpos的時候將pwndinsertafter引數設為&wndtopmost,或者在建立視窗的時候設定ws_ex_topmost風格。

如果z軸次序中包含了任何具有ws_ex_topmost風格的視窗,則用&wndtopmost移動的視窗將被放到所有非頂層視窗的頂部,但是位於任何頂層視窗的下面。當應用程式啟用乙個不具有ws_ex_topmost風格的非活動視窗時,該視窗將被移動到所有非頂層視窗的上方,但是位於所有頂層視窗的下方。

如果在呼叫setwindowpos的時候pwndinsertafter引數被設為&wndbottom,並且cwnd是乙個頂層視窗,則該視窗失去頂層狀態(ws_ex_bottom風格被清除),並且

然後最終使用

setfocus(getnextwindows(hwnd,gw_hwndnext);

這裡就可以設定hwnd的視窗的下乙個焦點

這裡說一下tab屬性

tab屬性就是在按下tab之後自動編輯框可以接收此訊息;

還有個函式就是hwnd getnextdlgtabitem(hwnd hdlg,hwnd hctl,bool bprevious);

hdlg 指定被搜尋的對話方塊;

hctl 指定用來作為搜尋的開始點的控制項

bprevious 

指定的搜尋方向。如果此引數設定為true;則該函式將尋找對話方塊中的乙個控制項,此引數為false 則該函式將搜尋對話方塊的下乙個控制項;

setfocus(::getnextdlgtabitem(::getparent(hwnd),hwnd,false));

還有乙個函式這樣也可以達到目的;

getdlgitem(idc_edit)->getnextwindow()->setfocus();

cwnd* getnextwindow(unit nflag = gw_hwndnext)const

getnextdlgtabitem(getfocus()->setfocus());

輸入焦點就可以轉移到此控制項上來;

還有在dlg及其子控制項建立完成,將要顯示乙個訊息,

wm_initdialog因此,再次訊息的響應函式中修改編輯框控制項的視窗比較合適

C C之易犯錯的地方

1 cin char str new char 100 cin str cout str endl 例如 輸入 ajfgjsfg djfhsdjgh sdjgsdjgj 輸出 ajfgjsfg說明cin讀取到直到遇到空格。2 strlen char str1 cout strlen str1 end...

MFC之基本的檔案操作

1.我們要做的乙個demo是建立文字檔案並進行讀寫資料的操作 cfile類是mfc中檔案操作的積累,他派生自cobject,直接提供二進位制檔案的輸入輸出服務。本例將介紹如何使用cfile類進行將編輯框中的文字儲存好txt檔案中,並可以進行檔案的讀取操作。寫入檔案的 如下 讀取檔案的 如下 注意 在...

python之字元編碼的重要思想

1 保證不亂碼的核心法則就是,字元按照什麼標準而編碼的,就要按照什麼標準解碼,此處的標準指的就是字元編碼 2 在記憶體中寫的所有字元,一視同仁,都是unicode編碼,比如我們開啟編輯器,輸入乙個 你 我們並不能說 你 就是乙個漢字,此時它僅僅只是乙個符號,該符號可能很多國家都在使用,根據我們使用的...