亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Visual C++/MFC入門教程(四)

2019-11-17 05:19:26
字體:
來源:轉載
供稿:網友
4.2 Static Box靜態文本控件的功能比較簡單,可作為顯示字符串,圖標,位圖用。創建一個窗口可以使用成員函數:
BOOL CStatic::Create( LPCTSTR lpszText, DWord dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID = 0xffff );
其中dwStyle將指明該窗口的風格,除了子窗口常用的風格WS_CHILD,WS_VISIBLE外,你可以針對靜態控件指明專門的風格。
  • SS_CENTER,SS_LEFT,SS_RIGHT 指明字符顯示的對齊方式。
  • SS_GRAYRECT 顯示一個灰色的矩形
  • SS_NOPREFIX 假如指明該風格,對于字符&將直接顯示,否則&將作為轉義符,&將不顯示而在其后的字符將有下劃線,假如需要直接顯示&必須使用&&表示。
  • SS_BITMAP 顯示位圖
  • SS_ICON 顯示圖標
  • SS_CENTERIMAGE 圖象居中顯示
控制顯示的文本利用成員函數SetWindowText/GetWindowText用于設置/得到當前顯示的文本??刂骑@示的圖標利用成員函數SetIcon/GetIcon用于設置/得到當前顯示的圖標??刂骑@示的位圖利用成員函數SetBitmap/GetBitmap用于設置/得到當前顯示的位圖。下面一段代碼演示如何創建一個顯示位圖的靜態窗口并設置位圖CStatic* pstaDis=new CStatic;pstaDis->Create("",WS_CHILDWS_VISIBLESS_BITMAPSSCENTERIMAGE,CRect(0,0,40,40),pWnd,1);CBitmap bmpLoad;bmpLoad.LoadBitmap(IDB_TEST);pstaDis->SetBitmap(bmpLoad.Detach()); 4.2 Static Box靜態文本控件的功能比較簡單,可作為顯示字符串,圖標,位圖用。創建一個窗口可以使用成員函數:
BOOL CStatic::Create( LPCTSTR lpszText, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID = 0xffff );
其中dwStyle將指明該窗口的風格,除了子窗口常用的風格WS_CHILD,WS_VISIBLE外,你可以針對靜態控件指明專門的風格。
  • SS_CENTER,SS_LEFT,SS_RIGHT 指明字符顯示的對齊方式。
  • SS_GRAYRECT 顯示一個灰色的矩形
  • SS_NOPREFIX 假如指明該風格,對于字符&將直接顯示,否則&將作為轉義符,&將不顯示而在其后的字符將有下劃線,假如需要直接顯示&必須使用&&表示。
  • SS_BITMAP 顯示位圖
  • SS_ICON 顯示圖標
  • SS_CENTERIMAGE 圖象居中顯示
控制顯示的文本利用成員函數SetWindowText/GetWindowText用于設置/得到當前顯示的文本??刂骑@示的圖標利用成員函數SetIcon/GetIcon用于設置/得到當前顯示的圖標??刂骑@示的位圖利用成員函數SetBitmap/GetBitmap用于設置/得到當前顯示的位圖。下面一段代碼演示如何創建一個顯示位圖的靜態窗口并設置位圖CStatic* pstaDis=new CStatic;pstaDis->Create("",WS_CHILDWS_VISIBLESS_BITMAPSSCENTERIMAGE,CRect(0,0,40,40),pWnd,1);CBitmap bmpLoad;bmpLoad.LoadBitmap(IDB_TEST);pstaDis->SetBitmap(bmpLoad.Detach()); 4.3 Edit BoxEdit窗口是用來接收用戶輸入最常用的一個控件。創建一個輸入窗口可以使用成員函數:
BOOL CEdit::Create( LPCTSTR lpszText, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID = 0xffff );
其中dwStyle將指明該窗口的風格,除了子窗口常用的風格WS_CHILD,WS_VISIBLE外,你可以針對輸入控件指明專門的風格。
  • ES_AUTOHSCROLL,ES_AUTOVSCROLL 指明輸入文字超出顯示范圍時自動滾動。
  • ES_CENTER,ES_LEFT,ES_RIGHT 指定對齊方式
  • ES_MULTILINE 是否答應多行輸入
  • ES_PASSWORD 是否為密碼輸入框,假如指明該風格則輸入的文字顯示為*
  • ES_READONLY 是否為只讀
  • ES_UPPERCASE,ES_LOWERCASE 顯示大寫/小寫字符
控制顯示的文本利用成員函數SetWindowText/GetWindowText用于設置/得到當前顯示的文本。通過GetLimitText/SetLimitText可以得到/設置在輸入框中輸入的字符數量。由于在輸入時用戶可能選擇某一段文本,所以通過void CEdit::GetSel( int& nStartChar, int& nEndChar )得到用戶選擇的字符范圍,通過調用void CEdit::SetSel( int nStartChar, int nEndChar, BOOL bNoScroll = FALSE )可以設置當前選擇的文本范圍,假如指定nStartChar=0 nEndChar=-1則表示選中所有的文本。void ReplaceSel( LPCTSTR lpszNewText, BOOL bCanUndo = FALSE )可以將選中的文本替換為指定的文字。
此外輸入框還有一些和剪貼板有關的功能,void Clear( );刪除選中的文本,void Copy( );可將選中的文本送入剪貼板,void Paste( );將剪貼板中內容插入到當前輸入框中光標位置,void Cut( );相當于Copy和Clear結合使用。最后介紹一下輸入框幾種常用的消息映射宏:
  • ON_EN_CHANGE 輸入框中文字更新后產生
  • ON_EN_ERRSPACE 輸入框無法分配內存時產生
  • ON_EN_KILLFOCUS / ON_EN_SETFOCUS 在輸入框失去/得到輸入焦點時產生
