-VOID CCommentView::Lock(){
- ccs.Lock();
-}
-
-VOID CCommentView::Unlock(){
- ccs.Unlock();
-}
-
VOID CCommentView::OnConnect(){
m_commentListWindow.SetRedraw(FALSE);
vScrollInfo.cbSize = sizeof(vScrollInfo);
vScrollInfo.fMask = SIF_RANGE;
this->SetScrollInfo(SB_VERT,&vScrollInfo,TRUE);
-
+ viewStartHeight = 0;
m_commentListWindow.SetRedraw(TRUE);
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);
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();
}
}
VOID CCommentView::OnChatReceve(NicoLiveChat_P chat,UINT_PTR commnetCountSum){
- commentlist.OnChatReceve(chat,commnetCountSum);
+ commentlist.OnChatReceve(chat,commnetCountSum,this->m_commentListWindow);
return;
}
vScrollInfo.nMax = commentCountSum;
vScrollInfo.nPage = m_commentListWindow.CalcScrollPage();
+
this->SetScrollInfo(SB_VERT,&vScrollInfo);
-
- this->GetScrollInfo(SB_VERT,&vScrollInfo);
+
if(scrollFlag == TRUE){
return rgb;
}
-LRESULT CCommentView::OnListBoxDoubleClick(UINT uNotifyCode, int nID, CWindow wndCtl){
-
-
- return 0;
-}
SCROLLINFO vScrollInfo = {0};
vScrollInfo.fMask = SIF_ALL;
+
+
this->GetScrollInfo(SB_VERT,&vScrollInfo);
switch(loWParam){
}
- 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;
}
}
+
+
//
//\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(){
-
- 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);
HDC selfDC = this->BeginPaint(&ps);
::BitBlt(selfDC,0,0,windowRect.right,windowRect.bottom,m_memoryDC,0,0,SRCCOPY);
this->EndPaint(&ps);
+
+
return;
}
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;
}
CCommentList::reverse_iterator rend = self.commentlist.rend();
for(;rbegin != rend;++rbegin){
- height += CalcItemHeight(*rbegin);
+ height += rbegin->height;
rslt++;
if(height > clientRect.bottom)goto overclientrect;
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;
-
+ this->SetFocus();
+ if(self.commentlist.empty() == TRUE)return;
+
auto chatData = self.commentlist.GetChatAt(CalcClickLine(point.y));
COLORREF bkColor;
if(chatData.listenerData->originBkFlag == FALSE){
chatData.listenerData->SetBkColor(bkColor);
this->Invalidate(TRUE);
+
+
+
-
return;
}
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;
+}
+
+
+
CCommentView &self;
CBitmap m_bitmap;
CDC m_memoryDC;
-
-
+
struct ColorList{
enum type{
selectBack = RGB(255,240,240),
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()
///
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:
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
///\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>{
CHeaderCtrl m_header;
CCommentListWindow m_commentListWindow;
- CComAutoCriticalSection ccs;
+ CComAutoCriticalSection vScrollCS;
CStreamStatus streamStatus;
CCommentList commentlist;
CommentViewProperty viewproperty;
-
+ INT_PTR viewStartHeight;
HFONT hHeaderFontNew;
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()
//\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();
///
///
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
+
};