OSDN Git Service

2012/01/16 17:30:20
authorunknown <qwerty2501@users.sourceforge.jp>
Mon, 16 Jan 2012 08:30:21 +0000 (17:30 +0900)
committerunknown <qwerty2501@users.sourceforge.jp>
Mon, 16 Jan 2012 08:30:21 +0000 (17:30 +0900)
nlite.suo
nlite/nlite_chatData.cpp
nlite/nlite_chatData.h
nlite/nlite_commentview.cpp
nlite/nlite_commentview.h

index bfa9185..bd74c3e 100644 (file)
Binary files a/nlite.suo and b/nlite.suo differ
index be5dfb6..f7a187d 100644 (file)
@@ -27,13 +27,13 @@ VOID ListenerData::SetBkColor(COLORREF bkColor_in){
 }
 
 
-VOID CCommentList::OnChatReceve(NicoLiveChat_P chatData_in, UINT_PTR commnetCountSum){
+VOID CCommentList::OnChatReceve(NicoLiveChat_P chatData_in, UINT_PTR commnetCountSum,CCommentListWindow &listWindow){
 
        
        CChatData chatData;
        chatData.SetChat(*chatData_in);
        
-
+       chatData.height = listWindow.CalcItemHeight(chatData);
        
        chatList.push_back(chatData);
        return;
index ca17fef..9057e13 100644 (file)
@@ -1,6 +1,9 @@
 #pragma once
 
 namespace nlite{
+
+
+       class CCommentListWindow;
        namespace cuntry{
 
                enum LOCALE{
@@ -106,6 +109,7 @@ namespace nlite{
                std::vector<CNLiteString> mail;                 //\83\81\81[\83\8b\83R\83}\83\93\83h
                ULONG_PTR thread;                                       //\83X\83\8c\83b\83h\94Ô\8d\86
                BOOL selectFlag;                                        //\91I\91ð\8fó\91Ô
+               UINT_PTR height;                                        //\95\\8e¦\97Ì\88æ\82Ì\8d\82\82³
 
        public:
                CChatData():
@@ -211,7 +215,7 @@ namespace nlite{
 
                VOID SetCurSel(INT_PTR cursel);
 
-               VOID OnChatReceve(NicoLiveChat_P chatData, UINT_PTR count);
+               VOID OnChatReceve(NicoLiveChat_P chatData, UINT_PTR count,CCommentListWindow &listWindow);
 
                reference GetChatAt(UINT_PTR no);
                
index 404c670..f3a03c6 100644 (file)
@@ -34,14 +34,6 @@ CCommentView::~CCommentView(){
 
 
 
-VOID CCommentView::Lock(){
-       ccs.Lock();
-}
-
-VOID CCommentView::Unlock(){
-       ccs.Unlock();
-}
-
 
 VOID CCommentView::OnConnect(){
        m_commentListWindow.SetRedraw(FALSE);
@@ -51,7 +43,7 @@ VOID CCommentView::OnConnect(){
        vScrollInfo.cbSize = sizeof(vScrollInfo);
        vScrollInfo.fMask = SIF_RANGE;
        this->SetScrollInfo(SB_VERT,&vScrollInfo,TRUE);
-       
+       viewStartHeight = 0;
        m_commentListWindow.SetRedraw(TRUE);
        
        
@@ -131,7 +123,7 @@ LRESULT CCommentView::OnHeaderEndTrack(LPNMHDR lParam){
        if(lParam->hwndFrom == m_header.m_hWnd){
                
                
-               
+               m_commentListWindow.SetRedraw(FALSE);
                SCROLLINFO vScrollInfo = {0};
                vScrollInfo.fMask = SIF_PAGE | SIF_POS | SIF_RANGE;
                this->GetScrollInfo(SB_VERT,&vScrollInfo);
@@ -143,27 +135,44 @@ LRESULT CCommentView::OnHeaderEndTrack(LPNMHDR lParam){
                LPNMHEADER  lpNmHdr = (LPNMHEADER )lParam;
                
                m_header.SetItem(lpNmHdr->iItem,lpNmHdr->pitem);
+
+
+               
+               
                
-               m_commentListWindow.Invalidate();
                
 
                if(scrollFlag == TRUE){
 
-                       this->SendMessageW(WM_VSCROLL,MAKEWORD(SB_BOTTOM,0),0);
+                       this->SendMessageW(WM_VSCROLL,MAKELONG(SB_BOTTOM,0),0);
                }
 
                INT_PTR itemCount = m_header.GetItemCount();
                RECT itemSizeRect;
                
                INT_PTR nMax = 0;
-               for(INT_PTR imtemIndex = 0;imtemIndex < itemCount;imtemIndex++){
-                       m_header.GetItemRect(imtemIndex,&itemSizeRect);
+               for(INT_PTR itemIndex = 0;itemIndex < itemCount;itemIndex++){
+                       m_header.GetItemRect(itemIndex,&itemSizeRect);
                        nMax += itemSizeRect.right - itemSizeRect.left;
 
                }
                INT_PTR nMin = 0;
                this->SetScrollRange(SB_HORZ,nMin,nMax,TRUE);
                DecisionHorzSize();
+
+
+               auto begin = commentlist.begin();
+
+               auto end = commentlist.end();
+
+
+               for(;begin != end;++begin){
+
+                       begin->height = m_commentListWindow.CalcItemHeight(*begin);
+               }
+
+               m_commentListWindow.SetRedraw(TRUE);
+               m_commentListWindow.Invalidate();
                        
        }
 
@@ -171,7 +180,7 @@ LRESULT CCommentView::OnHeaderEndTrack(LPNMHDR lParam){
 }
 
 VOID CCommentView::OnChatReceve(NicoLiveChat_P chat,UINT_PTR commnetCountSum){
-       commentlist.OnChatReceve(chat,commnetCountSum);
+       commentlist.OnChatReceve(chat,commnetCountSum,this->m_commentListWindow);
        return;
 }
 
@@ -199,9 +208,9 @@ VOID CCommentView::OnChatReceveSettle(UINT_PTR chatNo,UINT_PTR commentCountSum){
        vScrollInfo.nMax = commentCountSum;
        vScrollInfo.nPage = m_commentListWindow.CalcScrollPage();
        
+       
        this->SetScrollInfo(SB_VERT,&vScrollInfo);
-
-       this->GetScrollInfo(SB_VERT,&vScrollInfo);
+       
 
 
        if(scrollFlag == TRUE){
@@ -218,12 +227,7 @@ static UCHAR getrgb(){
        return rgb;
 }
 
-LRESULT CCommentView::OnListBoxDoubleClick(UINT uNotifyCode, int nID, CWindow wndCtl){
-       
 
-       
-       return 0;
-}
 
 
 
@@ -371,6 +375,8 @@ VOID CCommentView::OnVScroll(INT_PTR loWParam,SHORT hiWParam,HWND lParam){
        SCROLLINFO vScrollInfo = {0};
        vScrollInfo.fMask = SIF_ALL;
 
+       
+
        this->GetScrollInfo(SB_VERT,&vScrollInfo);
 
        switch(loWParam){
@@ -427,16 +433,19 @@ VOID CCommentView::OnVScroll(INT_PTR loWParam,SHORT hiWParam,HWND lParam){
 
        }
 
-       dy = max(-1 * vScrollInfo.nPos, min(dy, vScrollInfo.nMax - vScrollInfo.nPos));
+       dy = max(-1 * vScrollInfo.nPos, min(dy, vScrollInfo.nMax - (vScrollInfo.nPos + (INT_PTR)vScrollInfo.nPage)));
 
 
        if(dy != 0){
 
                vScrollInfo.nPos += dy;
+               viewStartHeight = vScrollInfo.nPos;
                this->SetScrollInfo(SB_VERT,&vScrollInfo);
+               
                m_commentListWindow.Invalidate();
        }
 
+               
        return;
 }
 
@@ -498,13 +507,15 @@ VOID CCommentView::DecisionHorzSize(){
 }
 
 
+
+
 //
 //\83R\83\81\83\93\83g\83r\83\85\81[\83N\83\89\83X\93à\95\94\83\8a\83X\83g\83N\83\89\83X
 ////////////////////////////////////////////////////////////////////
 
-CCommentListWindow::CCommentListWindow(CCommentView &in_self):self(in_self){   
-
-}
+CCommentListWindow::CCommentListWindow(CCommentView &in_self):
+       self(in_self)
+{}
 
 CCommentListWindow::~CCommentListWindow(){
 
@@ -535,15 +546,13 @@ VOID CCommentListWindow::OnPaint(HDC hdc){
 
 
 
-               
-       SCROLLINFO vScrollInfo = {0};
-       vScrollInfo.fMask = SIF_ALL;
-       self.GetScrollInfo(SB_VERT,&vScrollInfo);
-       if(commentList.Size() > (UINT_PTR)vScrollInfo.nPos){
+       
+       
+       if(commentList.Size() > (UINT_PTR)self.viewStartHeight){
 
                CCommentList::iterator chatData = commentList.begin();
                
-               std::advance(chatData,vScrollInfo.nPos);
+               std::advance(chatData,self.viewStartHeight);
                CBrush baseBkBrush;
                baseBkBrush.CreateSolidBrush(self.viewproperty.backColor);
                m_memoryDC.FillRect(&listRect,baseBkBrush);
@@ -572,6 +581,8 @@ VOID CCommentListWindow::OnPaint(HDC hdc){
        HDC selfDC = this->BeginPaint(&ps);
        ::BitBlt(selfDC,0,0,windowRect.right,windowRect.bottom,m_memoryDC,0,0,SRCCOPY);
        this->EndPaint(&ps);
+
+       
        return;
 }
 
@@ -587,7 +598,7 @@ VOID CCommentListWindow::OnSize(UINT wParam, _WTYPES_NS::CSize &windowSize){
        self.SetScrollInfo(SB_VERT,&vScrollInfo);
        
        if(scrollFlag == TRUE){
-               self.SendMessageW(WM_VSCROLL,MAKEWORD(SB_BOTTOM,0),0);
+               self.SendMessageW(WM_VSCROLL,MAKELONG(SB_BOTTOM,0),0);
        }
        return;
 }
@@ -607,7 +618,7 @@ UINT_PTR CCommentListWindow::CalcScrollPage(){
                CCommentList::reverse_iterator rend = self.commentlist.rend();
                for(;rbegin != rend;++rbegin){
 
-                       height += CalcItemHeight(*rbegin);
+                       height += rbegin->height;
                        rslt++;
                        if(height > clientRect.bottom)goto overclientrect;
                        
@@ -801,8 +812,17 @@ end:
        return lineNo;
 }
 
+
+
 VOID CCommentListWindow::OnLButtonDown(UINT wParam, _WTYPES_NS::CPoint &point){
 
+       
+
+       
+
+       
+       this->SetFocus();
+       if(self.commentlist.empty() == TRUE)return;
        auto curselItem = self.commentlist.GetCurSelItem();
        if(curselItem != self.commentlist.end()){
                curselItem->selectFlag = FALSE;
@@ -819,7 +839,9 @@ VOID CCommentListWindow::OnLButtonDbClk(UINT wParam, _WTYPES_NS::CPoint &point){
        
 
        
-       
+       this->SetFocus();
+       if(self.commentlist.empty() == TRUE)return;
+               
        auto chatData = self.commentlist.GetChatAt(CalcClickLine(point.y));
        COLORREF bkColor;
        if(chatData.listenerData->originBkFlag == FALSE){
@@ -853,9 +875,11 @@ VOID CCommentListWindow::OnLButtonDbClk(UINT wParam, _WTYPES_NS::CPoint &point){
        chatData.listenerData->SetBkColor(bkColor);
 
        this->Invalidate(TRUE);
+               
+       
+       
        
        
-
        return;
 }
 
@@ -863,3 +887,14 @@ LRESULT CCommentListWindow::OnEraseBkGnd(HDC lparam){
 
        return TRUE;
 }
+
+LRESULT CCommentListWindow::OnMouseWheel(UINT loWparam,SHORT hiWparam,CPoint &point){
+
+       
+       self.SendMessageW(WM_VSCROLL,MAKELONG(hiWparam < 0 ? SB_PAGEDOWN : SB_PAGEUP ,0),0);
+       
+       return 0;
+}
+
+
+
index a4a4b11..8effa0b 100644 (file)
@@ -27,8 +27,7 @@ namespace nlite{
                CCommentView &self;
                CBitmap m_bitmap;
                CDC m_memoryDC;
-               
-       
+
                struct ColorList{
                        enum type{
                                selectBack = RGB(255,240,240),
@@ -51,6 +50,7 @@ namespace nlite{
                        MSG_WM_LBUTTONDOWN(OnLButtonDown)
                        MSG_WM_CREATE(OnCreate)
                        MSG_WM_ERASEBKGND(OnEraseBkGnd)
+                       MSG_WM_MOUSEWHEEL(OnMouseWheel)
                        MSG_WM_PAINT(OnPaint)
                        MSG_WM_SIZE(OnSize)
                END_MSG_MAP()
@@ -75,6 +75,12 @@ namespace nlite{
                ///
                UINT_PTR CalcScrollPage();
 
+               ///
+               ///\8ds\82Ì\8d\82\82³\82ð\96â\82¢\8d\87\82í\82¹
+               ///
+               UINT_PTR CalcItemHeight(CChatData &chatData);
+               
+
                //\83v\83\89\83C\83x\81[\83g\8aÖ\90\94
        private:
 
@@ -84,10 +90,7 @@ namespace nlite{
                VOID DrawItem(CDC &dc,RECT &rc,CChatData &chatData);
 
 
-               ///
-               ///\8ds\82Ì\8d\82\82³\82ð\96â\82¢\8d\87\82í\82¹
-               ///
-               UINT_PTR CalcItemHeight(CChatData &chatData);
+               
 
                ///
                ///\83N\83\8a\83b\83N\82µ\82½\8ds\82ð\8cv\8eZ
@@ -127,6 +130,12 @@ namespace nlite{
                ///\94w\8ci\93h\82è\82Â\82Ô\82µ
                ///
                LRESULT OnEraseBkGnd(HDC lparam);
+
+               ///
+               ///\83}\83E\83X\83z\83C\81[\83\8b
+               ///
+               LRESULT OnMouseWheel(UINT loWparam,SHORT hiWparam,CPoint &point);
+               
        };
        
        class CCommentView:public CWindowImpl<CCommentView>{
@@ -153,11 +162,11 @@ namespace nlite{
 
                CHeaderCtrl m_header;
                CCommentListWindow  m_commentListWindow;
-               CComAutoCriticalSection ccs;
+               CComAutoCriticalSection vScrollCS;
                CStreamStatus streamStatus;
                CCommentList commentlist;
                CommentViewProperty viewproperty;
-               
+               INT_PTR viewStartHeight;
                HFONT hHeaderFontNew;
 
 
@@ -203,7 +212,6 @@ namespace nlite{
                        MSG_WM_HSCROLL(OnHScroll)
                        MSG_WM_VSCROLL(OnVScroll)
                        MSG_WM_ERASEBKGND(OnEraseBkgnd)
-                       COMMAND_CODE_HANDLER_EX(LBN_DBLCLK,OnListBoxDoubleClick)
                        NOTIFY_CODE_HANDLER_EX(HDN_ENDTRACK   ,OnHeaderEndTrack)
                        NOTIFY_CODE_HANDLER_EX(HDN_ENDDRAG ,OnHeaderEndDrag)
                END_MSG_MAP()
@@ -252,16 +260,6 @@ namespace nlite{
 
                //\83v\83\89\83C\83x\81[\83g\8aÖ\90\94
        private:
-               
-               ///
-               ///\83N\83\8a\83e\83B\83J\83\8b\83Z\83N\83V\83\87\83\93\83\8d\83b\83N
-               ///
-               VOID Lock();
-
-               ///
-               ///\83N\83\8a\83e\83B\83J\83\8b\83Z\83N\83V\83\87\83\93\83\8d\83b\83N\89ð\8f\9c
-               ///
-               VOID Unlock();
 
 
                ///
@@ -313,10 +311,6 @@ namespace nlite{
                ///
                LRESULT OnHeaderEndDrag(LPNMHDR lParam);
 
-               ///
-               ///\83\8a\83X\83g\83{\83b\83N\83X\83_\83u\83\8b\83N\83\8a\83b\83N\8e\9e\82Ì\8f\88\97\9d
-               ///
-               LRESULT OnListBoxDoubleClick(UINT uNotifyCode, int nID, CWindow wndCtl);
 
                ///
                ///\89¡\83X\83N\83\8d\81[\83\8b\8e\9e\82Ì\8f\88\97\9d
@@ -336,6 +330,7 @@ namespace nlite{
                
                
                
+               
 
 
        };