使用以上幾種消息映射的方法為定義原型如:afx_msg void memberFxn( );的函數,并且定義形式如ON_Notification( id, memberFxn )的消息映射。假如在對話框中使用輸入框,Class Wizard會自動列出相關的消息,并能自動產生消息映射代碼。 4.4 Scroll BarScroll Bar一般不會單獨使用,因為SpinCtrl可以取代滾動條的一部分作用,但是假如你需要自己生成派生窗口,滾動條還是會派上一些用場。創建一個滾動條可以使用成員函數: :
BOOL CEdit::Create( LPCTSTR lpszText, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID = 0xffff );
其中dwStyle將指明該窗口的風格,除了子窗口常用的風格WS_CHILD,WS_VISIBLE外,你可以針對滾動條指明專門的風格。
  • SBS_VERT 風格將創建一個垂直的滾動條。
  • SBS_HORZ 風格將創建一個水平的滾動條。
在創建滾動條后需要調用void SetScrollRange( int nMinPos, int nMaXPos, BOOL bRedraw = TRUE )設置滾動范圍,
int GetScrollPos( )/int SetScrollPos( )用來得到和設置當前滾動條的位置。void ShowScrollBar( BOOL bShow = TRUE );用來顯示/隱藏滾動條。BOOL EnableScrollBar( UINT nArrowFlags = ESB_ENABLE_BOTH )用來設置滾動條上箭頭是否為答應狀態。nArrowFlags可取以下值:
  • ESB_ENABLE_BOTH 兩個箭頭都為答應狀態
  • ESB_DISABLE_LTUP 上/左箭頭為禁止狀態
  • ESB_DISABLE_RTDN 下/右箭頭為禁止狀態
  • ESB_DISABLE_BOTH 兩個箭頭都為禁止狀態
假如需要在滾動條位置被改變時得到通知,需要在父窗口中定義對消息WM_VSCROLL/WM_HSCROLL的映射。方法為在父窗口類中重載
afx_msg void OnVScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar )/afx_msg void OnHScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar )
所使用的消息映射宏為:ON_WM_VSCROLL( ),ON_WM_HSCROLL( ),在映射宏中不需要指明滾動條的ID,因為所有滾動條的滾動消息都由同樣的函數處理。在OnHScroll/OnVScroll的第三個參數會指明當前滾動條的指針。第一個參數表示滾動條上發生的動作,可取以下值:
  • SB_TOP/SB_BOTTOM 已滾動到頂/底部
  • SB_LINEUP/SB_LINEDOWN 向上/下滾動一行
  • SB_PAGEDOWN/SB_PAGEUP 向上/下滾動一頁
  • SB_THUMBPOSITION/SB_THUMBTRACK 滾動條拖動到某一位置,參數nPos指明當前位置(參數nPos在其它的情況下是無效的)
  • SB_ENDSCROLL 滾動條拖動完成(用戶松開鼠標)
4.5 List Box/Check List BoxListBox窗口用來列出一系列的文本,每條文本占一行。創建一個列表窗口可以使用成員函數:
BOOL CListBox::Create( LPCTSTR lpszText, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID = 0xffff );
其中dwStyle將指明該窗口的風格,除了子窗口常用的風格WS_CHILD,WS_VISIBLE外,你可以針對列表控件指明專門的風格。
  • LBS_MULTipLESEL 指明列表框可以同時選擇多行
  • LBS_EXTENDEDSEL 可以通過按下Shift/Ctrl鍵選擇多行
  • LBS_SORT 所有的行按照字母順序進行排序
