青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

無我

讓內(nèi)心永遠(yuǎn)燃燒著偉大的光明的精神之火!
靈活的思考,嚴(yán)謹(jǐn)?shù)膶崿F(xiàn)
豪邁的氣魄、頑強(qiáng)的意志和周全的思考

MFC的listctrl控件中水平添加按鈕并刷新

      這個項目中需要用MFC實現(xiàn)一個界面功能:listctrl中水平添加按鈕。
      MFC本身的listctrl控件只能顯示簡單的文本,簡單的添加按鈕也不是一兩句代碼能解決的問題,從這方面講,MFC開發(fā)界面真是不得已而為之。
   
      因為需要的按鈕數(shù)目是不確定的,所以只能是動態(tài)創(chuàng)建,然后再根據(jù)listctrl控件的位置計算出按鈕應(yīng)該放置的位置,然后將按鈕移動到指定坐標(biāo)。
      對MFC里面的類和關(guān)系,我并不熟悉,所以花了很長時間搜索,最終在下載的好幾個版本的代碼中找了一個基本可用的,修改開發(fā)。

   一、      針對我們需要管理自己動態(tài)創(chuàng)建的按鈕,所以我們自定義了一個CButton的子類。

 1
 2class CButtonEx : public CButton
 3{
 4    DECLARE_DYNAMIC(CButtonEx)
 5
 6public:
 7    CButtonEx();
 8    CButtonEx( int nItem, int nSubItem, CRect rect, HWND hParent,void * pData );
 9    virtual ~CButtonEx();
10
11protected:
12    DECLARE_MESSAGE_MAP()
13public:
14    afx_msg void OnBnClicked(); //點擊響應(yīng)函數(shù)
15    int m_inItem;           //所屬listctrl的行
16    int m_inSubItem;        //所屬listctrl的列
17    CRect m_rect;           //按鈕所在的位置
18    HWND m_hParent;         //按鈕的父窗口
19    BOOL bEnable;
20    void * m_pData;         //按鈕帶的用戶自定義數(shù)據(jù)
21}
;

1CButtonEx::CButtonEx( int nItem, int nSubItem, CRect rect, HWND hParent,void * pData )   
2{
3    m_inItem = nItem;
4    m_inSubItem = nSubItem;
5    m_rect = rect;
6    m_hParent = hParent;
7    bEnable = TRUE;
8    m_pData = pData;
9}

      按鈕點擊的響應(yīng)邏輯在OnBnClicked函數(shù)中。之所以加入m_pData成員變量,是便于存放用戶自定義數(shù)據(jù),這樣就可以在OnBnClicked函數(shù)中根據(jù)自定義變量做出相應(yīng)的處理。

  二、自定義listctrl子類
 1#pragma once
 2
 3#include "ButtonEx.h"
 4#include <map>
 5using namespace std;
 6
 7typedef map<int,CButtonEx*> button_map;
 8// CListCtrlEx
 9
10class CListCtrlEx : public CListCtrl
11{
12    DECLARE_DYNAMIC(CListCtrlEx)
13
14public:
15    CListCtrlEx();
16    virtual ~CListCtrlEx();
17
18protected:
19    DECLARE_MESSAGE_MAP()
20
21public:
22    //動態(tài)創(chuàng)建Button
23    void createItemButton( int nItem, int nSubItem, HWND hMain,LPCTSTR lpszCaption ,void * pData);
24    //釋放創(chuàng)建的Button
25    void release();
26    void deleteItemEx( int nItem );
27    button_map m_mButton;
28
29public:
30    UINT m_uID;     
31    CFont font ;    //按鈕上面的字體
32    void updateListCtrlButtonPos(); //更新按鈕的位置
33    //void enableButton( BOOL bFlag, int iItem );
34    //重載水平滾動條滾動函數(shù)
35    afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
36}
;

CListCtrlEx實現(xiàn)如下:
 1CListCtrlEx::CListCtrlEx()
 2{
 3    m_uID = 0;
 4
 5    font.CreatePointFont(100,"宋體");
 6}

 7
 8CListCtrlEx::~CListCtrlEx()
 9{
10    release();
11}

