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(){
78 HDWP hdwp = ::BeginDeferWindowPos(GetCtrlCount());
79 chatDispCtrl.DeferWindowPos(hdwp,chatDispCtrl.m_hWnd,0,0,0,0,SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_HIDEWINDOW);
80 ::EndDeferWindowPos(hdwp);
83 VOID CChatChildCtrls::SetCtrl(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);
123 // dumpln(TEXT("height:%d"),rc.bottom - rc.top);
124 HDWP hdwp = ::BeginDeferWindowPos(GetCtrlCount());
125 chatDispCtrl.DeferWindowPos(hdwp,NULL,chatRect.left,chatRect.top,chatRect.right - chatRect.left ,chatRect.bottom - chatRect.top, SWP_NOZORDER | SWP_SHOWWINDOW);
126 ::EndDeferWindowPos(hdwp);
130 UINT_PTR CChatChildCtrls::GetCtrlCount(){
138 ///
\83R
\83\93\83X
\83g
\83\89\83N
\83^
140 CChatChildCtrlsList::CChatChildCtrlsList(CCommentView &hMaster):m_hMaster(hMaster){
148 ///
\83R
\83\93\83g
\83\8d\81[
\83\8b\82ð
\95\
\8e¦
150 VOID CChatChildCtrlsList::ShowCntrls(){
153 dumpln(TEXT("showcntrls:start"));
157 m_hMaster.m_commentListWindow.GetClientRect(&listRect);
158 m_hMaster.m_header.GetItemRect(CCommentView::COMMENT,&headerRect);
160 headerRect.bottom = 0;
163 INT_PTR heightSum =0;
165 auto ctrlsBegin = m_list.begin();
166 auto ctrlsEnd = m_list.end();
168 if(m_hMaster.commentlist.Size() > 0){
170 auto chatDataBegin = m_hMaster.commentlist.GetShortCut();
173 for(; chatDataBegin != m_hMaster.commentlist.end() && heightSum < listRect.bottom;++ctrlsBegin,++chatDataBegin){
175 m_hMaster.m_commentListWindow.CalcItemHeight(*chatDataBegin);
176 tmpRect = headerRect;
177 tmpRect.top += heightSum;
178 tmpRect.bottom += heightSum + chatDataBegin->viewData.height;
180 if(ctrlsBegin == ctrlsEnd)ctrlsBegin = Extend();
182 ctrlsBegin->SetCtrl(tmpRect,*chatDataBegin,m_hMaster.viewproperty.commentFoldingFlag);
184 heightSum = tmpRect.bottom;
187 for(;ctrlsBegin != ctrlsEnd;++ctrlsBegin){
200 VOID CChatChildCtrlsList::AllHide(){
202 auto begin =m_list.begin();
203 auto end = m_list.end();
206 for(;begin != end;++begin){
213 ///
\8ag
\92£
\8f\88\97\9d
215 CChatChildCtrlsList::iterator CChatChildCtrlsList::Extend(){
218 CChatChildCtrls ctrls(m_hMaster);
220 m_list.push_back(ctrls);
221 m_list.back().Create();
222 auto ite = (--m_list.end());
229 //
\83R
\83\81\83\93\83g
\83r
\83\85\81[
\83N
\83\89\83X
\83\81\83\
\83b
\83h
230 ///////////////////////////////////////////////////////
232 CCommentView::CCommentView(CNicoLiveStream &stream):
233 m_commentListWindow(*this),
236 ,chatChildCtrlsList(*this)
242 lf.lfCharSet = SHIFTJIS_CHARSET;
245 hHeaderFontNew = CreateFontIndirect(&lf);
252 CCommentView::~CCommentView(){
255 DeleteObject(hHeaderFontNew);
263 VOID CCommentView::OnConnect(){
264 m_commentListWindow.SetRedraw(FALSE);
265 commentlist.OnConnect();
267 SCROLLINFO vScrollInfo = {0};
268 vScrollInfo.cbSize = sizeof(vScrollInfo);
269 vScrollInfo.fMask = SIF_ALL;
271 this->SetScrollInfo(SB_VERT,&vScrollInfo,FALSE);
273 m_commentListWindow.SetRedraw(TRUE);
274 m_commentListWindow.Invalidate();
277 chatChildCtrlsList.AllHide();
284 UINT_PTR CCommentView::GetColumnHolSizeSum(){
288 this->GetScrollRange(SB_HORZ,&nMin,&nMax);
293 VOID CCommentView::SetProperty(CommentViewProperty &setProperty){
295 viewproperty = setProperty;
299 CommentViewProperty &CCommentView::GetProperty(){
309 HWND CCommentView::Create(HWND hWndParent){
313 HWND rslt = __super::Create(hWndParent,0,commentViewConstant::NLITE_COMMENTVIEW,WS_VISIBLE | WS_CHILD | WS_VSCROLL | WS_HSCROLL | WS_BORDER,0,commentViewConstant::MENU_OR_ID);
316 HDC hdc = m_header.BeginPaint(&ps);
319 HFONT hOld = (HFONT)SelectObject(hdc,hHeaderFontNew);
321 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ñ")};
322 UINT_PTR holizenSize[] = {0,0,100,0,0};
324 for(UINT_PTR index = 0;index < ARRAY_LENGTH(columns) ;++index){
326 GetTextExtentPoint32(hdc , columns[index] , _tcslen(columns[index]) , &size);
327 UINT_PTR holsize = holizenSize[index] + size.cx + 15;
328 holizenSize[index] = viewproperty.headerholSize[index] >= 0 ? viewproperty.headerholSize[index] : holsize;
331 SelectObject(hdc,hOld);
333 m_header.EndPaint(&ps);
336 HEADERSINFO headersinfo = {columns,holizenSize,ARRAY_LENGTH(columns)};
338 AddHeader(&headersinfo);
340 m_header.SetOrderArray(ARRAY_LENGTH(viewproperty.headerOraderArray),viewproperty.headerOraderArray);
351 LRESULT CCommentView::OnHeaderEndTrack(LPNMHDR lParam){
354 if(lParam->hwndFrom == m_header.m_hWnd){
357 auto begin = commentlist.begin();
359 auto end = commentlist.end();
361 for(;begin != end;++begin){
363 begin->viewData.height = 0;
367 m_commentListWindow.SetRedraw(FALSE);
368 SCROLLINFO vScrollInfo = {0};
369 vScrollInfo.fMask = SIF_PAGE | SIF_POS | SIF_RANGE;
371 this->GetScrollInfo(SB_VERT,&vScrollInfo);
372 vScrollInfo.nPage = m_commentListWindow.CalcScrollPage(vScrollInfo.nMax);
373 vScrollInfo.fMask = SIF_PAGE;
374 this->SetScrollInfo(SB_VERT,&vScrollInfo);
376 BOOL scrollFlag = vScrollInfo.nPos + (int)vScrollInfo.nPage + 1>= vScrollInfo.nMax;
377 UINT_PTR commentCount = commentlist.Size();
378 LPNMHEADER lpNmHdr = (LPNMHEADER )lParam;
380 m_header.SetItem(lpNmHdr->iItem,lpNmHdr->pitem);
388 if(scrollFlag == TRUE){
390 this->SendMessageW(WM_VSCROLL,MAKELONG(SB_BOTTOM,0),0);
393 INT_PTR itemCount = m_header.GetItemCount();
397 for(INT_PTR itemIndex = 0;itemIndex < itemCount;itemIndex++){
398 m_header.GetItemRect(itemIndex,&itemSizeRect);
399 nMax += itemSizeRect.right - itemSizeRect.left;
403 this->SetScrollRange(SB_HORZ,nMin,nMax,TRUE);
409 m_commentListWindow.SetRedraw(TRUE);
410 if(TryEnterCriticalSection(&m_commentListWindow.m_sec) == TRUE){
411 m_commentListWindow.Invalidate();
412 m_commentListWindow.Unlock();
420 VOID CCommentView::OnChatReceve(NicoLiveChat_P chat,UINT_PTR commnetCountSum){
423 commentlist.OnChatReceve(chat,commnetCountSum,this->m_commentListWindow);
429 VOID CCommentView::OnChatReceveSettle(UINT_PTR chatNo,UINT_PTR commentCountSum){
432 SCROLLINFO vScrollInfo = {0};
435 vScrollInfo.fMask = SIF_ALL;
437 this->GetScrollInfo(SB_VERT,&vScrollInfo);
438 BOOL scrollFlag = vScrollInfo.nPos + (int)vScrollInfo.nPage >= vScrollInfo.nMax;
440 vScrollInfo.cbSize = sizeof(vScrollInfo);
441 vScrollInfo.nMax = commentCountSum;
442 vScrollInfo.fMask = SIF_RANGE | SIF_PAGE;
443 vScrollInfo.nPage = m_commentListWindow.CalcScrollPage(vScrollInfo.nMax);
446 this->SetScrollInfo(SB_VERT,&vScrollInfo,FALSE);
451 if(scrollFlag == TRUE){
452 this->SendMessageW(WM_VSCROLL,MAKEWORD(SB_BOTTOM,0),0);
456 if(vScrollInfo.nPos + static_cast<INT_PTR>(vScrollInfo.nPage) >= vScrollInfo.nMax - static_cast<INT_PTR>(vScrollInfo.nPage)&& TryEnterCriticalSection(&m_commentListWindow.m_sec) == TRUE){
457 m_commentListWindow.Invalidate();
459 //chatChildCtrlsList.ShowCntrls();
461 m_commentListWindow.Unlock();
467 static UCHAR getrgb(){
469 UCHAR rgb = 192 + rand() % 64;
483 LRESULT CCommentView::OnSize(UINT wParam,SIZE lParam){
490 VOID CCommentView::ChangeSize(const SIZE& client){
492 SCROLLINFO hScrollInfo = {0};
493 hScrollInfo.cbSize = sizeof(hScrollInfo);
494 hScrollInfo.fMask = SIF_PAGE;
495 hScrollInfo.nPage = client.cx;
497 this->SetScrollInfo(SB_HORZ,&hScrollInfo);
498 hScrollInfo.fMask = SIF_ALL;
499 this->GetScrollInfo(SB_HORZ,&hScrollInfo);
502 HDWP hDwp = BeginDeferWindowPos(2);
505 INT_PTR movePos = -1 * hScrollInfo.nPos;
507 m_header.DeferWindowPos(hDwp,m_header.m_hWnd,movePos,0,0,0,SWP_NOSIZE | SWP_NOZORDER);
508 m_commentListWindow.DeferWindowPos(hDwp,m_commentListWindow.m_hWnd,movePos,commentViewConstant::HEADER_HAIGHT,::GetSystemMetrics(SM_CXFULLSCREEN),client.cy - commentViewConstant::HEADER_HAIGHT,SWP_NOZORDER);
510 EndDeferWindowPos(hDwp);
515 m_header.GetWindowRect(&headerRectSize);
516 bkRect.left = headerRectSize.right - headerRectSize.left - hScrollInfo.nPos;
518 bkRect.right = client.cx ;
519 bkRect.bottom = client.cy;
526 LRESULT CCommentView::OnEraseBkgnd(HDC wParam){
532 VOID CCommentView::OnDestroy(){
533 m_header.GetOrderArray(ARRAY_LENGTH(viewproperty.headerOraderArray),viewproperty.headerOraderArray);
534 INT_PTR headerItemcount = m_header.GetItemCount();
536 for(INT_PTR itemindex = 0;itemindex < headerItemcount;itemindex++){
538 m_header.GetItemRect(itemindex,&headerItemRect);
539 viewproperty.headerholSize[itemindex] = headerItemRect.right - headerItemRect.left;
541 commentlist.OnDestroy();
542 m_header.DestroyWindow();
543 m_commentListWindow.DestroyWindow();
548 LRESULT CCommentView::OnHeaderEndDrag(LPNMHDR lParam){
550 if(lParam->hwndFrom == m_header.m_hWnd){
551 if(TryEnterCriticalSection(&m_commentListWindow.m_sec) == TRUE){
553 m_commentListWindow.Invalidate();
554 m_commentListWindow.Unlock();
563 VOID CCommentView::OnHScroll(INT_PTR loWParam,SHORT hiWParam,HWND lParam){
567 SCROLLINFO hScrollInfo = {0};
568 hScrollInfo.cbSize = sizeof(hScrollInfo);
569 hScrollInfo.fMask = SIF_ALL;
570 this->GetScrollInfo(SB_HORZ,&hScrollInfo);
573 case SB_THUMBPOSITION:
575 dy = hiWParam - hScrollInfo.nPos;
581 dy = -1 * hScrollInfo.nPage;
588 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;
598 dy = max(-1 * hScrollInfo.nPos, min(dy, hScrollInfo.nMax - hScrollInfo.nPos));
602 hScrollInfo.nPos += dy;
603 INT_PTR moveRange = -(hScrollInfo.nPos);
605 HDWP hDwp = BeginDeferWindowPos(2);
607 m_header.DeferWindowPos(hDwp,m_header.m_hWnd,moveRange,0,0,0,SWP_NOSIZE | SWP_NOZORDER);
608 m_commentListWindow.DeferWindowPos(hDwp,m_commentListWindow.m_hWnd,moveRange,commentViewConstant::HEADER_HAIGHT,0,0,SWP_NOSIZE | SWP_NOZORDER);
610 EndDeferWindowPos(hDwp);
613 this->SetScrollInfo(SB_HORZ,&hScrollInfo);
620 VOID CCommentView::OnVScroll(INT_PTR loWParam,SHORT hiWParam,HWND lParam){
623 SCROLLINFO vScrollInfo = {0};
624 vScrollInfo.fMask = SIF_ALL;
627 this->GetScrollInfo(SB_VERT,&vScrollInfo);
632 case SB_THUMBPOSITION:
635 dy = hiWParam - vScrollInfo.nPos;
652 dy = -1 * vScrollInfo.nPage;
658 dy = vScrollInfo.nPage;
665 dy = -vScrollInfo.nPos;
671 dy = vScrollInfo.nMax;
688 vScrollInfo.nPos += dy;
689 // viewStartHeight = vScrollInfo.nPos;
690 this->SetScrollPos(SB_VERT,vScrollInfo.nPos);
691 this->commentlist.SetShortCut(this->GetScrollPos(SB_VERT));
692 //this->SetScrollInfo(SB_VERT,&vScrollInfo);
693 this->UpdateWindow();
694 if(TryEnterCriticalSection(&m_commentListWindow.m_sec) == TRUE){
695 m_commentListWindow.Invalidate();
696 m_commentListWindow.Unlock();
705 LRESULT CCommentView::OnCreate(LPCREATESTRUCT lpcs){
706 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);
707 m_commentListWindow.Create(m_hWnd,0,commentViewConstant::NLITE_COMMENTLISTWINDOW,WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN , 0,commentViewConstant::LISTWINDOW);
714 VOID CCommentView::AddHeader(LPHEADERSINFO infos){
717 m_header.SetFont(hHeaderFontNew);
720 item.mask = HDI_FORMAT | HDI_TEXT | HDI_WIDTH;
721 item.fmt = HDF_CENTER | HDF_STRING;
724 for(UINT_PTR index = 0;index < infos->count ;++index){
726 item.pszText = infos->columns[index];
728 item.cxy = infos->holizensize[index];
729 m_header.AddItem(&item);
734 UINT_PTR itemCount = m_header.GetItemCount();
735 for(UINT_PTR u_index = 0;u_index < itemCount;++u_index){
737 m_header.GetItemRect(u_index,&itemRect);
738 nMax += itemRect.right - itemRect.left;
742 this->SetScrollRange(SB_HORZ,0,nMax,TRUE);
748 VOID CCommentView::DecisionHorzSize(){
750 HDWP hWindowPosInfo = BeginDeferWindowPos(2);
752 this->GetClientRect(&bkWindowRect);
753 m_header.DeferWindowPos(hWindowPosInfo,m_header.m_hWnd,0,0,::GetSystemMetrics(SM_CXFULLSCREEN),commentViewConstant::HEADER_HAIGHT,SWP_NOZORDER | SWP_NOMOVE);
754 m_commentListWindow.DeferWindowPos(hWindowPosInfo,m_header.m_hWnd,0,0,::GetSystemMetrics(SM_CXFULLSCREEN),bkWindowRect.bottom - commentViewConstant::HEADER_HAIGHT,SWP_NOZORDER | SWP_NOMOVE);
756 EndDeferWindowPos(hWindowPosInfo);
765 //
\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
766 ////////////////////////////////////////////////////////////////////
768 CCommentListWindow::CCommentListWindow(CCommentView &in_self):
772 CCommentListWindow::~CCommentListWindow(){
776 VOID CCommentListWindow::OnPaint(HDC in_hdc){
784 self.GetClientRect(&clientRect);
785 clientRect.bottom -= commentViewConstant::HEADER_HAIGHT;
787 this->GetWindowRect(&windowRect);
788 windowRect.right -= windowRect.left;
789 windowRect.bottom -= windowRect.top;
797 CMemoryDC mdc(pdc,windowRect);
798 mdc.SelectFont(AtlGetDefaultGuiFont());
801 CCommentList &commentList = self.commentlist;
803 BOOL selectFlag = FALSE;
804 CCommentList::iterator selectData;
805 RECT selectRect = {0};
809 if(commentList.Size() > 0){
811 listRect = windowRect;
812 listRect.right = self.GetColumnHolSizeSum();
814 CCommentList::iterator chatData = commentList.GetShortCut();
820 baseBkBrush.CreateSolidBrush(self.viewproperty.backColor);
821 mdc.FillRect(&listRect,baseBkBrush);
822 baseBkBrush.DeleteObject();
823 CCommentList::iterator endData = commentList.end();
827 for(;chatData != endData && listRect.top < clientRect.bottom;++chatData){
828 CalcItemHeight(*chatData);
830 // dumpln(TEXT("height:%d"),chatData->viewData.height);
831 listRect.bottom += chatData->viewData.height;
833 if(chatData->viewData.selectFlag == TRUE){
835 selectData = chatData;
836 selectRect = listRect;
839 this->DrawItem(mdc,listRect,*chatData);
843 listRect.top = listRect.bottom;
849 if(selectFlag == TRUE){
850 this->DrawItem(mdc,selectRect,*selectData);
854 windowRect.left = listRect.right;
855 mdc.FillRect(&windowRect,(HBRUSH)::GetStockObject(GRAY_BRUSH));
869 LRESULT CCommentListWindow::OnSetCtrol(UINT uMsg,WPARAM wparam,LPARAM lparam){
873 self.chatChildCtrlsList.ShowCntrls();
875 dumpln(TEXT("setctrl"));
880 VOID CCommentListWindow::OnSize(UINT wParam, _WTYPES_NS::CSize &windowSize){
883 SCROLLINFO vScrollInfo = {0};
884 vScrollInfo.fMask = SIF_ALL;
887 self.GetScrollInfo(SB_VERT,&vScrollInfo);
888 BOOL scrollFlag = (UINT)(vScrollInfo.nPage + vScrollInfo.nPos + 1) >= (UINT)vScrollInfo.nMax;
889 vScrollInfo.nPage = CalcScrollPage(vScrollInfo.nMax);
891 vScrollInfo.fMask = SIF_PAGE;
892 self.SetScrollInfo(SB_VERT,&vScrollInfo);
896 if(scrollFlag == TRUE){
897 self.SendMessageW(WM_VSCROLL,MAKELONG(SB_BOTTOM,0),0);
906 UINT_PTR CCommentListWindow::CalcScrollPage(UINT_PTR nMax){
911 this->GetClientRect(&clientRect);
913 SCROLLINFO vScrollInfo = {0};
914 if(self.commentlist.empty() != TRUE){
916 CCommentList::reverse_iterator rbegin = self.commentlist.rbegein();
917 CCommentList::reverse_iterator rend = self.commentlist.rend();
918 for(;rbegin != rend;++rbegin){
919 CalcItemHeight(*rbegin);
920 height += rbegin->viewData.height;
922 if(height > clientRect.bottom)goto overclientrect;
927 vScrollInfo.fMask = SIF_RANGE;
928 self.GetScrollInfo(SB_VERT,&vScrollInfo);
938 VOID CCommentListWindow::DrawItem(CDC &dc,const RECT &rc,CChatData &chatData){
941 RECT noViewRect; //
\83R
\83\81\94Ô
\95\
\8e¦
\97Ì
\88æ
942 RECT userNameViewRect; //
\83\86\81[
\83U
\96¼
\95\
\8e¦
\97Ì
\88æ
943 RECT timeViewRect; //
\8e\9e\8aÔ
\95\
\8e¦
\97Ì
\88æ
944 RECT chatViewRect; //
\83R
\83\81\83\93\83g
\95\
\8e¦
\97Ì
\88æ
945 RECT infoViewRect; //
\83R
\83\81\83\93\83g
\8fî
\95ñ
\95\
\8e¦
\97Ì
\88æ
949 //
\83R
\83\81\83\93\83g
\8e\9e\8aÔ
\95\
\8e¦
\97p
\95¶
\8e\9a\97ñ
\8dì
\90¬
951 time_t chatTime = (time_t)difftime(chatData.date,self.stream.GetStartTime());
954 BOOL beforeStartFlag = chatTime < 0 ? TRUE : FALSE;
955 TCHAR noString[sizeof(chatData.no) * 8];
956 TCHAR dateString[LENGTH_16];
957 if(chatData.no != 0)_stprintf(noString,TEXT("%u"),chatData.no);
958 else _tcscpy(noString,TEXT(""));
959 CNLiteString timeFormat;
962 if(beforeStartFlag == TRUE){
964 timeFormat = TEXT("-");
965 chatTime = -chatTime;
967 tm ct = *gmtime(&chatTime);
968 if(ct.tm_hour != 0 ){
970 timeFormat += TEXT("%H:%M:%S");
974 timeFormat += TEXT("%M:%S");
977 _tcsftime(dateString,ARRAY_LENGTH(dateString),timeFormat,&ct);
980 COLORREF bkColor; //
\94w
\8ci
\90F
981 COLORREF sellLineColor; //
\98g
\90ü
\90F
982 CPen sellLinePen; //
\98g
\90ü
\95`
\89æ
\97p
\83y
\83\93
983 CPen collLinePen; //
\8d\80\96Ú
\8fc
\90ü
\95`
\89æ
\97p
\83y
\83\93
984 CBrush bkBrush; //
\94w
\8ci
\95`
\89æ
\97p
\83u
\83\89\83V
985 collLinePen.CreatePen(PS_SOLID,1,self.viewproperty.colLineColor);
988 //
\91I
\91ð
\8fó
\91Ô
\82©
\83`
\83F
\83b
\83N
989 if (chatData.viewData.selectFlag == TRUE)
991 bkColor = self.viewproperty.selectBackColor;
992 sellLineColor = self.viewproperty.selectSellLineColor;
997 sellLineColor = chatData.viewData.sellLineColor == CChatData::ViewData::INIT_COLOR ? self.viewproperty.normalSellLineColor : chatData.viewData.sellLineColor;
999 if(chatData.viewData.backColor != CChatData::ViewData::INIT_COLOR){
1001 bkColor = chatData.viewData.backColor;
1003 }else if(chatData.listenerData->originBkFlag == TRUE){
1005 bkColor = chatData.listenerData->bkColor;
1010 bkColor = self.viewproperty.backColor;
1017 //
\94w
\8ci
\82Æ
\98g
\90ü
\82ð
\95`
\89æ
1018 sellLinePen.CreatePen(PS_SOLID,1,sellLineColor);
1019 bkBrush.CreateSolidBrush(bkColor);
1020 dc.SelectPen(sellLinePen);
1021 dc.SelectBrush(bkBrush);
1022 dc.Rectangle(rc.left,rc.top - 1,rc.right ,rc.bottom + 1);
1023 dc.SetBkColor(bkColor);
1024 dc.SetTextColor(chatData.viewData.stringColor == CChatData::ViewData::INIT_COLOR ? chatData.viewData.stringColor :self.viewproperty.baseStringColor);
1026 //
\95`
\89æ
\83T
\83C
\83Y
\82ð
\8cv
\8eZ
1028 self.m_header.GetItemRect(CCommentView::NO,&noViewRect);
1029 self.m_header.GetItemRect(CCommentView::USERNAME,&userNameViewRect);
1030 self.m_header.GetItemRect(CCommentView::COMMENT,&chatViewRect);
1031 self.m_header.GetItemRect(CCommentView::TIME,&timeViewRect);
1032 self.m_header.GetItemRect(CCommentView::INFO,&infoViewRect);
1034 noViewRect.left += SELL_SPACE_LENGTH;
1035 userNameViewRect.left += SELL_SPACE_LENGTH;
1036 timeViewRect.left += SELL_SPACE_LENGTH;
1037 chatViewRect.left += SELL_SPACE_LENGTH;
1038 infoViewRect.left += SELL_SPACE_LENGTH;
1040 noViewRect.right -= SELL_SPACE_LENGTH;
1041 userNameViewRect.right -= SELL_SPACE_LENGTH;
1042 timeViewRect.right -= SELL_SPACE_LENGTH;
1043 chatViewRect.right -= SELL_SPACE_LENGTH;
1044 infoViewRect.right -= SELL_SPACE_LENGTH;
1046 noViewRect.top = rc.top + SELL_SPACE_LENGTH;
1047 userNameViewRect.top = rc.top + SELL_SPACE_LENGTH;
1048 timeViewRect.top = rc.top + SELL_SPACE_LENGTH;
1049 chatViewRect.top = rc.top + SELL_SPACE_LENGTH;
1050 infoViewRect.top = rc.top + SELL_SPACE_LENGTH;
1052 noViewRect.bottom = rc.bottom - SELL_SPACE_LENGTH;
1053 userNameViewRect.bottom = rc.bottom - SELL_SPACE_LENGTH;
1054 timeViewRect.bottom = rc.bottom - SELL_SPACE_LENGTH;
1055 chatViewRect.bottom = rc.bottom - SELL_SPACE_LENGTH;
1056 infoViewRect.bottom = rc.bottom - SELL_SPACE_LENGTH;
1058 //
\8d\80\96Ú
\82Ì
\8fc
\90ü
\82ð
\95`
\89æ
1059 dc.SelectPen(collLinePen);
1060 dc.MoveTo(noViewRect.right,rc.top);
1061 dc.LineTo(noViewRect.right,rc.bottom);
1062 dc.MoveTo(userNameViewRect.right,rc.top);
1063 dc.LineTo(userNameViewRect.right,rc.bottom);
1064 dc.MoveTo(chatViewRect.right,rc.top);
1065 dc.LineTo(chatViewRect.right,rc.bottom);
1066 dc.MoveTo(timeViewRect.right,rc.top);
1067 dc.LineTo(timeViewRect.right,rc.bottom);
1070 //
\83e
\83L
\83X
\83g
\95`
\89æ
1071 dc.DrawTextW(noString,_tcslen(noString),&noViewRect,DT_WORD_ELLIPSIS);
1072 dc.DrawTextW(chatData.listenerData->user_id,chatData.listenerData->user_id.Length(),&userNameViewRect,DT_WORD_ELLIPSIS);
1073 dc.DrawTextW(chatData.chatBuf,chatData.chatBuf.Length(),&chatViewRect,DT_WORDBREAK | DT_EDITCONTROL);
1074 dc.DrawTextW(dateString,_tcslen(dateString),&timeViewRect,DT_WORD_ELLIPSIS);
1081 VOID CCommentListWindow::ShowCurSel(){
1083 auto end = self.commentlist.end();
1084 INT_PTR cursel = self.commentlist.GetCurSelNo();
1085 if(cursel == -1)goto end;
1087 SCROLLINFO vScrollInfo;
1088 vScrollInfo.cbSize = sizeof(vScrollInfo);
1089 vScrollInfo.fMask = SIF_ALL;
1090 self.GetScrollInfo(SB_VERT,&vScrollInfo);
1092 if(!(cursel >= vScrollInfo.nPos + static_cast<INT_PTR>(vScrollInfo.nPage) / 2 && cursel <= vScrollInfo.nPos + static_cast<INT_PTR>(vScrollInfo.nPage) / 2)){
1093 self.SetScrollPos(SB_VERT,cursel - (vScrollInfo.nPage / 2));
1104 VOID CCommentListWindow::CalcItemHeight(CChatData &chatData){
1106 if(chatData.viewData.height == 0){
1107 // dumpln(TEXT("viewdataupdate"));
1109 self.m_header.GetItemRect(CCommentView::COMMENT,&drowSize);
1111 drowSize.bottom = 0;
1113 CChatReadEdit cedit;
1115 cedit.GeneralCreate(*this,ENM_REQUESTRESIZE,CALCEDIT_ID);
1116 cedit.SetWindowText(TEXT(""));
1117 cedit.SetWindowPos(NULL,0,0,drowSize.right - drowSize.left,drowSize.bottom - drowSize.top,SWP_NOZORDER | SWP_NOMOVE | SWP_NOREDRAW);
1118 cedit.SetWindowText(chatData.chatBuf);
1119 cedit.GetClientRect(&drowSize);
1120 cedit.DestroyWindow();
1121 if(drowSize.bottom - drowSize.top > 70)drowSize.bottom = drowSize.top + 70;
1122 chatData.viewData.height = drowSize.bottom - drowSize.top;
1130 LRESULT CCommentListWindow::OnCreate(LPCREATESTRUCT lpCreateStruct){
1135 CCommentList::iterator CCommentListWindow::CalcClickLine(INT_PTR height){
1137 INT_PTR heightSum = 0;
1139 CCommentList::iterator chatData = self.commentlist.GetShortCut();
1140 CCommentList::iterator end = self.commentlist.end();
1141 dumpln(TEXT("height:%d"),height);
1143 for(; chatData != end ;(++chatData)){
1144 CalcItemHeight(*chatData);
1145 heightSum += chatData->viewData.height;
1146 dumpln(TEXT("height:%d"),heightSum);
1148 if(heightSum >= height)break;
1159 VOID CCommentListWindow::OnLButtonDown(UINT wParam, _WTYPES_NS::CPoint &point){
1165 if(point.x > (INT_PTR)self.GetColumnHolSizeSum()) goto end;
1168 if(self.commentlist.empty() == TRUE)goto end;
1170 self.commentlist.SetCurSel(CalcClickLine(point.y));
1171 if(TryEnterCriticalSection(&this->m_sec) == TRUE){
1180 this->SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
1186 VOID CCommentListWindow::OnLButtonDblClk(UINT wParam, _WTYPES_NS::CPoint &point){
1190 if(point.x > (INT_PTR)self.GetColumnHolSizeSum()) return;
1191 auto end = self.commentlist.end();
1192 auto lineIte = CalcClickLine(point.y);
1193 if( lineIte == end)return;
1197 if(lineIte->listenerData->originBkFlag == FALSE){
1198 CListenerColorCollector colorCollector;
1199 listenerList.BkColorCollect(colorCollector);
1204 srand((unsigned int)time(NULL));
1210 bkColor = PALETTERGB(red,green,blue);
1212 }while(colorCollector.Find(bkColor));
1214 lineIte->listenerData->originBkFlag = TRUE;
1215 lineIte->listenerData->SetBkColor(bkColor);
1219 lineIte->listenerData->originBkFlag = FALSE;
1227 if(TryEnterCriticalSection(&this->m_sec) == TRUE){
1228 this->Invalidate(TRUE);
1234 this->SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
1238 LRESULT CCommentListWindow::OnEraseBkGnd(HDC lparam){
1243 VOID CCommentListWindow::OnKeyDown(TCHAR vKey,UINT loLParam,UINT hiLParam){
1266 auto cursel = self.commentlist.GetCurSel();
1267 if(dy < 0 || dy >= static_cast<INT_PTR>(self.commentlist.Size()))goto end;
1270 std::advance(cursel,dy);
1271 self.commentlist.SetCurSel(cursel);
1280 LRESULT CCommentListWindow::OnMouseWheel(UINT loWparam,SHORT hiWparam,CPoint &point){
1283 self.SendMessageW(WM_VSCROLL,MAKELONG(hiWparam < 0 ? SB_PAGEDOWN : SB_PAGEUP ,0),0);
1290 LRESULT CCommentListWindow::OnChatControlNortify(LPNMHDR lParam){
1294 switch(lParam->code){
1302 case EN_REQUESTRESIZE:
1304 REQRESIZE *pReqResize = (REQRESIZE *) lParam;
1305 self.chatChildCtrlsList.rcBuf = pReqResize->rc;
1306 dumpln(TEXT("calcheight:%d"),pReqResize->rc.bottom - pReqResize->rc.top);
1327 LRESULT CCommentListWindow::OnCalcSellSize(LPNMHDR lParam){
1329 auto pReqResize = reinterpret_cast <REQRESIZE *>(lParam);
1330 ::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);
1331 //calcRc = pReqResize->rc;