在列表框生成后需要向其中加入或是刪除行,可以利用:
int AddString( LPCTSTR lpszItem )添加行,
int DeleteString( UINT nIndex )刪除指定行,
int InsertString( int nIndex, LPCTSTR lpszItem )將行插入到指定位置。
void ResetContent( )可以刪除列表框中所有行。
通過調用int GetCount( )得到當前列表框中行的數量。 假如需要得到/設置當前被選中的行,可以調用int GetCurSel( )/int SetCurSel(int iIndex)。假如你指明了選擇多行的風格,你就需要先調用int GetSelCount( )得到被選中的行的數量,然后int GetSelItems( int nMaxItems, LPINT rgIndex )得到所有選中的行,參數rgIndex為存放被選中行的數組。通過調用int GetLBText( int nIndex, LPTSTR lpszText )得到列表框內指定行的字符串。
此外通過調用int FindString( int nStartAfter, LPCTSTR lpszItem )可以在當前所有行中查找指定的字符傳的位置,nStartAfter指明從那一行開始進行查找。
int SelectString( int nStartAfter, LPCTSTR lpszItem )可以選中包含指定字符串的行。在MFC 4.2版本中添加了CCheckListBox類,該類是由CListBox派生并擁有CListBox的所有功能,不同的是可以在每行前加上一個檢查框。必須注重的是在創建時必須指明LBS_OWNERDRAWFIXED或LBS_OWNERDRAWVARIABLE風格。通過void SetCheckStyle( UINT nStyle )/UINT GetCheckStyle( )可以設置/得到檢查框的風格,關于檢查框風格可以參考4.1 Button中介紹。通過void SetCheck( int nIndex, int nCheck )/int GetCheck( int nIndex )可以設置和得到某行的檢查狀態,關于檢查框狀態可以參考4.1 Button中介紹。最后介紹一下列表框幾種常用的消息映射宏:
  • ON_LBN_DBLCLK 鼠標雙擊
  • ON_EN_ERRSPACE 輸入框無法分配內存時產生
  • ON_EN_KILLFOCUS / ON_EN_SETFOCUS 在輸入框失去/得到輸入焦點時產生
  • ON_LBN_SELCHANGE 選擇的行發生改變
使用以上幾種消息映射的方法為定義原型如:afx_msg void memberFxn( );的函數,并且定義形式如ON_Notification( id, memberFxn )的消息映射。假如在對話框中使用列表框,Class Wizard會自動列出相關的消息,并能自動產生消息映射代碼。

4.6 Combo Box/Combo Box Ex組合窗口是由一個輸入框和一個列表框組成。創建一個組合窗口可以使用成員函數:
BOOL CListBox::Create( LPCTSTR lpszText, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID = 0xffff );
其中dwStyle將指明該窗口的風格,除了子窗口常用的風格WS_CHILD,WS_VISIBLE外,你可以針對列表控件指明專門的風格。
  • CBS_DROPDOWN 下拉式組合框
  • CBS_DROPDOWNLIST 下拉式組合框,但是輸入框內不能進行輸入
  • CBS_SIMPLE 輸入框和列表框同時被顯示
  • LBS_SORT 所有的行按照字母順序進行排序
由于組合框內包含了列表框,所以列表框的功能都能夠使用,如可以利用:
int AddString( LPCTSTR lpszItem )添加行,
int DeleteString( UINT nIndex )刪除指定行,
int InsertString( int nIndex, LPCTSTR lpszItem )將行插入到指定位置。
void ResetContent( )可以刪除列表框中所有行。
通過調用int GetCount( )得到當前列表框中行的數量。 假如需要得到/設置當前被選中的行的位置,可以調用int GetCurSel( )/int SetCurSel(int iIndex)。通過調用int GetLBText( int nIndex, LPTSTR lpszText )得到列表框內指定行的字符串。此外通過調用int FindString( int nStartAfter, LPCTSTR lpszItem )可以在當前所有行中查找指定的字符傳的位置,nStartAfter指明從那一行開始進行查找。
int SelectString( int nStartAfter, LPCTSTR lpszItem )可以選中包含指定字符串的行。此外輸入框的功能都能夠使用,如可以利用:
DWORD GetEditSel( ) /BOOL SetEditSel( int nStartChar, int nEndChar )得到或設置輸入框中被選中的字符位置。
BOOL LimitText( int nMaxChars )設置輸入框中可輸入的最大字符數。
輸入框的剪貼板功能Copy,Clear,Cut,Paste動可以使用。 最后介紹一下列表框幾種常用的消息映射宏:
  • ON_CBN_DBLCLK 鼠標雙擊
  • ON_CBN_DROPDOWN 列表框被彈出
  • ON_CBN_KILLFOCUS / ON_CBN_SETFOCUS 在輸入框失去/得到輸入焦點時產生
  • ON_CBN_SELCHANGE 列表框中選擇的行發生改變
  • ON_CBN_EDITUPDATE 輸入框中內容被更新
使用以上幾種消息映射的方法為定義原型如:afx_msg void memberFxn( );的函數,并且定義形式如ON_Notification( id, memberFxn )的消息映射。假如在對話框中使用組合框,Class Wizard會自動列出相關的消息,并能自動產生消息映射代碼。
4.7 Tree Ctrl樹形控件TreeCtrl和下節要講的列表控件 ListCtrl在系統中大量被使用,例如Windows資源治理器就是一個典型的例子。樹形控件可以用于樹形的結構,其中有一個根接點(Root)然后下面有許多子結點,而每個子結點上有答應有一個或多個或沒有子結點。MFC中使用CTreeCtrl類來封裝樹形控件的各種操作。通過調用
BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );創建一個窗口,dwStyle中可以使用以下一些樹形控件的專用風格:
  • TVS_HASLINES 在父/子結點之間繪制連線
  • TVS_LINESATROOT 在根/子結點之間繪制連線
  • TVS_HASBUTTONS 在每一個結點前添加一個按鈕,用于表示當前結點是否已被展開
  • TVS_EDITLABELS 結點的顯示字符可以被編輯
  • TVS_SHOWSELALWAYS 在失去焦點時也顯示當前選中的結點
  • TVS_DISABLEDRAGDROP 不答應Drag/Drop
  • TVS_NOTOOLTIPS 不使用ToolTip顯示結點的顯示字符