然后是創(chuàng)建按鈕的邏輯,注意我這里是在ListCtrl控件中水平添加按鈕(同一行的每一列),而不是垂直(同一列的每一行):
 1void CListCtrlEx::createItemButton( int nItem, int nSubItem, HWND hMain,LPCTSTR lpszCaption ,void * pData)
 2{
 3    CRect rect;
 4    /*if( !EnsureVisible(nItem, TRUE)) 
 5        return ;*/

 6
 7    GetSubItemRect(nItem, nSubItem, LVIR_BOUNDS, rect);
 8    rect.bottom = rect.top + 150;
 9    //rect.right = rect.left + 150;
10
11    DWORD dwStyle =  WS_CHILD | WS_VISIBLE | BS_MULTILINE;
12    CButtonEx *pButton = new CButtonEx(nItem,nSubItem,rect,hMain,pData);
13    m_uID++;
14
15    pButton->Create(lpszCaption,dwStyle, rect, this, m_uID);
16    //CDC* pDC = pButton->GetDC();
17    //pDC->SetTextColor(RGB(255,0,0));
18    pButton->SetFont(&font);
19    
20   // m_mButton.insert( make_pair( nItem, pButton ) );    //縱向添加用
21    m_mButton.insert( make_pair( nSubItem, pButton ) ); //單行橫向添加用
22    
23    return;
24}

25
上面的代碼中,我將按鈕的高都設(shè)為了150,而不是listctrl默認(rèn)的一點點高。
 1void CListCtrlEx::release()
 2{
 3    button_map::iterator iter = m_mButton.begin();
 4    while ( iter != m_mButton.end() )
 5    {
 6        delete iter->second;
 7        iter->second = NULL;
 8        iter++;
 9    }

10    m_mButton.clear();
11}

