2 #include "nlite_include.h"
8 static const UINT_PTR SELL_SPACE_LENGTH = 1;
10 //
\83R
\83\81\83\93\83g
\83r
\83\85\81[
\93à
\82Ì
\83R
\83\93\83g
\83\8d\81[
\83\8b\83N
\83\89\83X
11 ///////////////////////////////////////////////////////////////////
13 BOOL CChatReadEdit::SetWindowText(LPCTSTR str){
15 return __super::SetWindowText(str);
21 HWND CChatReadEdit::GeneralCreate(HWND hParent,DWORD eventMask,UINT id){
24 this->Create(hParent,0,RICHEDIT_CLASS,WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | ES_AUTOVSCROLL | ES_MULTILINE | ES_READONLY,0,id);
26 DWORD dwLangOptons = this->SendMessage(EM_GETLANGOPTIONS,0,0);
27 dwLangOptons &= ~IMF_DUALFONT;
28 this->SendMessage(EM_SETLANGOPTIONS,0,(LPARAM)dwLangOptons);
31 CFont defFont = ::AtlGetDefaultGuiFont();
33 defFont.GetLogFont(&deflogFont);
34 CHARFORMAT2 m_defCharFormat;
35 this->GetDefaultCharFormat(m_defCharFormat);
36 CDC cDC = this->GetDC();
37 int picy = cDC.GetDeviceCaps(LOGPIXELSY);
38 this->ReleaseDC(cDC.m_hDC);
39 int point = -MulDiv(deflogFont.lfHeight,72,picy);
40 int twips = point * 20;
41 m_defCharFormat.yHeight = twips;
42 _tcscpy(m_defCharFormat.szFaceName,deflogFont.lfFaceName);
43 this->SetEventMask(eventMask);
45 this->SetDefaultCharFormat(m_defCharFormat);
52 CChatChildCtrls::CChatChildCtrls(CCommentView &hMaster):
61 VOID CChatChildCtrls::Create(){
63 this->chatDispCtrl.GeneralCreate(m_master.m_commentListWindow,ENM_LINK | ENM_MOUSEEVENTS,CHAT_DISPCTRL_ID);
67 VOID CChatChildCtrls::AdjustRect(RECT &rc){
69 rc.left += SELL_SPACE_LENGTH;
70 rc.top += SELL_SPACE_LENGTH;
71 rc.right -= SELL_SPACE_LENGTH;
72 rc.bottom -= SELL_SPACE_LENGTH;
77 VOID CChatChildCtrls::Hide(HDWP hdwp){
79 chatDispCtrl.DeferWindowPos(hdwp,chatDispCtrl,0,0,0,0,SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_HIDEWINDOW);
83 VOID CChatChildCtrls::SetCtrl(HDWP hdwp,const RECT &rc,CCommentList::reference comment,BOOL mulutiLineFlag){
86 chatDispCtrl.SetWindowText(comment.chatBuf);
94 if (comment.viewData.selectFlag == TRUE)
96 bkColor = m_master.viewproperty.selectBackColor;
103 if(comment.viewData.backColor != CChatData::ViewData::INIT_COLOR){
105 bkColor = comment.viewData.backColor;
107 }else if(comment.listenerData->originBkFlag == TRUE){
109 bkColor = comment.listenerData->bkColor;
114 bkColor = m_master.viewproperty.backColor;
122 chatDispCtrl.SetBackgroundColor(bkColor);
124 chatDispCtrl.DeferWindowPos(hdwp,NULL,chatRect.left,chatRect.top,chatRect.right - chatRect.left ,chatRect.bottom - chatRect.top, SWP_NOZORDER | SWP_SHOWWINDOW);
129 UINT_PTR CChatChildCtrls::GetCtrlCount(){
137 ///
\83R
\83\93\83X
\83g
\83\89\83N
\83^
139 CChatChildCtrlsList::CChatChildCtrlsList(CCommentView &hMaster):m_hMaster(hMaster){
147 ///
\83R
\83\93\83g
\83\8d\81[
\83\8b\82ð
\95\
\8e¦
149 VOID CChatChildCtrlsList::ShowCntrls(){
156 if(m_hMaster.commentlist.Size() > 0){
163 m_hMaster.m_commentListWindow.GetClientRect(&listRect);
164 m_hMaster.m_header.GetItemRect(CCommentView::COMMENT,&headerRect);
166 headerRect.bottom = 0;
168 UINT_PTR counter = 0;
169 INT_PTR heightSum =0;
171 auto ctrlsBegin = m_list.begin();
172 auto ctrlsEnd = m_list.end();
173 auto chatDataBegin = m_hMaster.commentlist.GetShortCut();
174 auto chatDataEnd = m_hMaster.commentlist.end();
175 auto chatDataTmp = chatDataBegin;
176 for(;chatDataBegin != chatDataEnd && heightSum < listRect.bottom;++chatDataBegin){
177 m_hMaster.m_commentListWindow.CalcItemHeight(*chatDataBegin);
179 heightSum += chatDataBegin->viewData.height;
184 chatDataBegin = chatDataTmp;
186 HDWP hdwp = ::BeginDeferWindowPos(CChatChildCtrls::GetCtrlCount() * (counter > m_list.size() ? counter : m_list.size()));
187 for(; chatDataBegin != chatDataEnd && counter > 0 ;++ctrlsBegin,++chatDataBegin,--counter){
190 tmpRect = headerRect;
191 tmpRect.top += heightSum;
192 tmpRect.bottom += heightSum + chatDataBegin->viewData.height;
194 if(ctrlsBegin == ctrlsEnd)ctrlsBegin = Extend();
196 ctrlsBegin->SetCtrl(hdwp,tmpRect,*chatDataBegin,m_hMaster.viewproperty.commentFoldingFlag);
198 heightSum = tmpRect.bottom;
203 for(;ctrlsBegin != ctrlsEnd;++ctrlsBegin){
205 ctrlsBegin->Hide(hdwp);
208 ::EndDeferWindowPos(hdwp);
218 VOID CChatChildCtrlsList::AllHide(){
220 auto begin =m_list.begin();
221 auto end = m_list.end();
223 HDWP hdwp = ::BeginDeferWindowPos(CChatChildCtrls::GetCtrlCount() * m_list.size());
224 for(;begin != end;++begin){
227 ::EndDeferWindowPos(hdwp);
232 ///
\8ag
\92£
\8f\88\97\9d
234 CChatChildCtrlsList::iterator CChatChildCtrlsList::Extend(){
237 CChatChildCtrls ctrls(m_hMaster);
239 m_list.push_back(ctrls);
240 m_list.back().Create();
241 auto ite = (--m_list.end());
248 //
\83R
\83\81\83\93\83g
\83r
\83\85\81[
\83N
\83\89\83X
\83\81\83\
\83b
\83h
249 ///////////////////////////////////////////////////////
251 CCommentView::CCommentView(CNicoLiveStream &stream):
252 m_commentListWindow(*this),
255 ,chatChildCtrlsList(*this)
261 lf.lfCharSet = SHIFTJIS_CHARSET;
264 hHeaderFontNew = CreateFontIndirect(&lf);
271 CCommentView::~CCommentView(){
274 DeleteObject(hHeaderFontNew);
282 VOID CCommentView::OnConnect(){
283 m_commentListWindow.SetRedraw(FALSE);
284 m_commentListWindow.ResetViewSellHeight();
286 chatChildCtrlsList.AllHide();
289 commentlist.OnConnect();
291 SCROLLINFO vScrollInfo = {0};
292 vScrollInfo.cbSize = sizeof(vScrollInfo);
293 vScrollInfo.fMask = SIF_ALL;
295 this->SetScrollInfo(SB_VERT,&vScrollInfo,FALSE);
297 m_commentListWindow.SetRedraw(TRUE);
298 m_commentListWindow.Invalidate();
305 UINT_PTR CCommentView::GetColumnHolSizeSum(){
309 this->GetScrollRange(SB_HORZ,&nMin,&nMax);
314 VOID CCommentView::SetProperty(CommentViewProperty &setProperty){
316 viewproperty = setProperty;
317 m_commentListWindow.OnSetProperty();
322 CommentViewProperty &CCommentView::GetProperty(){
332 HWND CCommentView::Create(HWND hWndParent){
336 HWND rslt = __super::Create(hWndParent,0,commentViewConstant::NLITE_COMMENTVIEW,WS_VISIBLE | WS_CHILD | WS_VSCROLL | WS_HSCROLL | WS_BORDER,0,commentViewConstant::MENU_OR_ID);
339 HDC hdc = m_header.BeginPaint(&ps);
342 HFONT hOld = (HFONT)SelectObject(hdc,hHeaderFontNew);
344 LPTSTR columns[] = {TEXT("
\83R
\83\81\94Ô"),TEXT("
\83\86\81[
\83U
\81[
\96¼"),TEXT("
\83R
\83\81\83\93\83g"),TEXT("
\8e\9e\8aÔ"),TEXT("
\8fî
\95ñ")};
345 UINT_PTR holizenSize[] = {0,0,100,0,0};
347 for(UINT_PTR index = 0;index < ARRAY_LENGTH(columns) ;++index){
349 GetTextExtentPoint32(hdc , columns[index] , _tcslen(columns[index]) , &size);
350 UINT_PTR holsize = holizenSize[index] + size.cx + 15;
351 holizenSize[index] = viewproperty.headerholSize[index] >= 0 ? viewproperty.headerholSize[index] : holsize;
354 SelectObject(hdc,hOld);
356 m_header.EndPaint(&ps);
359 HEADERSINFO headersinfo = {columns,holizenSize,ARRAY_LENGTH(columns)};
361 AddHeader(&headersinfo);
363 m_header.SetOrderArray(ARRAY_LENGTH(viewproperty.headerOrderArray),viewproperty.headerOrderArray);
374 LRESULT CCommentView::OnHeaderEndTrack(LPNMHDR lParam){
377 if(lParam->hwndFrom == m_header.m_hWnd){
380 auto begin = commentlist.begin();
382 auto end = commentlist.end();
384 for(;begin != end;++begin){
386 begin->viewData.height = 0;
390 m_commentListWindow.SetRedraw(FALSE);
391 SCROLLINFO vScrollInfo = {0};
392 vScrollInfo.fMask = SIF_PAGE | SIF_POS | SIF_RANGE;
394 this->GetScrollInfo(SB_VERT,&vScrollInfo);
395 vScrollInfo.nPage = m_commentListWindow.CalcScrollPage(vScrollInfo.nMax);
396 vScrollInfo.fMask = SIF_PAGE;
397 this->SetScrollInfo(SB_VERT,&vScrollInfo);
399 BOOL scrollFlag = vScrollInfo.nPos + (int)vScrollInfo.nPage + 1>= vScrollInfo.nMax;
400 UINT_PTR commentCount = commentlist.Size();
401 LPNMHEADER lpNmHdr = (LPNMHEADER )lParam;
403 m_header.SetItem(lpNmHdr->iItem,lpNmHdr->pitem);
411 if(scrollFlag == TRUE){
413 this->m_commentListWindow.SendMessageW(WM_VSCROLL,MAKELONG(SB_BOTTOM,0),0);
416 INT_PTR itemCount = m_header.GetItemCount();
420 for(INT_PTR itemIndex = 0;itemIndex < itemCount;itemIndex++){
421 m_header.GetItemRect(itemIndex,&itemSizeRect);
422 nMax += itemSizeRect.right - itemSizeRect.left;
426 this->SetScrollRange(SB_HORZ,nMin,nMax,TRUE);
432 m_commentListWindow.SetRedraw(TRUE);
434 m_commentListWindow.Invalidate();
435 this->m_commentListWindow.SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
442 VOID CCommentView::OnChatReceve(NicoLiveChat_P chat,UINT_PTR commnetCountSum){
445 commentlist.OnChatReceve(chat,commnetCountSum,this->m_commentListWindow);
451 VOID CCommentView::OnChatReceveSettle(UINT_PTR chatNo,UINT_PTR commentCountSum){
454 SCROLLINFO vScrollInfo = {0};
457 vScrollInfo.fMask = SIF_ALL;
459 this->GetScrollInfo(SB_VERT,&vScrollInfo);
460 BOOL scrollFlag = vScrollInfo.nPos + (int)vScrollInfo.nPage >= vScrollInfo.nMax;
462 vScrollInfo.cbSize = sizeof(vScrollInfo);
463 vScrollInfo.nMax = commentCountSum;
464 vScrollInfo.fMask = SIF_RANGE | SIF_PAGE;
465 vScrollInfo.nPage = m_commentListWindow.CalcScrollPage(vScrollInfo.nMax);
468 this->SetScrollInfo(SB_VERT,&vScrollInfo,FALSE);
473 if(scrollFlag == TRUE){
474 this->PostMessage(WM_VSCROLL,MAKEWORD(SB_BOTTOM,0),0);
478 if(vScrollInfo.nPos + static_cast<INT_PTR>(vScrollInfo.nPage) >= vScrollInfo.nMax - static_cast<INT_PTR>(vScrollInfo.nPage)){
479 m_commentListWindow.Invalidate();
481 this->PostMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
487 static UCHAR getrgb(){
489 UCHAR rgb = 192 + rand() % 64;
503 LRESULT CCommentView::OnSize(UINT wParam,SIZE lParam){
510 VOID CCommentView::ChangeSize(const SIZE& client){
512 SCROLLINFO hScrollInfo = {0};
513 hScrollInfo.cbSize = sizeof(hScrollInfo);
514 hScrollInfo.fMask = SIF_PAGE;
515 hScrollInfo.nPage = client.cx;
517 this->SetScrollInfo(SB_HORZ,&hScrollInfo);
518 hScrollInfo.fMask = SIF_ALL;
519 this->GetScrollInfo(SB_HORZ,&hScrollInfo);
522 HDWP hDwp = BeginDeferWindowPos(2);
525 INT_PTR movePos = -1 * hScrollInfo.nPos;
527 m_header.DeferWindowPos(hDwp,m_header.m_hWnd,movePos,0,0,0,SWP_NOSIZE | SWP_NOZORDER);
528 m_commentListWindow.DeferWindowPos(hDwp,m_commentListWindow.m_hWnd,movePos,commentViewConstant::HEADER_HAIGHT,::GetSystemMetrics(SM_CXFULLSCREEN),client.cy - commentViewConstant::HEADER_HAIGHT,SWP_NOZORDER);
530 EndDeferWindowPos(hDwp);
535 m_header.GetWindowRect(&headerRectSize);
536 bkRect.left = headerRectSize.right - headerRectSize.left - hScrollInfo.nPos;
538 bkRect.right = client.cx ;
539 bkRect.bottom = client.cy;
546 LRESULT CCommentView::OnEraseBkgnd(HDC wParam){
552 VOID CCommentView::OnDestroy(){
553 m_header.GetOrderArray(ARRAY_LENGTH(viewproperty.headerOrderArray),viewproperty.headerOrderArray);
554 INT_PTR headerItemcount = m_header.GetItemCount();
556 for(INT_PTR itemindex = 0;itemindex < headerItemcount;itemindex++){
558 m_header.GetItemRect(itemindex,&headerItemRect);
559 viewproperty.headerholSize[itemindex] = headerItemRect.right - headerItemRect.left;
561 commentlist.OnDestroy();
562 m_header.DestroyWindow();
563 m_commentListWindow.DestroyWindow();
568 LRESULT CCommentView::OnHeaderEndDrag(LPNMHDR lParam){
570 if(lParam->hwndFrom == m_header.m_hWnd){
572 LPNMHEADER pNMHeader = (LPNMHEADER) lParam;
573 this->m_header.SetItem(pNMHeader->iItem,pNMHeader->pitem);
575 m_commentListWindow.Invalidate();
576 this->m_commentListWindow.SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
584 LRESULT CCommentView::OnHeaderItemChanged(LPNMHDR lParam){
586 if(lParam->hwndFrom == m_header.m_hWnd){
589 m_commentListWindow.Invalidate();
590 this->m_commentListWindow.SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
598 VOID CCommentView::OnHScroll(INT_PTR loWParam,SHORT hiWParam,HWND lParam){
602 SCROLLINFO hScrollInfo = {0};
603 hScrollInfo.cbSize = sizeof(hScrollInfo);
604 hScrollInfo.fMask = SIF_ALL;
605 this->GetScrollInfo(SB_HORZ,&hScrollInfo);
608 case SB_THUMBPOSITION:
610 dy = hiWParam - hScrollInfo.nPos;
616 dy = -1 * hScrollInfo.nPage;
623 dy = hScrollInfo.nPage + hScrollInfo.nPos > (UINT_PTR)hScrollInfo.nMax ? 0 :(UINT_PTR) (hScrollInfo.nMax - ( hScrollInfo.nPage + hScrollInfo.nPos)) < hScrollInfo.nPage ? (hScrollInfo.nMax - ( hScrollInfo.nPage + hScrollInfo.nPos)) : hScrollInfo.nPage;
633 dy = max(-1 * hScrollInfo.nPos, min(dy, hScrollInfo.nMax - hScrollInfo.nPos));
637 hScrollInfo.nPos += dy;
638 INT_PTR moveRange = -(hScrollInfo.nPos);
640 HDWP hDwp = BeginDeferWindowPos(2);
642 m_header.DeferWindowPos(hDwp,m_header.m_hWnd,moveRange,0,0,0,SWP_NOSIZE | SWP_NOZORDER);
643 m_commentListWindow.DeferWindowPos(hDwp,m_commentListWindow.m_hWnd,moveRange,commentViewConstant::HEADER_HAIGHT,0,0,SWP_NOSIZE | SWP_NOZORDER);
645 EndDeferWindowPos(hDwp);
648 this->SetScrollInfo(SB_HORZ,&hScrollInfo);
655 VOID CCommentView::OnVScroll(INT_PTR loWParam,SHORT hiWParam,HWND lParam){
658 SCROLLINFO vScrollInfo = {0};
659 vScrollInfo.fMask = SIF_ALL;
662 this->GetScrollInfo(SB_VERT,&vScrollInfo);
667 case SB_THUMBPOSITION:
670 dy = hiWParam - vScrollInfo.nPos;
687 dy = -1 * vScrollInfo.nPage;
693 dy = vScrollInfo.nPage;
700 dy = -vScrollInfo.nPos;
706 dy = vScrollInfo.nMax;
723 vScrollInfo.nPos += dy;
724 // viewStartHeight = vScrollInfo.nPos;
725 this->SetScrollPos(SB_VERT,vScrollInfo.nPos);
726 this->commentlist.SetShortCut(this->GetScrollPos(SB_VERT));
727 //this->SetScrollInfo(SB_VERT,&vScrollInfo);
728 this->UpdateWindow();
730 m_commentListWindow.Invalidate();
731 this->m_commentListWindow.SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
739 LRESULT CCommentView::OnCreate(LPCREATESTRUCT lpcs){
740 m_header.Create(m_hWnd,0,WC_HEADER,WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | HDS_BUTTONS | HDS_HOTTRACK |HDS_DRAGDROP | HDS_FULLDRAG ,0,commentViewConstant::HEADER_ID);
741 m_commentListWindow.Create(m_hWnd,0,commentViewConstant::NLITE_COMMENTLISTWINDOW,WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN , 0,commentViewConstant::LISTWINDOW);
748 VOID CCommentView::AddHeader(LPHEADERSINFO infos){
751 m_header.SetFont(hHeaderFontNew);
754 item.mask = HDI_FORMAT | HDI_TEXT | HDI_WIDTH;
755 item.fmt = HDF_CENTER | HDF_STRING;
758 for(UINT_PTR index = 0;index < infos->count ;++index){
760 item.pszText = infos->columns[index];
762 item.cxy = infos->holizensize[index];
763 m_header.AddItem(&item);
768 UINT_PTR itemCount = m_header.GetItemCount();
769 for(UINT_PTR u_index = 0;u_index < itemCount;++u_index){
771 m_header.GetItemRect(u_index,&itemRect);
772 nMax += itemRect.right - itemRect.left;
776 this->SetScrollRange(SB_HORZ,0,nMax,TRUE);
782 VOID CCommentView::DecisionHorzSize(){
784 HDWP hWindowPosInfo = BeginDeferWindowPos(2);
786 this->GetClientRect(&bkWindowRect);
787 m_header.DeferWindowPos(hWindowPosInfo,m_header.m_hWnd,0,0,::GetSystemMetrics(SM_CXFULLSCREEN),commentViewConstant::HEADER_HAIGHT,SWP_NOZORDER | SWP_NOMOVE);
788 m_commentListWindow.DeferWindowPos(hWindowPosInfo,m_header.m_hWnd,0,0,::GetSystemMetrics(SM_CXFULLSCREEN),bkWindowRect.bottom - commentViewConstant::HEADER_HAIGHT,SWP_NOZORDER | SWP_NOMOVE);
790 EndDeferWindowPos(hWindowPosInfo);
799 //
\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
800 ////////////////////////////////////////////////////////////////////
802 CCommentListWindow::CCommentListWindow(CCommentView &in_self):
806 CFontHandle font = ::AtlGetDefaultGuiFont();
808 font.GetLogFont(&logfont);
809 logfont.lfUnderline = TRUE;
811 linkFont.CreateFontIndirect(&logfont);
814 CCommentListWindow::~CCommentListWindow(){
817 VOID CCommentListWindow::OnSetProperty(){
819 if(IsWindow() == TRUE)this->SetRedraw(FALSE);
821 if(collLinePen.IsNull() == FALSE)collLinePen.DeleteObject();
822 if(normalSellLinePen.IsNull() == FALSE)normalSellLinePen.DeleteObject();
823 if(normalBkBrush.IsNull() == FALSE)normalBkBrush.DeleteObject();
824 if(selectSellLinePen.IsNull() ==FALSE)selectSellLinePen.DeleteObject();
825 if(selectBkBrush.IsNull() == FALSE)selectBkBrush.DeleteObject();
827 collLinePen.CreatePen(PS_SOLID,1,self.viewproperty.colLineColor);
828 normalSellLinePen.CreatePen(PS_SOLID,1,self.viewproperty.normalSellLineColor);
829 normalBkBrush.CreateSolidBrush(self.viewproperty.backColor);
830 selectSellLinePen.CreatePen(PS_SOLID,1,self.viewproperty.selectSellLineColor);
831 selectBkBrush.CreateSolidBrush(self.viewproperty.selectBackColor);
834 if(IsWindow() == TRUE)this->SetRedraw(TRUE);
838 VOID CCommentListWindow::OnPaint(HDC in_hdc){
846 self.GetClientRect(&clientRect);
847 clientRect.bottom -= commentViewConstant::HEADER_HAIGHT;
849 this->GetWindowRect(&windowRect);
850 windowRect.right -= windowRect.left;
851 windowRect.bottom -= windowRect.top;
859 CMemoryDC mdc(pdc,windowRect);
860 mdc.SelectFont(AtlGetDefaultGuiFont());
863 CCommentList &commentList = self.commentlist;
865 BOOL selectFlag = FALSE;
866 CCommentList::iterator selectData;
867 RECT selectRect = {0};
871 if(commentList.Size() > 0){
873 listRect = windowRect;
874 listRect.right = self.GetColumnHolSizeSum();
876 CCommentList::iterator chatData = commentList.GetShortCut();
881 mdc.FillRect(&listRect,this->normalBkBrush);
883 CCommentList::iterator endData = commentList.end();
886 RECT headerRects[COMMENTVIEW_HEADERITEMSIZE];
887 RECT colLineRects[COMMENTVIEW_HEADERITEMSIZE];
888 RECT selectHeaderRects[COMMENTVIEW_HEADERITEMSIZE];
890 self.m_header.GetItemRect(CCommentView::NO,&headerRects[CCommentView::NO]);
891 self.m_header.GetItemRect(CCommentView::USERNAME,&headerRects[CCommentView::USERNAME]);
892 self.m_header.GetItemRect(CCommentView::COMMENT,&headerRects[CCommentView::COMMENT]);
893 self.m_header.GetItemRect(CCommentView::TIME,&headerRects[CCommentView::TIME]);
894 self.m_header.GetItemRect(CCommentView::INFO,&headerRects[CCommentView::INFO]);
896 memcpy(colLineRects,headerRects,sizeof(headerRects));
902 headerRects[CCommentView::NO].left += SELL_SPACE_LENGTH;
903 headerRects[CCommentView::USERNAME].left += SELL_SPACE_LENGTH;
904 headerRects[CCommentView::COMMENT].left += SELL_SPACE_LENGTH;
905 headerRects[CCommentView::TIME].left += SELL_SPACE_LENGTH;
906 headerRects[CCommentView::INFO].left += SELL_SPACE_LENGTH;
908 headerRects[CCommentView::NO].right -= SELL_SPACE_LENGTH;
909 headerRects[CCommentView::USERNAME].right -= SELL_SPACE_LENGTH;
910 headerRects[CCommentView::COMMENT].right -= SELL_SPACE_LENGTH;
911 headerRects[CCommentView::TIME].right -= SELL_SPACE_LENGTH;
912 headerRects[CCommentView::INFO].right -= SELL_SPACE_LENGTH;
914 headerRects[CCommentView::NO].top = SELL_SPACE_LENGTH;
915 headerRects[CCommentView::USERNAME].top = SELL_SPACE_LENGTH;
916 headerRects[CCommentView::COMMENT].top = SELL_SPACE_LENGTH;
917 headerRects[CCommentView::TIME].top = SELL_SPACE_LENGTH;
918 headerRects[CCommentView::INFO].top = SELL_SPACE_LENGTH;
920 headerRects[CCommentView::NO].bottom = SELL_SPACE_LENGTH;
921 headerRects[CCommentView::USERNAME].bottom = SELL_SPACE_LENGTH;
922 headerRects[CCommentView::COMMENT].bottom = SELL_SPACE_LENGTH;
923 headerRects[CCommentView::TIME].bottom = SELL_SPACE_LENGTH;
924 headerRects[CCommentView::INFO].bottom = SELL_SPACE_LENGTH;
926 INT_PTR listRectTop = listRect.top;
927 for(;chatData != endData && listRect.top < clientRect.bottom;++chatData){
928 CalcItemHeight(*chatData);
930 // dumpln(TEXT("height:%d"),chatData->viewData.height);
931 listRect.bottom += chatData->viewData.height;
933 headerRects[CCommentView::NO].top = listRect.top + SELL_SPACE_LENGTH;
934 headerRects[CCommentView::USERNAME].top = listRect.top + SELL_SPACE_LENGTH;
935 headerRects[CCommentView::COMMENT].top = listRect.top + SELL_SPACE_LENGTH;
936 headerRects[CCommentView::TIME].top = listRect.top + SELL_SPACE_LENGTH;
937 headerRects[CCommentView::INFO].top = listRect.top + SELL_SPACE_LENGTH;
939 headerRects[CCommentView::NO].bottom = listRect.bottom - SELL_SPACE_LENGTH;
940 headerRects[CCommentView::USERNAME].bottom = listRect.bottom - SELL_SPACE_LENGTH;
941 headerRects[CCommentView::COMMENT].bottom = listRect.bottom - SELL_SPACE_LENGTH;
942 headerRects[CCommentView::TIME].bottom = listRect.bottom - SELL_SPACE_LENGTH;
943 headerRects[CCommentView::INFO].bottom = listRect.bottom - SELL_SPACE_LENGTH;
945 if(chatData->viewData.selectFlag == TRUE){
947 selectData = chatData;
948 selectRect = listRect;
949 memcpy(selectHeaderRects,headerRects,sizeof(headerRects));
955 this->DrawItem(mdc,listRect,headerRects,*chatData);
959 listRect.top = listRect.bottom;
962 viewSellHeight = listRect.bottom;
966 if(selectFlag == TRUE){
967 this->DrawItem(mdc,selectRect,selectHeaderRects,*selectData);
970 //
\8d\80\96Ú
\82Ì
\8fc
\90ü
\82ð
\95`
\89æ
971 mdc.SelectPen(collLinePen);
972 mdc.MoveTo(colLineRects[CCommentView::NO].right,listRectTop);
973 mdc.LineTo(colLineRects[CCommentView::NO].right,listRect.bottom);
974 mdc.MoveTo(colLineRects[CCommentView::USERNAME].right,listRectTop);
975 mdc.LineTo(colLineRects[CCommentView::USERNAME].right,listRect.bottom);
976 mdc.MoveTo(colLineRects[CCommentView::COMMENT].right,listRectTop);
977 mdc.LineTo(colLineRects[CCommentView::COMMENT].right,listRect.bottom);
978 mdc.MoveTo(colLineRects[CCommentView::TIME].right,listRectTop);
979 mdc.LineTo(colLineRects[CCommentView::TIME].right,listRect.bottom);
980 mdc.MoveTo(colLineRects[CCommentView::INFO].right,listRectTop);
981 mdc.LineTo(colLineRects[CCommentView::INFO].right,listRect.bottom);
984 windowRect.left = listRect.right;
985 mdc.FillRect(&windowRect,(HBRUSH)::GetStockObject(GRAY_BRUSH));
999 LRESULT CCommentListWindow::OnSetCtrol(UINT uMsg,WPARAM wparam,LPARAM lparam){
1003 self.chatChildCtrlsList.ShowCntrls();
1010 VOID CCommentListWindow::OnSize(UINT wParam, _WTYPES_NS::CSize &windowSize){
1013 SCROLLINFO vScrollInfo = {0};
1014 vScrollInfo.fMask = SIF_ALL;
1017 self.GetScrollInfo(SB_VERT,&vScrollInfo);
1018 BOOL scrollFlag = (UINT)(vScrollInfo.nPage + vScrollInfo.nPos + 1) >= (UINT)vScrollInfo.nMax;
1019 vScrollInfo.nPage = CalcScrollPage(vScrollInfo.nMax);
1021 vScrollInfo.fMask = SIF_PAGE;
1022 self.SetScrollInfo(SB_VERT,&vScrollInfo);
1026 if(scrollFlag == TRUE){
1027 self.SendMessageW(WM_VSCROLL,MAKELONG(SB_BOTTOM,0),0);
1031 this->SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
1037 UINT_PTR CCommentListWindow::CalcScrollPage(UINT_PTR nMax){
1042 this->GetClientRect(&clientRect);
1044 SCROLLINFO vScrollInfo = {0};
1045 if(self.commentlist.empty() != TRUE){
1047 CCommentList::reverse_iterator rbegin = self.commentlist.rbegein();
1048 CCommentList::reverse_iterator rend = self.commentlist.rend();
1049 for(;rbegin != rend;++rbegin){
1050 CalcItemHeight(*rbegin);
1051 height += rbegin->viewData.height;
1053 if(height > clientRect.bottom)goto overclientrect;
1058 vScrollInfo.fMask = SIF_RANGE;
1059 self.GetScrollInfo(SB_VERT,&vScrollInfo);
1069 VOID CCommentListWindow::DrawItem(CDC &dc,const RECT &rc,const RECT *headerRect,CChatData &chatData){
1072 RECT noViewRect = headerRect[CCommentView::NO]; //
\83R
\83\81\94Ô
\95\
\8e¦
\97Ì
\88æ
1073 RECT userNameViewRect = headerRect[CCommentView::USERNAME]; //
\83\86\81[
\83U
\96¼
\95\
\8e¦
\97Ì
\88æ
1074 RECT chatViewRect = headerRect[CCommentView::COMMENT]; //
\83R
\83\81\83\93\83g
\95\
\8e¦
\97Ì
\88æ
1075 RECT timeViewRect = headerRect[CCommentView::TIME]; //
\8e\9e\8aÔ
\95\
\8e¦
\97Ì
\88æ
1076 RECT infoViewRect = headerRect[CCommentView::INFO]; //
\83R
\83\81\83\93\83g
\8fî
\95ñ
\95\
\8e¦
\97Ì
\88æ
1080 //
\83R
\83\81\83\93\83g
\8e\9e\8aÔ
\95\
\8e¦
\97p
\95¶
\8e\9a\97ñ
\8dì
\90¬
1082 time_t chatTime = (time_t)difftime(chatData.date,self.stream.GetStartTime());
1085 BOOL beforeStartFlag = chatTime < 0 ? TRUE : FALSE;
1086 TCHAR noString[sizeof(chatData.no) * 8];
1087 TCHAR dateString[LENGTH_16];
1088 if(chatData.no != 0)_stprintf(noString,TEXT("%u"),chatData.no);
1089 else _tcscpy(noString,TEXT(""));
1090 CNLiteString timeFormat;
1093 if(beforeStartFlag == TRUE){
1095 timeFormat = TEXT("-");
1096 chatTime = -chatTime;
1098 tm ct = *gmtime(&chatTime);
1099 if(ct.tm_hour != 0 ){
1101 timeFormat += TEXT("%H:%M:%S");
1105 timeFormat += TEXT("%M:%S");
1108 _tcsftime(dateString,ARRAY_LENGTH(dateString),timeFormat,&ct);
1111 COLORREF bkColor; //
\94w
\8ci
\90F
1112 CPen originSellLinePen; //
\98g
\90ü
\95`
\89æ
\97p
\83y
\83\93
1113 CBrush originBkBrush; //
\94w
\8ci
\95`
\89æ
\97p
\83u
\83\89\83V
1115 //
\91I
\91ð
\8fó
\91Ô
\82©
\83`
\83F
\83b
\83N
1116 if (chatData.viewData.selectFlag == TRUE)
1118 bkColor = self.viewproperty.selectBackColor;
1120 dc.SelectBrush(this->selectBkBrush);
1121 dc.SelectPen(this->selectSellLinePen);
1126 if(chatData.viewData.sellLineColor == CChatData::ViewData::INIT_COLOR){
1127 dc.SelectPen(this->normalSellLinePen);
1131 originSellLinePen.CreatePen(PS_SOLID,1,chatData.viewData.sellLineColor);
1132 dc.SelectPen(originSellLinePen);
1137 if(chatData.viewData.backColor != CChatData::ViewData::INIT_COLOR || chatData.listenerData->originBkFlag == TRUE){
1139 if(chatData.viewData.backColor != CChatData::ViewData::INIT_COLOR){
1140 bkColor = chatData.viewData.backColor;
1141 originBkBrush.CreateSolidBrush(chatData.viewData.backColor);
1143 }else if(chatData.listenerData->originBkFlag == TRUE){
1145 bkColor = chatData.listenerData->bkColor;
1146 originBkBrush.CreateSolidBrush(chatData.listenerData->bkColor);
1150 dc.SelectBrush(originBkBrush);
1153 bkColor = self.viewproperty.backColor;
1154 dc.SelectBrush(this->normalBkBrush);
1155 dc.SelectBrush(this->normalBkBrush);
1161 //
\94w
\8ci
\82Æ
\98g
\90ü
\82ð
\95`
\89æ
1164 dc.Rectangle(rc.left,rc.top - 1,rc.right ,rc.bottom + 1);
1165 dc.SetBkColor(bkColor);
1168 //
\95`
\89æ
\83T
\83C
\83Y
\82ð
\8cv
\8eZ
1174 dc.SelectFont(linkFont);
1175 dc.SetTextColor(self.viewproperty.linkStringColor);
1176 //
\83e
\83L
\83X
\83g
\95`
\89æ
1177 dc.DrawTextW(noString,_tcslen(noString),&noViewRect,DT_WORD_ELLIPSIS);
1178 dc.DrawTextW(chatData.listenerData->user_id,chatData.listenerData->user_id.Length(),&userNameViewRect,DT_WORD_ELLIPSIS);
1180 dc.SelectFont(::AtlGetDefaultGuiFont());
1181 dc.SetTextColor(chatData.viewData.stringColor == CChatData::ViewData::INIT_COLOR ? chatData.viewData.stringColor :self.viewproperty.baseStringColor);
1182 dc.DrawTextW(dateString,_tcslen(dateString),&timeViewRect,DT_WORD_ELLIPSIS);
1187 VOID CCommentListWindow::ResetViewSellHeight(){
1195 VOID CCommentListWindow::ShowCurSel(){
1197 auto end = self.commentlist.end();
1198 INT_PTR cursel = self.commentlist.GetCurSelNo();
1199 if(cursel == -1)goto end;
1201 SCROLLINFO vScrollInfo;
1202 vScrollInfo.cbSize = sizeof(vScrollInfo);
1203 vScrollInfo.fMask = SIF_ALL;
1204 self.GetScrollInfo(SB_VERT,&vScrollInfo);
1206 if(!(cursel >= vScrollInfo.nPos + static_cast<INT_PTR>(vScrollInfo.nPage) / 2 && cursel <= vScrollInfo.nPos + static_cast<INT_PTR>(vScrollInfo.nPage) / 2)){
1207 self.SetScrollPos(SB_VERT,cursel - (vScrollInfo.nPage / 2));
1208 self.commentlist.SetShortCut(self.GetScrollPos(SB_VERT));
1213 this->SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
1221 VOID CCommentListWindow::CalcItemHeight(CChatData &chatData){
1223 if(chatData.viewData.height == 0){
1224 // dumpln(TEXT("viewdataupdate"));
1226 self.m_header.GetItemRect(CCommentView::COMMENT,&drowSize);
1228 drowSize.bottom = 0;
1230 CChatReadEdit cedit;
1232 cedit.GeneralCreate(*this,ENM_REQUESTRESIZE,CALCEDIT_ID);
1233 cedit.SetWindowText(TEXT(""));
1234 cedit.SetWindowPos(NULL,0,0,drowSize.right - drowSize.left,drowSize.bottom - drowSize.top,SWP_NOZORDER | SWP_NOMOVE | SWP_NOREDRAW);
1235 cedit.SetWindowText(chatData.chatBuf);
1236 cedit.GetClientRect(&drowSize);
1237 cedit.DestroyWindow();
1238 if(drowSize.bottom - drowSize.top > 70)drowSize.bottom = drowSize.top + 70;
1239 chatData.viewData.height = drowSize.bottom - drowSize.top;
1247 LRESULT CCommentListWindow::OnCreate(LPCREATESTRUCT lpCreateStruct){
1252 CCommentList::iterator CCommentListWindow::CalcClickLine(INT_PTR height){
1254 INT_PTR heightSum = 0;
1256 CCommentList::iterator chatData = self.commentlist.GetShortCut();
1257 CCommentList::iterator end = self.commentlist.end();
1261 for(; chatData != end ;(++chatData)){
1262 CalcItemHeight(*chatData);
1263 heightSum += chatData->viewData.height;
1266 if(heightSum >= height)break;
1276 BOOL CCommentListWindow::IsOnNoOrUserName(UINT_PTR index,const POINT &point){
1280 self.m_header.GetItemRect(index,&rc);
1283 //dumpln(TEXT("index:%d"),index);
1284 //dumpln(TEXT("rc.left:%d"),rc.left);
1285 //dumpln(TEXT("rc.right:%d"),rc.right);
1286 //dumpln(TEXT("point.x:%d"),point.x);
1287 if((point.x >= rc.left && point.x <= rc.right) && (point.y < static_cast<INT_PTR>(viewSellHeight))){
1289 INT_PTR heightsum = 0;
1290 auto clickData = self.commentlist.GetShortCut();
1291 auto endData = self.commentlist.end();
1292 for(;clickData != endData;++clickData){
1294 heightsum += clickData->viewData.height;
1296 if(heightsum > point.y){
1298 CDC cdc = this->GetDC();
1300 rc.top = heightsum -= clickData->viewData.height;
1301 RECT calcRect = {0};
1302 //rc.bottom = rc.bottom;
1303 cdc.SelectFont(linkFont);
1304 //::GetTextExtentPoint32(cdc,clickData->chatBuf,clickData->chatBuf.Length(),&stringSize);
1306 if(index == CCommentView::USERNAME){
1307 LPCTSTR viewStr = clickData->listenerData->userName.Length() == 0 ? clickData->listenerData->user_id : clickData->listenerData->userName;
1308 cdc.DrawTextW(viewStr ,_tcslen(viewStr),&calcRect,DT_CALCRECT);
1310 } else if(index == CCommentView::NO){
1311 TCHAR viewStr[sizeof(UINT_PTR) * 8];
1312 _stprintf(viewStr,TEXT("%d"),clickData->no);
1313 cdc.DrawTextW(viewStr,_tcslen(viewStr),&calcRect,DT_CALCRECT);
1316 rc.bottom = rc.top + calcRect.bottom - calcRect.top;
1317 rc.right = rc.right > rc.left + calcRect.right - calcRect.left ? rc.left + calcRect.right - calcRect.left : rc.right;
1319 //dumpln(TEXT("stringSize.cy:%d"),stringSize.cy);
1320 //dumpln(TEXT("stringSize.cx:%d"),stringSize.cx);
1321 dumpln(TEXT("rc.left:%d"),rc.left);
1322 dumpln(TEXT("rc.right :%d"),rc.right);
1323 rslt = (point.y >= rc.top && point.y <= rc.bottom && point.x >= rc.left && point.x <= rc.right);
1337 VOID CCommentListWindow::OnLButtonDown(UINT wParam, _WTYPES_NS::CPoint &point){
1343 if(point.x > (INT_PTR)self.GetColumnHolSizeSum()) goto end;
1346 if(self.commentlist.empty() == TRUE)goto end;
1348 self.commentlist.SetCurSel(CalcClickLine(point.y));
1356 this->SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
1362 VOID CCommentListWindow::OnLButtonDblClk(UINT wParam, _WTYPES_NS::CPoint &point){
1366 if(!(point.x > (INT_PTR)self.GetColumnHolSizeSum() || self.commentlist.empty() == TRUE)){
1368 auto end = self.commentlist.end();
1369 auto lineIte = CalcClickLine(point.y);
1370 if( lineIte == end)goto endlabel;
1374 if(lineIte->listenerData->originBkFlag == FALSE){
1375 CListenerColorCollector colorCollector;
1376 listenerList.BkColorCollect(colorCollector);
1381 srand((unsigned int)time(NULL));
1387 bkColor = PALETTERGB(red,green,blue);
1389 }while(colorCollector.Find(bkColor));
1391 lineIte->listenerData->originBkFlag = TRUE;
1392 lineIte->listenerData->SetBkColor(bkColor);
1396 lineIte->listenerData->originBkFlag = FALSE;
1407 this->Invalidate(TRUE);
1409 this->SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
1413 LRESULT CCommentListWindow::OnEraseBkGnd(HDC lparam){
1418 VOID CCommentListWindow::OnKeyDown(TCHAR vKey,UINT loLParam,UINT hiLParam){
1441 auto cursel = self.commentlist.GetCurSel();
1442 if((dy < 0 && cursel == self.commentlist.begin()) || dy >= static_cast<INT_PTR>(self.commentlist.Size()))goto end;
1445 std::advance(cursel,dy);
1446 self.commentlist.SetCurSel(cursel);
1455 LRESULT CCommentListWindow::OnSetCursor(HWND wparam,UINT loLparam,UINT hiLparam){
1457 POINT mousePoint = {0};
1459 GetCursorPos(&mousePoint);
1460 ::ScreenToClient(*this,&mousePoint);
1462 if(static_cast<INT>(loLparam) == 1 &&( IsOnNoOrUserName(CCommentView::NO,mousePoint) || IsOnNoOrUserName(CCommentView::USERNAME,mousePoint))){
1464 ::SetCursor(::LoadCursorW(NULL,IDC_HAND));
1479 LRESULT CCommentListWindow::OnMouseWheel(UINT loWparam,SHORT hiWparam,CPoint &point){
1482 self.SendMessageW(WM_VSCROLL,MAKELONG(hiWparam < 0 ? SB_PAGEDOWN : SB_PAGEUP ,0),0);
1489 LRESULT CCommentListWindow::OnChatControlNortify(LPNMHDR lParam){
1493 switch(lParam->code){
1502 auto pmf = (MSGFILTER *)lParam;
1503 if (pmf->msg == WM_LBUTTONDOWN || pmf->msg== WM_LBUTTONDBLCLK || pmf->msg == WM_MOUSEWHEEL){
1506 ::GetWindowRect(pmf->nmhdr.hwndFrom,&windowrect);
1507 _WTYPES_NS::CPoint point(windowrect.left + LOWORD(pmf->lParam),windowrect.top + HIWORD(pmf->lParam));
1508 ::ScreenToClient(*this,&point);
1512 case WM_LBUTTONDOWN:
1513 OnLButtonDown(pmf->wParam,point);
1516 case WM_LBUTTONDBLCLK:
1517 OnLButtonDblClk(pmf->wParam,point);
1521 OnMouseWheel(LOWORD(pmf->wParam),HIWORD(pmf->wParam),point);
1548 LRESULT CCommentListWindow::OnCalcSellSize(LPNMHDR lParam){
1550 auto pReqResize = reinterpret_cast <REQRESIZE *>(lParam);
1551 ::SetWindowPos(pReqResize->nmhdr.hwndFrom,NULL,0,0,pReqResize->rc.right - pReqResize->rc.left,pReqResize->rc.bottom - pReqResize->rc.top,SWP_NOZORDER | SWP_NOMOVE | SWP_HIDEWINDOW);