在樹形控件中每一個結點都有一個句柄(HTREEITEM),同時添加結點時必須提供的參數是該結點的父結點句柄,(其中根Root結點只有一個,既不可以添加也不可以刪除)利用
HTREEITEM InsertItem( LPCTSTR lpszItem, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST );可以添加一個結點,pszItem為顯示的字符,hParent代表父結點的句柄,當前添加的結點會排在hInsertAfter表示的結點的后面,返回值為當前創建的結點的句柄。下面的代碼會建立一個如下形式的樹形結構: +--- Parent1 +--- Child1_1 +--- Child1_2 +--- Child1_3+--- Parent2+--- Parent3/*假設m_tree為一個CTreeCtrl對象,而且該窗口已經創建*/HTREEITEM hItem,hSubItem;hItem = m_tree.InsertItem("Parent1",TVI_ROOT);在根結點上添加Parent1hSubItem = m_tree.InsertItem("Child1_1",hItem);//在Parent1上添加一個子結點hSubItem = m_tree.InsertItem("Child1_2",hItem,hSubItem);//在Parent1上添加一個子結點,排在Child1_1后面hSubItem = m_tree.InsertItem("Child1_3",hItem,hSubItem);hItem = m_tree.InsertItem("Parent2",TVI_ROOT,hItem); hItem = m_tree.InsertItem("Parent3",TVI_ROOT,hItem); 假如你希望在每個結點前添加一個小圖標,就必需先調用CImageList* SetImageList( CImageList * pImageList, int nImageListType );指明當前所使用的ImageList,nImageListType為TVSIL_NORMAL。在調用完成后控件中使用圖片以設置的ImageList中圖片為準。然后調用
HTREEITEM InsertItem( LPCTSTR lpszItem, int nImage, int nSelectedImage, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST);添加結點,nImage為結點沒被選中時所使用圖片序號,nSelectedImage為結點被選中時所使用圖片序號。下面的代碼演示了ImageList的設置。 /*m_list 為CImageList對象IDB_TREE 為16*(16*4)的位圖,每個圖片為16*16共4個圖標*/m_list.Create(IDB_TREE,16,4,RGB(0,0,0));m_tree.SetImageList(&m_list,TVSIL_NORMAL);m_tree.InsertItem("Parent1",0,1);//添加,選中時顯示圖標1,未選中時顯示圖標0此外CTreeCtrl還提供了一些函數用于得到/修改控件的狀態。
HTREEITEM GetSelectedItem( );將返回當前選中的結點的句柄。BOOL SelectItem( HTREEITEM hItem );將選中指明結點。
BOOL GetItemImage( HTREEITEM hItem, int& nImage, int& nSelectedImage ) / BOOL SetItemImage( HTREEITEM hItem, int nImage, int nSelectedImage )用于得到/修改某結點所使用圖標索引。
CString GetItemText( HTREEITEM hItem ) /BOOL SetItemText( HTREEITEM hItem, LPCTSTR lpszItem );用于得到/修改某一結點的顯示字符。
BOOL DeleteItem( HTREEITEM hItem );用于刪除某一結點,BOOL DeleteAllItems( );將刪除所有結點。 此外假如想遍歷樹可以使用下面的函數:
HTREEITEM GetRootItem( );得到根結點。
HTREEITEM GetChildItem( HTREEITEM hItem );得到子結點。
HTREEITEM GetPrevSiblingItem/GetNextSiblingItem( HTREEITEM hItem );得到指明結點的上/下一個兄弟結點。
HTREEITEM GetParentItem( HTREEITEM hItem );得到父結點。 樹形控件的消息映射使用ON_NOTIFY宏,形式如同:ON_NOTIFY( wNotifyCode, id, memberFxn ),wNotifyCode為通知代碼,id為產生該消息的窗口ID,memberFxn為處理函數,函數的原型如同void OnXXXTree(NMHDR* pNMHDR, LRESULT* pResult),其中pNMHDR為一數據結構,在具體使用時需要轉換成其他類型的結構。對于樹形控件可能取值和對應的數據結構為:
  • TVN_SELCHANGED 在所選中的結點發生改變后發送,所用結構:NMTREEVIEW
  • TVN_ITEMEXPANDED 在某結點被展開后發送,所用結構:NMTREEVIEW
  • TVN_BEGINLABELEDIT 在開始編輯結點字符時發送,所用結構:NMTVDISPINFO
  • TVN_ENDLABELEDIT 在結束編輯結點字符時發送,所用結構:NMTVDISPINFO
  • TVN_GETDISPINFO 在需要得到某結點信息時發送,(如得到結點的顯示字符)所用結構:NMTVDISPINFO