當(dāng)完成以上代碼以后,就可以在對話框中添加listctrl控件的成員變量了:CListCtrlEx m_lsPath;
然后在OnInitDialog函數(shù)中給listctrl控件添加按鈕:
1int i = 0;
2    m_lsPath.InsertColumn(i,_T(""),LVCFMT_LEFT,150); 
3
4    nRow = m_lsPath.InsertItem(0"tim");
5
6    TCHAR caption[1000= {0};//標(biāo)題
7    ImageCfg * pImageCfg = new ImageCfg;//自定義數(shù)據(jù)
8    m_lsPath.createItemButton(nRow,i++,m_lsPath,caption,pImageCfg);

這樣看起來一切很好,但是運行時發(fā)現(xiàn),當(dāng)按鈕較多需要水平滾動條時,拖動水平滾動條并不能正確的顯示按鈕!
所以我們還需要處理CListCtrlEx的水平滾動命令:
1void CListCtrlEx::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
2{
3    // TODO: 在此添加消息處理程序代碼和/或調(diào)用默認(rèn)值    
4    CListCtrl::OnHScroll(nSBCode, nPos, pScrollBar);
5    updateListCtrlButtonPos();
6    //Invalidate(FALSE);
7}
 
 1void CListCtrlEx::updateListCtrlButtonPos()
 2{
 3    button_map::iterator iter = m_mButton.begin();
 4    button_map::iterator itrEnd = m_mButton.end();
 5    //調(diào)整橫向的
 6    int posx = GetScrollPos(SB_HORZ);//取得水平滾動條的位置
 7    for (;iter != itrEnd;++iter)
 8    {
 9        CRect rect;
10        rect = iter->second->m_rect;
11        rect.left -= posx;
12        rect.right -= posx;
13        iter->second->ShowWindow( SW_HIDE );
14
15        iter->second->MoveWindow( &rect );
16        iter->second->ShowWindow( SW_SHOW );
17        /*if( iLine < iTopIndex )
18        {
19            iterUp->second->ShowWindow( SW_HIDE );
20        }*/

21    }

22    return;
23}

這里操作的過程是:取得控件水平滾動條的位置,然后將所有按鈕的水平坐標(biāo)左移響應(yīng)的值。其實這里可以優(yōu)化一下:判斷只有那些按鈕會被顯示才處理,其他的并不需要處理,例如:
 1void CListCtrlEx::updateListCtrlButtonPos()
 2{
 3    button_map::iterator iter = m_mButton.begin();
 4    button_map::iterator itrEnd = m_mButton.end();
 5
 6    CRect rect;
 7    GetClientRect(rect);
 8    LONG width = rect.right;
 9    //調(diào)整橫向的
10    int posx = GetScrollPos(SB_HORZ);//取得水平滾動條的位置
11    for (;iter != itrEnd;++iter)
12    {
13        iter->second->ShowWindow( SW_HIDE );
14
15        rect = iter->second->m_rect;
16        rect.left -= posx;
17        rect.right -= posx;
18        if (rect.right > 0)
19        {
20            if (rect.left > width)
21            {
22                //其他的都超出了顯示范圍
23                break;
24            }

25            iter->second->MoveWindow( &rect );
26            iter->second->ShowWindow( SW_SHOW );
27        }

28                
29        /*if( iLine < iTopIndex )
30        {
31            iterUp->second->ShowWindow( SW_HIDE );
32        }*/

33    }

34    return;
35}
 
這樣,按鈕就能正確刷新了。

不過,還有一個小問題:在拖動滾動條時,我們發(fā)現(xiàn)界面有些閃爍。但是我還沒找到合適的解決方法。歡迎大家給出可行的方案。

posted on 2014-05-10 17:01 Tim 閱讀(6022) 評論(0)  編輯 收藏 引用 所屬分類: windows系統(tǒng)

<2012年6月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

導(dǎo)航

統(tǒng)計

公告

本博客原創(chuàng)文章,歡迎轉(zhuǎn)載和交流。不過請注明以下信息:
作者:TimWu
郵箱:timfly@yeah.net
來源:m.shnenglu.com/Tim
感謝您對我的支持!

留言簿(9)

隨筆分類(173)

IT

Life

搜索

積分與排名

最新隨筆

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲欧美三级在线| 欧美ed2k| 欧美午夜美女看片| 亚洲一区二区三区高清 | 亚洲欧美一区二区激情| 国产伪娘ts一区| 亚洲成在线观看| 美女网站在线免费欧美精品| 日韩写真在线| 亚洲在线不卡| 91久久久久久久久久久久久| 一区二区三区日韩欧美精品| 国内免费精品永久在线视频| 亚洲黄网站在线观看| 国产一区清纯| 午夜精品成人在线视频| 欧美一区国产一区| 亚洲人成网站777色婷婷| 日韩一级在线| 激情久久久久久| aa日韩免费精品视频一| 精品51国产黑色丝袜高跟鞋| 一本色道久久综合亚洲精品高清| 亚洲欧美电影院| 亚洲国产婷婷香蕉久久久久久| 一区二区三区免费网站| 亚洲动漫精品| 欧美一区二视频| 亚洲尤物视频网| 免播放器亚洲一区| 久久精品一区二区国产| 国产精品成人久久久久| 亚洲欧洲精品一区二区精品久久久 | 欧美一区二区福利在线| 一区二区毛片| 男同欧美伦乱| 久热精品在线视频| 国产日韩欧美在线| 亚洲一区视频| 亚洲欧美日韩国产精品| 欧美视频四区| 亚洲精品乱码久久久久久蜜桃麻豆| 精品不卡一区| 91久久精品一区二区三区| 一区免费视频| 久久久国产精品一区二区三区| 欧美一区二区三区免费看| 欧美三级黄美女| 中文日韩在线视频| 欧美一级午夜免费电影| 国产精品va| 日韩午夜精品视频| 国产精品99久久久久久www| 欧美日韩国产首页| 9i看片成人免费高清| 亚洲永久视频| 国产有码一区二区| 久久久久九九视频| 免费在线观看日韩欧美| 永久久久久久| 欧美阿v一级看视频| 欧美大片一区二区三区| 一区精品在线播放| 亚洲电影免费在线观看| 亚洲电影免费| 久久伊人亚洲| 久久综合九色综合网站| 黄色成人免费观看| 宅男精品视频| 亚洲一区精品视频| 欧美性猛片xxxx免费看久爱| 亚洲人成绝费网站色www| 亚洲人成小说网站色在线| 老司机67194精品线观看| 欧美专区亚洲专区| 在线观看日韩国产| 免费亚洲电影| 亚洲经典自拍| 亚洲视频欧洲视频| 欧美新色视频| 一区二区三区波多野结衣在线观看| 一区二区三区在线免费视频| 午夜欧美理论片| 久久国产一区二区三区| 国产日韩欧美亚洲一区| 欧美一区二区免费视频| 久久精品免费看| 国产一区在线播放| 久久婷婷综合激情| 亚洲高清不卡av| 一本色道久久综合精品竹菊 | 久久久久久久国产| 久久久亚洲综合| 久久久91精品国产一区二区三区 | 亚洲欧美国产77777| 尤物九九久久国产精品的特点| 午夜精品久久久久99热蜜桃导演| 中文在线资源观看网站视频免费不卡 | 亚洲盗摄视频| 欧美sm视频| 亚洲国产综合视频在线观看| 欧美福利视频一区| 久久这里有精品视频| 欧美人与禽猛交乱配| 亚洲深夜福利| 在线亚洲免费视频| 国产精品日韩在线播放| 亚洲综合第一页| 麻豆成人综合网| 亚洲七七久久综合桃花剧情介绍| 欧美日韩免费观看一区二区三区| 亚洲午夜日本在线观看| 欧美a级片网站| 亚洲主播在线播放| 国产综合av| 欧美日韩99| 一级日韩一区在线观看| 欧美一区二区啪啪| 亚洲激情在线观看| 国产精品日韩高清| 久久精品论坛| 一本一本久久a久久精品牛牛影视| 久久天天狠狠| 亚洲一区图片| 亚洲国产免费| 国产精品网站在线观看| 亚洲午夜久久久| 狼人社综合社区| 亚洲欧美三级在线| 日韩系列欧美系列| 狠狠色2019综合网| 国产精品美女主播在线观看纯欲| 乱人伦精品视频在线观看| 亚洲欧美日韩精品综合在线观看| 欧美激情女人20p| 日韩一区二区电影网| 国产一区二区三区久久悠悠色av| 欧美日韩国产综合新一区| 欧美亚洲综合久久| 一本色道久久综合亚洲精品婷婷| 亚洲第一级黄色片| 久久精品一区二区| 亚洲欧美日韩一区二区| 99re66热这里只有精品3直播| 国产精品久在线观看| 欧美激情精品久久久久| 日韩午夜在线视频| 9l国产精品久久久久麻豆| 亚洲精品123区| 亚洲风情在线资源站| 久久久国产精品一区二区中文| 亚洲一区二区在线免费观看| 亚洲精品三级| 亚洲激情影院| 噜噜噜噜噜久久久久久91| 91久久久久久国产精品| 欧美日韩精品三区| 免费欧美电影| 久久躁狠狠躁夜夜爽| 久久成人一区| 久久九九精品99国产精品| 亚洲综合精品四区| 亚洲影院色在线观看免费| 欧美成人综合在线| 亚洲毛片在线看| 日韩视频在线一区二区| 99精品久久| 一本色道久久综合亚洲二区三区| 亚洲精品久久久久久久久| 亚洲欧洲另类国产综合| 亚洲精品国产品国语在线app| 久久亚洲国产成人| 欧美一级黄色网| 久久国产高清| 久久躁日日躁aaaaxxxx| 久色成人在线| 亚洲承认在线| 日韩网站在线观看| 正在播放欧美视频| 一级日韩一区在线观看| 亚洲综合视频一区| 久久99伊人| 麻豆乱码国产一区二区三区| 欧美大片网址| 欧美日韩在线大尺度| 国产欧美一区二区精品秋霞影院| 久久久精品视频成人| 国产日韩三区| 国内在线观看一区二区三区 | 国产自产高清不卡| 国产欧美精品在线| 亚洲人成在线播放网站岛国| 99re66热这里只有精品4| 亚洲神马久久| 久久精品国产v日韩v亚洲| 免费精品视频| 在线综合亚洲| 久久伊人一区二区| 国产精品成人免费| 国产一区99|