• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            積累的VC編程小技巧之列表框

            1.列表框中標(biāo)題欄(Column)的添加

            創(chuàng)建一個(gè)List Control,其IDIDC_LIST,在其Styles屬性項(xiàng)下的View項(xiàng)里選擇ReportAlign項(xiàng)里選擇TopSort項(xiàng)里選擇None.

            然后在該List所在對(duì)話框的類(lèi)(頭文件)里創(chuàng)建ClistCtrl的一個(gè)對(duì)象m_list然后在.cpp文件的OnInitDialog()之類(lèi)的函數(shù)里實(shí)現(xiàn)如下代碼:

            CString strname[3];

            strname[0]="Screen Name";

            strname[1]="Form ID";

            strname[2]="Category Path";

            for(int i=0;i<3;i )

            {

            m_List.InsertColumn(i,strname[i],LVCFMT_LEFT,130);

            }

            在這之前也要將List ControlIDClistCtrl的對(duì)象m_listDoDataExchange(CDataExchange* pDX)函數(shù)里綁定,如下:

            DDX_Control(pDX, IDC_LIST, m_List);

            2.如何防止在列表框中添加很多數(shù)據(jù)出現(xiàn)不停的刷新?

            [問(wèn)題提出]
            listbox添加很多數(shù)據(jù)的時(shí)候,由于控件不停的刷新,導(dǎo)致出現(xiàn)閃爍,如何解決?
            [解決方法]
            再添加數(shù)據(jù)以前,禁止控件刷新,數(shù)據(jù)添加完畢以后,再刷新一次。
            [程序?qū)崿F(xiàn)](其中:m_ListBoxCListBox的控件類(lèi)型的變量)
            m_ListBox.LockWindowUpdate();//禁止本listbox刷新。
            for(int i=0;i<9999;i )
            {
            m_ListBox.AddString("test");
            }//添加數(shù)據(jù)。
            this->RedrawWindow(NULL,NULL,RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);

            3.列表框中選擇變化時(shí)如何獲得通知?

            我在Report View中使用了一個(gè)CListCtrl(自繪制類(lèi)型),我想知道什么時(shí)候選擇項(xiàng)發(fā)生了改變.

            在選擇項(xiàng)變化時(shí),可以使用按鈕有效或失效,按如下操作:

            加入LVN_ITEMCHANGED消息處理.
            void CYourClassNameHere::OnItemchangedEventList(NMHDR* pNMHDR, LRESULT* pResult)
            {
            NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
            *pResult = 0;

            if (pNMListView->uChanged == LVIF_STATE)

            {
            if (pNMListView->uNewState)

            {
            GetDlgItem(IDC_DELETE)->EnableWindow(TRUE);

            }
            else

            {
            GetDlgItem(IDC_DELETE)->EnableWindow(FALSE);
            }
            }

            }

            4.列表框控件中整欄選擇?

            我在處理List控件時(shí)碰到了麻煩,我想創(chuàng)建一個(gè)ListView,來(lái)依據(jù)Tree控件的選擇同時(shí)在ListViewReportView中顯示列表的信息.以下是相關(guān)的代碼:

            // Set full line select
            ListView_SetExtendedListViewStyle(m_plstCustomers->GetSafeHwnd(),
            LVS_EX_FULLROWSELECT);

            按如下方法處理:

            // -------------------- begin of snippet --------------------------------
            bool CCommCtrlUtil32::ListCtrl_ModifyExtendedStyle(CListCtrl& p_rListCtrl,
            const DWORD p_dwStyleEx,
            const bool p_bAdd)
            {
            HWND t_hWnd = p_rListCtrl.GetSafeHwnd();
            DWORD t_dwStyleEx = ListView_GetExtendedListViewStyle(t_hWnd);

            if(p_bAdd)
            {
            if(0 == (p_dwStyleEx & t_dwStyleEx))
            {
            // add style
            t_dwStyleEx |= p_dwStyleEx;
            }
            }
            else
            {
            if(0 != (p_dwStyleEx & t_dwStyleEx))
            {
            // remove style
            t_dwStyleEx &= ~p_dwStyleEx;
            }
            }

            ListView_SetExtendedListViewStyle(t_hWnd, t_dwStyleEx);

            return true;
            }

            5.如何雙擊列表框項(xiàng)啟動(dòng)一個(gè)與文件關(guān)聯(lián)的程序?

            有人問(wèn)我如何雙擊列表框項(xiàng)啟動(dòng)一個(gè)程序?其實(shí)這個(gè)問(wèn)題很簡(jiǎn)單,Windows中有一個(gè)API函數(shù)可以打開(kāi)任何類(lèi)型的文件:

            ShellExecute(NULL,"open",lpFileName,NULL,NULL,SW_SHOWNORMAL);

            參數(shù) lpFileName 是文件的全路徑名。用這個(gè)變量你可以傳遞象“C:\\MyExcelFile.xls”或者“http://www.vckbase.com”啟動(dòng)Excel程序或者瀏覽器程序。假如你只是想獲取與文件關(guān)聯(lián)的程序名,而不是要運(yùn)行程序,那么調(diào)用::FindExecutable就可以了。

            6.如何得到列表框中所選擇項(xiàng)的String?

            [問(wèn)題提出]
            如何得到CListBox所選擇項(xiàng)的String
            [解決方法]
            用到:CListBox::GetText()
            [程序?qū)崿F(xiàn)]
            CString scInfo;
            pList->GetText( GetCurSel(),scInfo);

            7.鎖定ListView的欄目頭寬度

            編譯:NorthTibet

            世界之大,真是無(wú)其不有。Windows 應(yīng)用程序的GUI標(biāo)準(zhǔn)明確規(guī)定了 ListView 欄目頭(Column Header)的寬度必須是可調(diào)整的,這本來(lái)是專(zhuān)門(mén)為用戶考慮而設(shè)計(jì)的控制特性,可是偏偏就有用戶拒絕這樣的特性。作為技術(shù)人員,用戶的需求是很難拒絕的。盡管這明顯是一種非典型性需求。本文將通過(guò)一個(gè)實(shí)例來(lái)示范如何實(shí)現(xiàn) ListView Column Header 寬度的鎖定。
            ListView 及其 Column Header 實(shí)際上都是 Windows 通用控件(Comctl32.dll) 的一部分。所以查一查 MSDN 中與“Header Control”相關(guān)的控件資料不難發(fā)現(xiàn),欄目頭的鎖定與否與幾個(gè) Windows 的通知消息密切相關(guān),這幾個(gè)消息分別是 HDN_TRACKHDN_BEGINTRACK HDN_ENDTRACKA。其中 HDN_BEGINTRACK 是本文要非凡關(guān)照的一個(gè)。當(dāng)用戶在欄目頭上拖拽鼠標(biāo)時(shí),假如位置正好在改變寬度的分割條上,則欄目頭控件會(huì)向其父窗口發(fā)送一個(gè) HDN_BEGINTRACK 通知消息。為了實(shí)現(xiàn)欄目頭寬度的鎖定,就必須搞掂這個(gè)通知消息。不能將它傳遞到父窗口,但是,這個(gè)消息與 Windows 中形形色色的其它通知消息一樣,有兩個(gè)版本:一個(gè)版本是 HDN_BEGINTRACKW,專(zhuān)門(mén)用于寬字符和 Unicode 字符集;另一個(gè)版本是 HDN_BEGINTRACKA,專(zhuān)門(mén)用于 ANSI 字符集。這兩個(gè)版本的使用方法可以從公共控件的頭文件 commctrl.h 中獲取:

            // From commctrl.h
            #ifdef UNICODE
            #define HDN_BEGINTRACK HDN_BEGINTRACKW
            #else
            #define HDN_BEGINTRACK HDN_BEGINTRACKA
            #endif     

            所以在實(shí)現(xiàn)對(duì)消息的 HDN_BEGINTRACK 處理時(shí),實(shí)際上是根據(jù) UNICODE 的取值實(shí)現(xiàn)對(duì) HDN_BEGINTRACKA HDN_BEGINTRACKW 的處理。那么 Header Control 到底是發(fā)送的哪一個(gè)消息呢?在這里必須明白:Header Control Windows 通用控件的一部分,它的實(shí)現(xiàn)都在 comctl32.dll 動(dòng)態(tài)鏈接庫(kù)中。由于這個(gè) DLL 已經(jīng)被編譯成可執(zhí)行代碼,因此在工程中修改 UNICODE 的設(shè)置將無(wú)濟(jì)于事。如何知道欄目頭控件發(fā)送哪一個(gè)版本的通知消息呢?是 A 版本還是 W 版本?
            為了找到答案,我們必須求助一個(gè)經(jīng)常被遺忘的消息 WM_NOTIFYFORMAT。一般控件第一次被創(chuàng)建時(shí),都要向父窗口一個(gè)消息詢問(wèn)父窗口需要哪個(gè)版本的通知消息。然后父窗口返回 NFR_ANSI NFR_UNICODE。假如父窗口不處理 WM_NOTIFYFORMAT,那么這個(gè)消息將根據(jù)父窗口或?qū)υ捒虮旧淼氖走x項(xiàng)被傳遞到 Windows DefWindowProc 消息處理例程進(jìn)行默認(rèn)處理。默認(rèn)為 UNICODE。因此,要知道通知消息的版本,必須處理 ListCtrl WM_NOTIFYFORMAT。為了確認(rèn)父窗口的返回值,你可以做一個(gè)試驗(yàn)便明白了。
            假如你不想處理 WM_NOTIFYFORMAT 消息,那么完全可以通過(guò)雙雙實(shí)現(xiàn) HDN_BEGINTRACKA HDN_BEGINTRACKW 通知消息的處理來(lái)簡(jiǎn)化問(wèn)題的解決方案,同時(shí)這種方法也更可靠和通用。此時(shí)代碼將同時(shí)支持 ANSI Unicode。本文附帶的例子程序示范了這種方法的實(shí)現(xiàn)。如圖一所示:

            圖一 鎖定欄目頭寬度

            實(shí)現(xiàn)代碼很簡(jiǎn)單,Header 控件發(fā)送 HDN_XXX 到父窗口(ListCtrl),在 MFC 中可以利用消息反射來(lái)處理 Header 控件的通知消息。因?yàn)?/span>“可鎖定欄目頭特性本身更趨向于 Header 控件的屬性,而不是 ListCtrl 的屬性。假如你不用 MFC ,那么就得處理 ListCtrl 中的通知消息。例子程序使用了消息反射機(jī)制,在 Header 控件的消息映射使用 ON_NOTIFY_REFLECT,也就是該寫(xiě)虛擬成員函數(shù) OnChildNotify

            BOOL CLockableHeader::OnChildNotify(UINT msg, WPARAM wp, LPARAM lp, LRESULT* pRes)
            {
                 NMHDR& nmh = *(NMHDR*)lp;
                 if (nmh.code==HDN_BEGINTRACKW || nmg.code==HDN_BEGINTRACKA)
                     return *pRes=TRUE;
                 ......
            }

            因?yàn)?/span> OnChildNotify 是虛函數(shù),所以沒(méi)有必要具備消息映射入口。只要實(shí)現(xiàn)此函數(shù)即可。在任何應(yīng)用中,Header 發(fā)送的消息非此即彼,不會(huì)兩者都發(fā)送。不管怎樣,所發(fā)送的通知消息在到達(dá)父窗口之前都會(huì)被吃掉。也就是說(shuō),消息處理總是返回 TRUE,是否鎖定欄目頭的寬度通過(guò)一個(gè)標(biāo)志來(lái)控制:應(yīng)用程序通過(guò) Lock 來(lái)修改標(biāo)志的值。
            假如鎖定了頭寬度,那么同時(shí)也必須禁用改變寬度的光標(biāo),這樣用戶界面才會(huì)有一致性,要實(shí)現(xiàn)這一點(diǎn)也很簡(jiǎn)單:

            BOOL CLockableHeader::OnSetCursor( CWnd* pWnd, UINT nHit, UINT msg)
            {
                 return m_bLocked ? TRUE : CHeaderCtrl::OnSetCursor(pWnd, nHit, msg);
            }      

            假如欄目頭被鎖定,則 OnSetCursor 返回 TRUE,此時(shí)光標(biāo)不會(huì)被重新設(shè)置,否則由 Header 控件的進(jìn)行默認(rèn)處理。鎖定寬度后,當(dāng)鼠標(biāo)移到欄目頭上時(shí),Windows 顯示標(biāo)準(zhǔn)的箭頭光標(biāo),而不是帶左右箭頭光標(biāo)。
            CHeaderCtrl 派生類(lèi)出來(lái)的類(lèi)的使用方法與處理對(duì)話框控制一樣,通過(guò)在父窗口的 OnCreate 的處理例程中進(jìn)行子類(lèi)化。實(shí)現(xiàn)細(xì)節(jié)請(qǐng)參考例子源代碼:

                 
            // CMyView is derived from CListView
            int CMyView::OnCreate(LPCREATESTRUCT lpcs)
            {
              VERIFY(CListView::OnCreate(lpcs)==0);
              return m_header.SubclassDlgItem(0,this) ? 0 : -1;
            }
            由于 Header 控制的資源 ID = 0,所以上面的代碼是行得通的。為了有一個(gè)友好的用戶界面,例子程序創(chuàng)建了一個(gè)命令菜單和界面更新處理例程。如圖一所示。

            posted on 2008-04-02 18:53 wrh 閱讀(719) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            導(dǎo)航

            <2008年4月>
            303112345
            6789101112
            13141516171819
            20212223242526
            27282930123
            45678910

            統(tǒng)計(jì)

            常用鏈接

            留言簿(19)

            隨筆檔案

            文章檔案

            收藏夾

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            亚洲国产另类久久久精品黑人 | 香港aa三级久久三级老师2021国产三级精品三级在| 中文成人久久久久影院免费观看| 久久性生大片免费观看性| 久久人爽人人爽人人片AV| 97超级碰碰碰碰久久久久| 久久精品卫校国产小美女| 久久国产精品无码一区二区三区| 久久精品国产亚洲7777| 无码伊人66久久大杳蕉网站谷歌| 国产精品狼人久久久久影院| 日韩欧美亚洲综合久久 | 少妇久久久久久久久久| 色综合合久久天天给综看| 久久精品国产亚洲AV麻豆网站| 久久精品成人免费观看97| 国产三级久久久精品麻豆三级| 亚洲午夜福利精品久久| 99久久免费国产精品| 精品永久久福利一区二区| 亚洲美日韩Av中文字幕无码久久久妻妇| 久久亚洲AV成人出白浆无码国产| 亚洲伊人久久综合影院| 久久久久国产亚洲AV麻豆| 91久久婷婷国产综合精品青草| 一本一本久久a久久综合精品蜜桃| 久久精品国产精品亚洲人人 | 2020久久精品亚洲热综合一本| 亚洲精品国产成人99久久| 99久久精品国产免看国产一区| 久久99精品久久久久久久不卡 | 亚洲国产成人久久综合区| 精品久久久久久久久久中文字幕| 久久成人影院精品777| 久久国产精品成人免费| 国产精品99久久久久久猫咪| 国产国产成人久久精品| 久久精品国产亚洲一区二区三区| 久久99亚洲综合精品首页| 香蕉99久久国产综合精品宅男自| 久久人人爽人爽人人爽av|