關于ON_NOTIFY有很多內容,將在以后的內容中進行具體講解。 關于動態提供結點所顯示的字符:首先你在添加結點時需要指明lpszItem參數為:LPSTR_TEXTCALLBACK。在控件顯示該結點時會通過發送TVN_GETDISPINFO來取得所需要的字符,在處理該消息時先將參數pNMHDR轉換為LPNMTVDISPINFO,然后填充其中item.pszText。但是我們通過什么來知道該結點所對應的信息呢,我的做法是在添加結點后設置其lParam參數,然后在提供信息時利用該參數來查找所對應的信息。下面的代碼說明了這種方法: char szOut[8][3]={"No.1","No.2","No.3"};//添加結點HTREEITEM hItem = m_tree.InsertItem(LPSTR_TEXTCALLBACK,...)m_tree.SetItemData(hItem, 0 );hItem = m_tree.InsertItem(LPSTR_TEXTCALLBACK,...)m_tree.SetItemData(hItem, 1 );//處理消息void CParentWnd::OnGetDispInfoTree(NMHDR* pNMHDR, LRESULT* pResult){ TV_DISPINFO* pTVDI = (TV_DISPINFO*)pNMHDR; pTVDI->item.pszText=szOut[pTVDI->item.lParam];//通過lParam得到需要顯示的字符在數組中的位置 *pResult = 0;}關于編輯結點的顯示字符:首先需要設置樹形控件的TVS_EDITLABELS風格,在開始編輯時該控件將會發送TVN_BEGINLABELEDIT,你可以通過在處理函數中返回TRUE來取消接下來的編輯,在編輯完成后會發送TVN_ENDLABELEDIT,在處理該消息時需要將參數pNMHDR轉換為LPNMTVDISPINFO,然后通過其中的item.pszText得到編輯后的字符,并重置顯示字符。假如編輯在中途中取消該變量為NULL。下面的代碼說明如何處理這些消息: //處理消息 TVN_BEGINLABELEDITvoid CParentWnd::OnBeginEditTree(NMHDR* pNMHDR, LRESULT* pResult){ TV_DISPINFO* pTVDI = (TV_DISPINFO*)pNMHDR; if(pTVDI->item.lParam==0);//判定是否取消該操作 *pResult = 1; else *pResult = 0;}//處理消息 TVN_BEGINLABELEDITvoid CParentWnd::OnBeginEditTree(NMHDR* pNMHDR, LRESULT* pResult){ TV_DISPINFO* pTVDI = (TV_DISPINFO*)pNMHDR; if(pTVDI->item.pszText==NULL);//判定是否已經取消取消編輯 m_tree.SetItemText(pTVDI->item.hItem,pTVDI->pszText);//重置顯示字符 *pResult = 0;}
 上面講述的方法所進行的消息映射必須在父窗口中進行(同樣WM_NOTIFY的所有消息都需要在父窗口中處理)。 4.8 List Ctrl列表控件可以看作是功能增強的ListBox,它提供了四種風格,而且可以同時顯示一列的多中屬性值。MFC中使用CListCtrl類來封裝列表控件的各種操作。通過調用
BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );創建一個窗口,dwStyle中可以使用以下一些列表控件的專用風格:
  • LVS_ICON LVS_SMALLICON LVS_LIST LVS_REPORT 這四種風格決定控件的外觀,同時只可以選擇其中一種,分別對應:大圖標顯示,小圖標顯示,列表顯示,具體報表顯示
  • LVS_EDITLABELS 結點的顯示字符可以被編輯,對于報表風格來講可編輯的只為第一列。
  • LVS_SHOWSELALWAYS 在失去焦點時也顯示當前選中的結點
  • LVS_SINGLESEL 同時只能選中列表中一項
