久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

關于list control的高級應用

 我的讀本 2010-09-10
論壇中搜索一下,你們會發(fā)現(xiàn)不少類似(的)提問:我們如何編輯list control(的)條目?如何直接編輯list control...等等;list control可用來做數(shù)據(jù)庫表(的)視圖,十分有用.
但報表風格(的)list control只能編輯第一列,其余(的)該死(的)微軟沒為vc做到.它們怕VB賣不出.于是C++程序員只好DIY.主要思想是在list control中動態(tài)創(chuàng)建一個控件,動態(tài)移動該控件到相應位置.這些技巧早有人討論過了,本文也是基于如上思想(的),但注重于可擴充性與使用(的)方便.
List control 這頭主要是重載OnLButtonDown技巧,計算出被點中(的)條目.這里重要(的)函數(shù)是SubItemHitTest和GetSubItemRect,看msdn上有相關說明. 用戶點中后,就要負責顯示控件了:如果之前選中了其他們,就要驗證之前(的)改動是否成功.不成功就要回到原來(的)(地)方,成功就應用修改并移到新位置.看代碼:
static     const UINT IDCHAILD=3000;
void CValidateList::OnLButtonDown(UINT nFlags, CPoint point)
{
     CListCtrl::OnLButtonDown(nFlags, point);
    LVHITTESTINFO hi;
    hi.pt = point;
    if(SubItemHitTest(&hi) != -1 )//沒有點中條目就不管
    {if(m_col==-1||//-1 還沒被選過
           true==(m_col+m_validate)->Validate (m_row))
       {
m_row = hi.iItem, m_col= hi.iSubItem;//m_row,m_col成
//員分別跟蹤選中(的)行列
}
((m_col+m_validate))->Move (_GetRect(),m_row);
    }
}
 
WinBlast* CValidateList::SetValidate( WinBlast*in)//設置驗證(的)
//控件群,in對應第一列,in+1第二列……
{
    WinBlast*ret=m_validate;
    m_validate=in;
    int counts=GetHeaderCtrl()->GetItemCount();;
    RECT rect;
     memset(&rect,0,sizeof(rect));
    for(int i=0;i<counts;++i)
         (in+i)->Create (this,rect,IDCHAILD+i,i);
    m_col=-1;//沒有被選中(的)
    return ret;
}
 
 
RECT CValidateList::_GetRect()//內部使用,(得)到相應顯示位置
{
    CRect ret;
GetSubItemRect(m_row,m_col,LVIR_BOUNDS,ret);
return ret;
}
 
void CValidateList::NoSelect()//置未選中狀態(tài)
{
m_col=-1;//沒有被選中(的)
}
看到了WinBlast*ret=m_validate吧.WinBlast是用來修改和驗證數(shù)據(jù)(的)控件看它們(的)實現(xiàn):
class WinBlast 
{
    int m_col;//跟蹤列,為什么要這個?因為你們可以讓一種控件對
//不同列用不同(的)驗證策略
CWnd* m_win;//你們(的)控件窗口
    CListCtrl *m_parent;//用它們獲(得)文本
public:
    WinBlast(){m_win=NULL;}
    ~WinBlast(){m_win->DestroyWindow();delete m_win;}
 
virtual    bool Create( CWnd* pParentWnd,
       const RECT& rect, UINT nID,
       int col)
    {
        m_col=col;m_parent=(CListCtrl *)pParentWnd;
        m_win=new CEdit;
            return  ((CEdit*)m_win)->
           Create(ES_NOHIDESEL,rect,pParentWnd,nID); 
       }
    void Move(const RECT &rect,int row)//最重要(的)函數(shù)但前面
//兩個動作是必作(的),SetText為虛,你們在那做你們喜歡(的)
    {
        m_win->ShowWindow(SW_SHOW);
        m_win->MoveWindow(&rect);
        SetText(row);
    }
    virtual bool Validate(int row)//驗證,虛函數(shù).這里永遠返回true
    {
        m_win->ShowWindow(SW_HIDE);
        CString set;
        m_win->GetWindowText(set);
        m_parent->SetItemText(row,m_col,set);
        return true;
    }
    virtual void SetText(int row)
    {
        m_win->SetWindowText(m_parent->GetItemText(row,m_col));

本文來自: 華軍天空軟件園(www.) 詳細出處參考:http://www./dirss/html/179754.html

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內容中的聯(lián)系方式,、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報,。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章