首先你需要設置列表控件所使用的ImageList,假如你使用大圖標顯示風格,你就需要以如下形式調用:
CImageList* SetImageList( CImageList* pImageList, LVSIL_NORMAL);
假如使用其它三種風格顯示而不想顯示圖標你可以不進行任何設置,否則需要以如下形式調用:
CImageList* SetImageList( CImageList* pImageList, LVSIL_SMALL); 通過調用int InsertItem( int nItem, LPCTSTR lpszItem );可以在列表控件中nItem指明位置插入一項,lpszItem為顯示字符。除LVS_REPORT風格外其他三種風格都只需要直接調用InsertItem就可以了,但假如使用報表風格就必須先設置列表控件中的列信息。通過調用int InsertColumn( int nCol, LPCTSTR lpszColumnHeading, int nFormat , int nWidth, int nSubItem);可以插入列。iCol為列的位置,從零開始,lpszColumnHeading為顯示的列名,nFormat為顯示對齊方式,nWidth為顯示寬度,nSubItem為分配給該列的列索引。 在有多列的列表控件中就需要為每一項指明其在每一列中的顯示字符,通過調用
BOOL SetItemText( int nItem, int nSubItem, LPTSTR lpszText );可以設置每列的顯示字符。nItem為設置的項的位置,nSubItem為列位置,lpszText為顯示字符。下面的代碼演示了如何設置多列并插入數據: m_list.SetImageList(&m_listSmall,LVSIL_SMALL);//設置ImageListm_list.InsertColumn(0,"Col 1",LVCFMT_LEFT,300,0);//設置列m_list.InsertColumn(1,"Col 2",LVCFMT_LEFT,300,1);m_list.InsertColumn(2,"Col 3",LVCFMT_LEFT,300,2);m_list.InsertItem(0,"Item 1_1");//插入行m_list.SetItemText(0,1,"Item 1_2");//設置該行的不同列的顯示字符m_list.SetItemText(0,2,"Item 1_3");此外CListCtrl還提供了一些函數用于得到/修改控件的狀態。
COLORREF GetTextColor( )/BOOL SetTextColor( COLORREF cr );用于得到/設置顯示的字符顏色。
COLORREF GetTextBkColor( )/BOOL SetTextBkColor( COLORREF cr );用于得到/設置顯示的背景顏色。
void SetItemCount( int iCount );用于得到添加進列表中項的數量。
BOOL DeleteItem(int nItem);用于刪除某一項,BOOL DeleteAllItems( );將刪除所有項。
BOOL SetBkImage(HBITMAP hbm, BOOL fTile , int xOffsetPercent, int yOffsetPercent);用于設置背景位圖。
CString GetItemText( int nItem, int nSubItem );用于得到某項的顯示字符。 列表控件的消息映射同樣使用ON_NOTIFY宏,形式如同:ON_NOTIFY( wNotifyCode, id, memberFxn ),wNotifyCode為通知代碼,id為產生該消息的窗口ID,memberFxn為處理函數,函數的原型如同void OnXXXList(NMHDR* pNMHDR, LRESULT* pResult),其中pNMHDR為一數據結構,在具體使用時需要轉換成其他類型的結構。對于列表控件可能取值和對應的數據結構為:
  • LVN_BEGINLABELEDIT 在開始某項編輯字符時發送,所用結構:NMLVDISPINFO
  • LVN_ENDLABELEDIT 在結束某項編輯字符時發送,所用結構:NMLVDISPINFO
  • LVN_GETDISPINFO 在需要得到某項信息時發送,(如得到某項的顯示字符)所用結構:NMLVDISPINFO
關于ON_NOTIFY有很多內容,將在以后的內容中進行具體講解。 關于動態提供結點所顯示的字符:首先你在項時需要指明lpszItem參數為:LPSTR_TEXTCALLBACK。在控件顯示該結點時會通過發送TVN_GETDISPINFO來取得所需要的字符,在處理該消息時先將參數pNMHDR轉換為LPNMLVDISPINFO,然后填充其中item.pszText。通過item中的iItem,iSubItem可以知道當前顯示的為那一項。下面的代碼演示了這種方法: char szOut[8][3]={"No.1","No.2","No.3"};//添加結點m_list.InsertItem(LPSTR_TEXTCALLBACK,...)m_list.InsertItem(LPSTR_TEXTCALLBACK,...)//處理消息void CParentWnd::OnGetDispInfoList(NMHDR* pNMHDR, LRESULT* pResult){ LV_DISPINFO* pLVDI = (LV_DISPINFO*)pNMHDR; pLVDI->item.pszText=szOut[pTVDI->item.iItem];//通過iItem得到需要顯示的字符在數組中的位置 *pResult = 0;}關于編輯某項的顯示字符:(在報表風格中只對第一列有效)首先需要設置列表控件的LVS_EDITLABELS風格,在開始編輯時該控件將會發送LVN_BEGINLABELEDIT,你可以通過在處理函數中返回TRUE來取消接下來的編輯,在編輯完成后會發送LVN_ENDLABELEDIT,在處理該消息時需要將參數pNMHDR轉換為LPNMLVDISPINFO,然后通過其中的item.pszText得到編輯后的字符,并重置顯示字符。假如編輯在中途中取消該變量為NULL。下面的代碼說明如何處理這些消息: //處理消息 LVN_BEGINLABELEDITvoid CParentWnd::OnBeginEditList(NMHDR* pNMHDR, LRESULT* pResult){ LV_DISPINFO* pLVDI = (LV_DISPINFO*)pNMHDR; if(pLVDI->item.iItem==0);//判定是否取消該操作 *pResult = 1; else *pResult = 0;}//處理消息 LVN_BEGINLABELEDITvoid CParentWnd::OnBeginEditList(NMHDR* pNMHDR, LRESULT* pResult){ LV_DISPINFO* pLVDI = (LV_DISPINFO*)pNMHDR; if(pLVDI->item.pszText==NULL);//判定是否已經取消取消編輯 m_list.SetItemText(pLVDI->item.iItem,0,pLVDI->pszText);//重置顯示字符 *pResult = 0;}上面講述的方法所進行的消息映射必須在父窗口中進行(同樣WM_NOTIFY的所有消息都需要在父窗口中處理)。 如何得到當前選中項位置:在列表控件中沒有一個類似于ListBox中GetCurSel()的函數,但是可以通過調用GetNextItem( -1, LVNI_ALL LVNI_SELECTED);得到選中項位置。
4.9 Tab CtrlTab屬性頁控件可以在一個窗口中添加不同的頁面,然后在頁選擇發生改變時得到通知。MFC中使用CTabCtrl類來封裝屬性頁控件的各種操作。通過調用
BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );創建一個窗口,dwStyle中可以使用以下一些屬性頁控件的專用風格: TCS_BUTTONS 使用按鈕來表示頁選擇位置
TCS_MULTILINE 分行顯示頁選擇位置
TCS_SINGLELINE 只使用一行顯示頁選擇位置
在控件創建后必需向其中添加頁面才可以使用,添加頁面的函數為:
BOOL InsertItem( int nItem, LPCTSTR lpszItem );nItem為位置,從零開始,lpszItem為頁選擇位置上顯示的文字。假如你希望在頁選擇位置處顯示一個圖標,你可以調用
BOOL InsertItem( int nItem, LPCTSTR lpszItem, int nImage );nImage指明所使用的圖片位置。(在此之前必須調用CImageList * SetImageList( CImageList * pImageList );設置正確的ImageList) 此外CTabCtrl還提供了一些函數用于得到/修改控件的狀態。
int GetCurSel( )/int SetCurSel( int nItem );用于得到/設置當前被選中的頁位置。
BOOL DeleteItem( int nItem )/BOOL DeleteAllItems( );用于刪除指定/所有頁面。
void RemoveImage( int nImage );用于刪除某頁選擇位置上的圖標。 屬性頁控件的消息映射同樣使用ON_NOTIFY宏,形式如同:ON_NOTIFY( wNotifyCode, id, memberFxn ),wNotifyCode為通知代碼,id為產生該消息的窗口ID,memberFxn為處理函數,函數的原型如同void OnXXXTab(NMHDR* pNMHDR, LRESULT* pResult),其中pNMHDR為一數據結構,在具體使用時需要轉換成其他類型的結構。對于列表控件可能取值和對應的數據結構為: TCN_SELCHANGE 在當前頁改變后發送,所用結構:NMHDR
TCN_SELCHANGING 在當前頁改變時發送可以通過返回TRUE來禁止頁面的改變,所用結構:NMHDR 一般來講在當前頁發生改變時需要隱藏當前的一些子窗口,并顯示其它的子窗口。下面的偽代碼演示了如何使用屬性頁控件: CParentWnd::OnCreate(...)
{
m_tab.Create(...);
m_tab.InsertItem(0,"Option 1");
m_tab.InsertItem(1,"Option 2");
Create a edit box as the m_tab's Child
Create a static box as the m_tab's Child
edit_box.ShowWindow(SW_SHOW); // edit box在屬性頁的第一頁
static_box.ShowWindow(SW_HIDE); // static box在屬性頁的第二頁
}
void CParentWnd::OnSelectChangeTab(NMHDR* pNMHDR, LRESULT* pResult)
{//處理頁選擇改變后的消息
if(m_tab.GetCurSel()==0)
{//根據當前頁顯示/隱藏不同的子窗口
edit_box.ShowWindow(SW_SHOW);
static_box.ShowWindow(SW_HIDE);
}
else
{//
edit_box.ShowWindow(SW_HIDE);
static_box.ShowWindow(SW_SHOW);
}
}
4.A Tool Bar 工具條也是常用的控件。MFC中使用CToolBar類來封裝工具條控件的各種操作。通過調用
BOOL Create( CWnd* pParentWnd, DWORD dwStyle = WS_CHILD WS_VISIBLE CBRS_TOP, UINT nID = AFX_IDW_TOOLBAR );創建一個窗口,dwStyle中可以使用以下一些工具條控件的專用風格:
  • CBRS_TOP 工具條在父窗口的頂部
  • TCBRS_BOTTOM 工具條在父窗口的底部
  • CBRS_FLOATING 工具條是浮動的
創建一個工具條的步驟如下:先使用Create創建窗口,然后使用BOOL LoadToolBar( LPCTSTR lpszResourceName );直接從資源中裝入工具條,或者通過裝入位圖并指明每個按鈕的ID,具體代碼如下: UINT uID[5]={IDM_1,IDM_2,IDM_3,IDM_4,IDM_5};m_toolbar.Create(pParentWnd);m_toolbar.LoadBitmap(IDB_TOOLBAR);m_toolbar.SetSizes(CSize(20,20),CSize(16,16));//設置按鈕大尺寸和按鈕上位圖的尺寸m_toolbar.SetButtons(uID,5);AppWizard在生成代碼時也會同時生成工具條的代碼,同時還可以支持??抗δ?。所以一般是不需要直接操作工具條對象。 工具條上的按鈕被按下時發送給父窗口的消息和菜單消息相同,所以可以使用ON_COMMAND宏進行映射,同樣工具條中的按鈕也支持ON_UPDATE_COMMAND_UI的相關操作,如SetCheck,Enable,你可以將按鈕的當作菜單上的一個具有相同ID菜單項。在以后的章節4.D 利用AppWizard創建并使用ToolBar StatusBar Dialog Bar會給出使用的方法。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品在线观看91| 欧美激情久久久久| 91av国产在线| 第一福利永久视频精品| 视频一区视频二区国产精品| 久久九九有精品国产23| 伊人亚洲福利一区二区三区| 在线观看国产精品淫| 国产一区二区三区在线视频| 欧美一级大片在线观看| 欧美乱大交做爰xxxⅹ性3| 午夜精品蜜臀一区二区三区免费| 国产婷婷色综合av蜜臀av| 亚洲丝袜av一区| 136fldh精品导航福利| 亚洲三级av在线| 狠狠做深爱婷婷久久综合一区| 欧美日韩国产区| 亚洲精品资源美女情侣酒店| 亚洲视频在线视频| 91精品久久久久久久久久久久久久| 久久中文久久字幕| 欧美国产日韩二区| 亚洲福利视频专区| 午夜精品一区二区三区在线视| 亚洲视频在线播放| 怡红院精品视频| 美日韩在线视频| 亚洲国内高清视频| 欧美日韩精品在线观看| 欧美成人免费在线观看| 久久综合伊人77777蜜臀| 亚洲午夜未满十八勿入免费观看全集| 日韩在线精品视频| 欧美精品videossex88| 亚洲精品动漫久久久久| 国产精品视频久久久久| 这里只有视频精品| 欧美韩日一区二区| 国产极品jizzhd欧美| 精品一区电影国产| 国产精品久久久久久亚洲调教| 欧美孕妇与黑人孕交| 91久久久久久久| 欧美成人免费观看| 色樱桃影院亚洲精品影院| 欧美在线一级va免费观看| 亚洲国产精久久久久久| 国产精品91一区| 国产一区视频在线| 欧美激情亚洲一区| 久久躁狠狠躁夜夜爽| 久久久久久久久久婷婷| 日本精品va在线观看| 在线视频国产日韩| 国产精品成人aaaaa网站| 91精品在线播放| 播播国产欧美激情| 亚洲一区二区三| 亚洲国产成人精品久久久国产成人一区| 97国产真实伦对白精彩视频8| 美女福利视频一区| 日本精品va在线观看| 欧美性做爰毛片| 91午夜在线播放| 日韩高清av一区二区三区| xxx欧美精品| 麻豆一区二区在线观看| 日韩在线观看免费全集电视剧网站| 日韩精品中文字幕久久臀| 国产成人精品午夜| 欧美日韩中文字幕在线视频| 亚洲精品电影在线| 欧美日韩精品在线播放| 亚洲欧美在线第一页| 中文字幕亚洲欧美日韩高清| 久久精品视频99| 国产日本欧美一区二区三区在线| 亚洲的天堂在线中文字幕| 亚洲区一区二区| 日韩电视剧在线观看免费网站| 亚洲一二在线观看| 亚洲视频日韩精品| 欧美电影在线免费观看网站| 成人做爰www免费看视频网站| 亚洲精品国产精品乱码不99按摩| 国产成人精品免高潮在线观看| 国产欧美日韩免费| 亚洲精品91美女久久久久久久| 欧美精品久久久久久久久久| 国产精品成人va在线观看| 国产高清视频一区三区| 日韩免费看的电影电视剧大全| 国产成人综合精品| 日韩中文字幕视频| 亚洲精品videossex少妇| 日本国产欧美一区二区三区| 精品久久久香蕉免费精品视频| 国产美女主播一区| 欧美激情aaaa| 日韩精品在线第一页| 亚洲精品日韩久久久| 日韩av影片在线观看| 国产欧美一区二区三区在线看| 成人性生交大片免费看小说| 91老司机精品视频| 日本亚洲欧洲色| 国内精品久久久久伊人av| 操日韩av在线电影| 亚洲aⅴ日韩av电影在线观看| 一区二区三区四区视频| 亚洲精品一区在线观看香蕉| 中文字幕国产亚洲| 久久精品精品电影网| 久久久精品一区二区三区| 亚洲色图欧美制服丝袜另类第一页| 亚洲美女在线看| 日韩精品福利在线| 日韩视频中文字幕| 亚洲欧美激情在线视频| 最近日韩中文字幕中文| 国产精品揄拍一区二区| 亚州av一区二区| 国内外成人免费激情在线视频网站| 欧美日韩在线观看视频| 精品日韩中文字幕| 国产精品看片资源| 欧美日韩成人在线播放| 中文字幕亚洲天堂| 91免费的视频在线播放| 久久精品99久久香蕉国产色戒| 日韩av在线播放资源| 精品magnet| 国内精品久久久久伊人av| 中文字幕亚洲字幕| 国内精品视频一区| 91综合免费在线| 欧美电影在线免费观看网站| 日韩中文视频免费在线观看| 日韩亚洲国产中文字幕| 久久久久久久久亚洲| 97视频在线观看亚洲| 日韩欧美主播在线| 国产综合香蕉五月婷在线| 欧美日韩国产中文字幕| 成人免费视频xnxx.com| 亚洲欧美日韩精品久久奇米色影视| 亚洲网站在线观看| 一区二区三区国产视频| 国产欧洲精品视频| 成人在线国产精品| 黄色成人在线播放| 日韩经典一区二区三区| 亚洲精品国偷自产在线99热| 亚洲最大在线视频| 操日韩av在线电影| 日韩麻豆第一页| 91亚洲午夜在线| 精品国产精品三级精品av网址| 国产欧美一区二区三区在线看| 精品丝袜一区二区三区| 日韩亚洲第一页| 日韩有码片在线观看| 国产精品视频公开费视频|