2 #include "nlite_include.h"
3 using namespace std::tr1;
7 static const LPCTSTR LIVEURL_PART = TEXT("http://live.nicovideo.jp/watch/");
8 static const LPCTSTR ADDMYLIST_PART = TEXT("http://www.nicovideo.jp/mylist_add/video/");
10 static const UINT_PTR SELL_SPACE_LENGTH = 1;
12 //
\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
13 ///////////////////////////////////////////////////////////////////
15 CChatReadEdit::CChatReadEdit(CCommentView &m_master):m_master(m_master){
20 BOOL CChatReadEdit::SetWindowText(const CChatData &chat){
25 tstring viewString(regex_replace(tstring(chat.chatBuf),nliteregex::TAGSTRING,nliteregex::NUTHINGSTRING));
26 rslt = __super::SetWindowText(viewString.c_str());
28 CHARFORMAT2 defaultFormat;
29 this->GetDefaultCharFormat(defaultFormat);
30 defaultFormat.dwMask |= CFM_COLOR;
31 if(chat.premium == 2 || chat.premium == 3){
33 defaultFormat.crTextColor = m_master.viewproperty.ownerStringColor;
38 defaultFormat.crTextColor = m_master.viewproperty.baseStringColor;
42 BOOL rslt = this->SetDefaultCharFormat(defaultFormat);
46 linkStringBeside(viewString,nliteregex::LILNKREGEX);
50 } catch(std::exception &e){
60 VOID CChatReadEdit::linkStringBeside(const tstring &target,const nliteregex::tregex &re){
62 match_results<tstring::const_iterator> regexRslt;
63 tstring::const_iterator beginStr = target.begin();
64 tstring::const_iterator endstr = target.end();
66 cf.cbSize = sizeof(cf);
68 cf.dwEffects = CFE_LINK;
69 INT_PTR basePosition = 0;
70 while(regex_search(beginStr,endstr,regexRslt,re)){
71 basePosition += regexRslt.position(0);
72 this->SetSel(basePosition,basePosition + regexRslt.length());
73 this->SetCharFormat(cf,SCF_SELECTION);
74 basePosition += regexRslt.length();
76 beginStr = regexRslt[0].second;
81 VOID CChatReadEdit::Reset(){
83 __super::SetWindowText(TEXT(""));
88 HWND CChatReadEdit::GeneralCreate(HWND hParent,DWORD eventMask,UINT id){
91 this->Create(hParent,0,RICHEDIT_CLASS,WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | ES_AUTOVSCROLL | ES_MULTILINE | ES_READONLY,0,id);
93 DWORD dwLangOptons = this->SendMessage(EM_GETLANGOPTIONS,0,0);
94 dwLangOptons &= ~IMF_DUALFONT;
95 this->SendMessage(EM_SETLANGOPTIONS,0,(LPARAM)dwLangOptons);
98 CFont defFont = ::AtlGetDefaultGuiFont();
100 defFont.GetLogFont(&deflogFont);
101 CHARFORMAT2 m_defCharFormat;
102 this->GetDefaultCharFormat(m_defCharFormat);
103 CDC cDC = this->GetDC();
104 int picy = cDC.GetDeviceCaps(LOGPIXELSY);
105 this->ReleaseDC(cDC.m_hDC);
106 int point = -MulDiv(deflogFont.lfHeight,72,picy);
107 int twips = point * 20;
108 m_defCharFormat.yHeight = twips;
109 m_defCharFormat.dwEffects ^= CFE_AUTOCOLOR;
110 _tcscpy(m_defCharFormat.szFaceName,deflogFont.lfFaceName);
111 this->SetEventMask(eventMask);
113 this->SetDefaultCharFormat(m_defCharFormat);
120 CChatChildCtrls::CChatChildCtrls(CCommentView &hMaster):
122 chatDispCtrl(hMaster)
130 VOID CChatChildCtrls::Create(){
132 this->chatDispCtrl.GeneralCreate(m_master.m_commentListWindow,ENM_LINK | ENM_MOUSEEVENTS,CHAT_DISPCTRL_ID);
136 VOID CChatChildCtrls::AdjustRect(RECT &rc){
138 rc.left += SELL_SPACE_LENGTH;
139 rc.top += SELL_SPACE_LENGTH;
140 rc.right -= SELL_SPACE_LENGTH;
141 rc.bottom -= SELL_SPACE_LENGTH;
146 VOID CChatChildCtrls::Hide(HDWP hdwp){
148 chatDispCtrl.DeferWindowPos(hdwp,chatDispCtrl,0,0,0,0,SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_HIDEWINDOW);
152 VOID CChatChildCtrls::SetCtrl(HDWP hdwp,const RECT &rc,CCommentList::reference comment,BOOL mulutiLineFlag){
155 chatDispCtrl.SetWindowText(comment);
159 AdjustRect(chatRect);
163 if (comment.viewData.selectFlag == TRUE)
165 bkColor = m_master.viewproperty.selectBackColor;
172 if(comment.viewData.backColor != CChatData::ViewData::INIT_COLOR){
174 bkColor = comment.viewData.backColor;
176 }else if(comment.listenerData->originBkFlag == TRUE){
178 bkColor = comment.listenerData->bkColor;
183 bkColor = m_master.viewproperty.backColor;
191 chatDispCtrl.SetBackgroundColor(bkColor);
193 chatDispCtrl.DeferWindowPos(hdwp,NULL,chatRect.left,chatRect.top,chatRect.right - chatRect.left ,chatRect.bottom - chatRect.top, SWP_NOZORDER | SWP_SHOWWINDOW);
198 UINT_PTR CChatChildCtrls::GetCtrlCount(){
206 ///
\83R
\83\93\83X
\83g
\83\89\83N
\83^
208 CChatChildCtrlsList::CChatChildCtrlsList(CCommentView &hMaster):m_hMaster(hMaster){
216 ///
\83R
\83\93\83g
\83\8d\81[
\83\8b\82ð
\95\
\8e¦
218 VOID CChatChildCtrlsList::ShowCntrls(){
225 if(m_hMaster.commentlist.Size() > 0){
232 m_hMaster.m_commentListWindow.GetClientRect(&listRect);
233 m_hMaster.m_header.GetItemRect(CCommentView::COMMENT,&headerRect);
235 headerRect.bottom = 0;
237 UINT_PTR counter = 0;
238 INT_PTR heightSum =0;
240 auto ctrlsBegin = m_list.begin();
241 auto ctrlsEnd = m_list.end();
242 auto chatDataBegin = m_hMaster.commentlist.GetShortCut();
243 auto chatDataEnd = m_hMaster.commentlist.end();
244 auto chatDataTmp = chatDataBegin;
245 for(;chatDataBegin != chatDataEnd && heightSum < listRect.bottom;++chatDataBegin){
246 m_hMaster.m_commentListWindow.CalcItemHeight(*chatDataBegin);
248 heightSum += chatDataBegin->viewData.height;
253 chatDataBegin = chatDataTmp;
255 HDWP hdwp = ::BeginDeferWindowPos(CChatChildCtrls::GetCtrlCount() * (counter > m_list.size() ? counter : m_list.size()));
256 for(; chatDataBegin != chatDataEnd && counter > 0 ;++ctrlsBegin,++chatDataBegin,--counter){
259 tmpRect = headerRect;
260 tmpRect.top += heightSum;
261 tmpRect.bottom += heightSum + chatDataBegin->viewData.height;
263 if(ctrlsBegin == ctrlsEnd)ctrlsBegin = Extend();
265 ctrlsBegin->SetCtrl(hdwp,tmpRect,*chatDataBegin,m_hMaster.viewproperty.commentFoldingFlag);
267 heightSum = tmpRect.bottom;
272 for(;ctrlsBegin != ctrlsEnd;++ctrlsBegin){
274 ctrlsBegin->Hide(hdwp);
277 ::EndDeferWindowPos(hdwp);
287 VOID CChatChildCtrlsList::AllHide(){
289 auto begin =m_list.begin();
290 auto end = m_list.end();
292 HDWP hdwp = ::BeginDeferWindowPos(CChatChildCtrls::GetCtrlCount() * m_list.size());
293 for(;begin != end;++begin){
296 ::EndDeferWindowPos(hdwp);
301 ///
\8ag
\92£
\8f\88\97\9d
303 CChatChildCtrlsList::iterator CChatChildCtrlsList::Extend(){
306 CChatChildCtrls ctrls(m_hMaster);
308 m_list.push_back(ctrls);
309 m_list.back().Create();
310 auto ite = (--m_list.end());
317 //
\83R
\83\81\83\93\83g
\83r
\83\85\81[
\83N
\83\89\83X
\83\81\83\
\83b
\83h
318 ///////////////////////////////////////////////////////
320 CCommentView::CCommentView(CNicoLiveStream &stream,CNicoVideoAuth &in_refAuth):
321 m_commentListWindow(*this),
324 ,chatChildCtrlsList(*this)
330 lf.lfCharSet = SHIFTJIS_CHARSET;
333 hHeaderFontNew = CreateFontIndirect(&lf);
340 CCommentView::~CCommentView(){
343 DeleteObject(hHeaderFontNew);
351 VOID CCommentView::OnConnect(){
352 m_commentListWindow.SetRedraw(FALSE);
353 m_commentListWindow.ResetViewSellHeight();
355 chatChildCtrlsList.AllHide();
358 commentlist.OnConnect();
360 SCROLLINFO vScrollInfo = {0};
361 vScrollInfo.cbSize = sizeof(vScrollInfo);
362 vScrollInfo.fMask = SIF_ALL;
364 this->SetScrollInfo(SB_VERT,&vScrollInfo,FALSE);
366 m_commentListWindow.SetRedraw(TRUE);
367 m_commentListWindow.Invalidate();
374 UINT_PTR CCommentView::GetColumnHolSizeSum(){
378 this->GetScrollRange(SB_HORZ,&nMin,&nMax);
383 VOID CCommentView::SetProperty(const CommentViewProperty &setProperty,const GeneralProperty &in_generalProperty){
386 viewproperty = setProperty;
387 generalProperty = in_generalProperty;
388 m_commentListWindow.OnSetProperty();
393 CommentViewProperty &CCommentView::GetProperty(){
403 HWND CCommentView::Create(HWND hWndParent){
407 HWND rslt = __super::Create(hWndParent,0,commentViewConstant::NLITE_COMMENTVIEW,WS_VISIBLE | WS_CHILD | WS_VSCROLL | WS_HSCROLL | WS_BORDER,0,commentViewConstant::MENU_OR_ID);
410 HDC hdc = m_header.BeginPaint(&ps);
413 HFONT hOld = (HFONT)SelectObject(hdc,hHeaderFontNew);
415 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ñ")};
416 UINT_PTR holizenSize[] = {0,0,100,0,0};
418 for(UINT_PTR index = 0;index < ARRAY_LENGTH(columns) ;++index){
420 GetTextExtentPoint32(hdc , columns[index] , _tcslen(columns[index]) , &size);
421 UINT_PTR holsize = holizenSize[index] + size.cx + 15;
422 holizenSize[index] = viewproperty.headerholSize[index] >= 0 ? viewproperty.headerholSize[index] : holsize;
425 SelectObject(hdc,hOld);
427 m_header.EndPaint(&ps);
430 HEADERSINFO headersinfo = {columns,holizenSize,ARRAY_LENGTH(columns)};
432 AddHeader(&headersinfo);
434 m_header.SetOrderArray(ARRAY_LENGTH(viewproperty.headerOrderArray),viewproperty.headerOrderArray);
445 LRESULT CCommentView::OnHeaderEndTrack(LPNMHDR lParam){
448 if(lParam->hwndFrom == m_header.m_hWnd){
451 auto begin = commentlist.begin();
453 auto end = commentlist.end();
455 for(;begin != end;++begin){
457 begin->viewData.height = 0;
461 m_commentListWindow.SetRedraw(FALSE);
462 SCROLLINFO vScrollInfo = {0};
463 vScrollInfo.fMask = SIF_PAGE | SIF_POS | SIF_RANGE;
465 this->GetScrollInfo(SB_VERT,&vScrollInfo);
466 vScrollInfo.nPage = m_commentListWindow.CalcScrollPage(vScrollInfo.nMax);
467 vScrollInfo.fMask = SIF_PAGE;
468 this->SetScrollInfo(SB_VERT,&vScrollInfo);
470 BOOL scrollFlag = vScrollInfo.nPos + (int)vScrollInfo.nPage + 1>= vScrollInfo.nMax;
471 UINT_PTR commentCount = commentlist.Size();
472 LPNMHEADER lpNmHdr = (LPNMHEADER )lParam;
474 m_header.SetItem(lpNmHdr->iItem,lpNmHdr->pitem);
482 if(scrollFlag == TRUE){
484 this->m_commentListWindow.SendMessageW(WM_VSCROLL,MAKELONG(SB_BOTTOM,0),0);
487 INT_PTR itemCount = m_header.GetItemCount();
491 for(INT_PTR itemIndex = 0;itemIndex < itemCount;itemIndex++){
492 m_header.GetItemRect(itemIndex,&itemSizeRect);
493 nMax += itemSizeRect.right - itemSizeRect.left;
497 this->SetScrollRange(SB_HORZ,nMin,nMax,TRUE);
503 m_commentListWindow.SetRedraw(TRUE);
505 m_commentListWindow.Invalidate();
506 this->m_commentListWindow.SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
513 VOID CCommentView::OnChatReceve(NicoLiveChat_P chat,UINT_PTR commnetCountSum){
516 commentlist.OnChatReceve(chat,commnetCountSum,this->m_commentListWindow);
522 VOID CCommentView::OnChatReceveSettle(UINT_PTR chatNo,UINT_PTR commentCountSum){
525 SCROLLINFO vScrollInfo = {0};
528 vScrollInfo.fMask = SIF_ALL;
530 this->GetScrollInfo(SB_VERT,&vScrollInfo);
531 BOOL scrollFlag = vScrollInfo.nPos + (int)vScrollInfo.nPage >= vScrollInfo.nMax;
533 vScrollInfo.cbSize = sizeof(vScrollInfo);
534 vScrollInfo.nMax = commentCountSum;
535 vScrollInfo.fMask = SIF_RANGE | SIF_PAGE;
536 vScrollInfo.nPage = m_commentListWindow.CalcScrollPage(vScrollInfo.nMax);
539 this->SetScrollInfo(SB_VERT,&vScrollInfo,FALSE);
544 if(scrollFlag == TRUE){
545 this->PostMessage(WM_VSCROLL,MAKEWORD(SB_BOTTOM,0),0);
549 if(vScrollInfo.nPos + static_cast<INT_PTR>(vScrollInfo.nPage) >= vScrollInfo.nMax - static_cast<INT_PTR>(vScrollInfo.nPage)){
550 m_commentListWindow.Invalidate();
552 this->PostMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
558 static UCHAR getrgb(){
560 UCHAR rgb = 192 + rand() % 64;
574 LRESULT CCommentView::OnSize(UINT wParam,SIZE lParam){
581 VOID CCommentView::ChangeSize(const SIZE& client){
583 SCROLLINFO hScrollInfo = {0};
584 hScrollInfo.cbSize = sizeof(hScrollInfo);
585 hScrollInfo.fMask = SIF_PAGE;
586 hScrollInfo.nPage = client.cx;
588 this->SetScrollInfo(SB_HORZ,&hScrollInfo);
589 hScrollInfo.fMask = SIF_ALL;
590 this->GetScrollInfo(SB_HORZ,&hScrollInfo);
593 HDWP hDwp = BeginDeferWindowPos(2);
596 INT_PTR movePos = -1 * hScrollInfo.nPos;
598 m_header.DeferWindowPos(hDwp,m_header.m_hWnd,movePos,0,0,0,SWP_NOSIZE | SWP_NOZORDER);
599 m_commentListWindow.DeferWindowPos(hDwp,m_commentListWindow.m_hWnd,movePos,commentViewConstant::HEADER_HAIGHT,::GetSystemMetrics(SM_CXFULLSCREEN),client.cy - commentViewConstant::HEADER_HAIGHT,SWP_NOZORDER);
601 EndDeferWindowPos(hDwp);
606 m_header.GetWindowRect(&headerRectSize);
607 bkRect.left = headerRectSize.right - headerRectSize.left - hScrollInfo.nPos;
609 bkRect.right = client.cx ;
610 bkRect.bottom = client.cy;
618 LRESULT CCommentView::OnClickChatNo(UINT uMsg,WPARAM wParam,LPARAM lParam){
621 ::SendMessage(::GetAncestor(*this,GA_ROOT),uMsg,wParam,lParam);
622 wincheck(GetLastError());
627 LRESULT CCommentView::OnClickUserName(UINT uMsg,WPARAM wParam,LPARAM lParam){
630 ::SendMessage(::GetAncestor(*this,GA_ROOT),uMsg,wParam,lParam);
635 LRESULT CCommentView::OnEraseBkgnd(HDC wParam){
641 VOID CCommentView::OnDestroy(){
642 m_header.GetOrderArray(ARRAY_LENGTH(viewproperty.headerOrderArray),viewproperty.headerOrderArray);
643 INT_PTR headerItemcount = m_header.GetItemCount();
645 for(INT_PTR itemindex = 0;itemindex < headerItemcount;itemindex++){
647 m_header.GetItemRect(itemindex,&headerItemRect);
648 viewproperty.headerholSize[itemindex] = headerItemRect.right - headerItemRect.left;
650 commentlist.OnDestroy();
651 m_header.DestroyWindow();
652 m_commentListWindow.DestroyWindow();
657 LRESULT CCommentView::OnHeaderEndDrag(LPNMHDR lParam){
659 if(lParam->hwndFrom == m_header.m_hWnd){
661 LPNMHEADER pNMHeader = (LPNMHEADER) lParam;
662 this->m_header.SetItem(pNMHeader->iItem,pNMHeader->pitem);
664 m_commentListWindow.Invalidate();
665 this->m_commentListWindow.SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
673 VOID CCommentView::OnHScroll(INT_PTR loWParam,SHORT hiWParam,HWND lParam){
677 SCROLLINFO hScrollInfo = {0};
678 hScrollInfo.cbSize = sizeof(hScrollInfo);
679 hScrollInfo.fMask = SIF_ALL;
680 this->GetScrollInfo(SB_HORZ,&hScrollInfo);
683 case SB_THUMBPOSITION:
685 dy = hiWParam - hScrollInfo.nPos;
691 dy = -1 * hScrollInfo.nPage;
698 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;
708 dy = max(-1 * hScrollInfo.nPos, min(dy, hScrollInfo.nMax - hScrollInfo.nPos));
712 hScrollInfo.nPos += dy;
713 INT_PTR moveRange = -(hScrollInfo.nPos);
715 HDWP hDwp = BeginDeferWindowPos(2);
717 m_header.DeferWindowPos(hDwp,m_header.m_hWnd,moveRange,0,0,0,SWP_NOSIZE | SWP_NOZORDER);
718 m_commentListWindow.DeferWindowPos(hDwp,m_commentListWindow.m_hWnd,moveRange,commentViewConstant::HEADER_HAIGHT,0,0,SWP_NOSIZE | SWP_NOZORDER);
720 EndDeferWindowPos(hDwp);
723 this->SetScrollInfo(SB_HORZ,&hScrollInfo);
730 VOID CCommentView::OnVScroll(INT_PTR loWParam,SHORT hiWParam,HWND lParam){
733 SCROLLINFO vScrollInfo = {0};
734 vScrollInfo.fMask = SIF_ALL;
737 this->GetScrollInfo(SB_VERT,&vScrollInfo);
742 case SB_THUMBPOSITION:
745 dy = hiWParam - vScrollInfo.nPos;
762 dy = -1 * vScrollInfo.nPage;
768 dy = vScrollInfo.nPage;
775 dy = -vScrollInfo.nPos;
781 dy = vScrollInfo.nMax;
798 vScrollInfo.nPos += dy;
799 // viewStartHeight = vScrollInfo.nPos;
800 this->SetScrollPos(SB_VERT,vScrollInfo.nPos);
801 this->commentlist.SetShortCut(this->GetScrollPos(SB_VERT));
802 //this->SetScrollInfo(SB_VERT,&vScrollInfo);
803 this->UpdateWindow();
805 m_commentListWindow.Invalidate();
806 this->m_commentListWindow.SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
814 LRESULT CCommentView::OnCreate(LPCREATESTRUCT lpcs){
815 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);
816 m_commentListWindow.Create(m_hWnd,0,commentViewConstant::NLITE_COMMENTLISTWINDOW,WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN , 0,commentViewConstant::LISTWINDOW);
823 VOID CCommentView::AddHeader(LPHEADERSINFO infos){
826 m_header.SetFont(hHeaderFontNew);
829 item.mask = HDI_FORMAT | HDI_TEXT | HDI_WIDTH;
830 item.fmt = HDF_CENTER | HDF_STRING;
833 for(UINT_PTR index = 0;index < infos->count ;++index){
835 item.pszText = infos->columns[index];
837 item.cxy = infos->holizensize[index];
838 m_header.AddItem(&item);
843 UINT_PTR itemCount = m_header.GetItemCount();
844 for(UINT_PTR u_index = 0;u_index < itemCount;++u_index){
846 m_header.GetItemRect(u_index,&itemRect);
847 nMax += itemRect.right - itemRect.left;
851 this->SetScrollRange(SB_HORZ,0,nMax,TRUE);
857 VOID CCommentView::DecisionHorzSize(){
859 HDWP hWindowPosInfo = BeginDeferWindowPos(2);
861 this->GetClientRect(&bkWindowRect);
862 m_header.DeferWindowPos(hWindowPosInfo,m_header.m_hWnd,0,0,::GetSystemMetrics(SM_CXFULLSCREEN),commentViewConstant::HEADER_HAIGHT,SWP_NOZORDER | SWP_NOMOVE);
863 m_commentListWindow.DeferWindowPos(hWindowPosInfo,m_header.m_hWnd,0,0,::GetSystemMetrics(SM_CXFULLSCREEN),bkWindowRect.bottom - commentViewConstant::HEADER_HAIGHT,SWP_NOZORDER | SWP_NOMOVE);
865 EndDeferWindowPos(hWindowPosInfo);
874 //
\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
875 ////////////////////////////////////////////////////////////////////
877 CCommentListWindow::CCommentListWindow(CCommentView &in_self):
881 CFontHandle font = ::AtlGetDefaultGuiFont();
883 font.GetLogFont(&logfont);
884 logfont.lfUnderline = TRUE;
886 linkFont.CreateFontIndirect(&logfont);
889 CCommentListWindow::~CCommentListWindow(){
892 VOID CCommentListWindow::OnSetProperty(){
894 if(IsWindow() == TRUE)this->SetRedraw(FALSE);
896 if(collLinePen.IsNull() == FALSE)collLinePen.DeleteObject();
897 if(normalSellLinePen.IsNull() == FALSE)normalSellLinePen.DeleteObject();
898 if(normalBkBrush.IsNull() == FALSE)normalBkBrush.DeleteObject();
899 if(selectSellLinePen.IsNull() ==FALSE)selectSellLinePen.DeleteObject();
900 if(selectBkBrush.IsNull() == FALSE)selectBkBrush.DeleteObject();
902 collLinePen.CreatePen(PS_SOLID,1,self.viewproperty.colLineColor);
903 normalSellLinePen.CreatePen(PS_SOLID,1,self.viewproperty.normalSellLineColor);
904 normalBkBrush.CreateSolidBrush(self.viewproperty.backColor);
905 selectSellLinePen.CreatePen(PS_SOLID,1,self.viewproperty.selectSellLineColor);
906 selectBkBrush.CreateSolidBrush(self.viewproperty.selectBackColor);
909 if(IsWindow() == TRUE)this->SetRedraw(TRUE);
913 VOID CCommentListWindow::OnPaint(HDC in_hdc){
915 this->self.refAuth.GetUserSession();
920 self.GetClientRect(&clientRect);
921 clientRect.bottom -= commentViewConstant::HEADER_HAIGHT;
923 this->GetWindowRect(&windowRect);
924 windowRect.right -= windowRect.left;
925 windowRect.bottom -= windowRect.top;
933 CMemoryDC mdc(pdc,windowRect);
934 mdc.SelectFont(AtlGetDefaultGuiFont());
937 CCommentList &commentList = self.commentlist;
939 BOOL selectFlag = FALSE;
940 CCommentList::iterator selectData;
941 RECT selectRect = {0};
945 if(commentList.Size() > 0){
947 listRect = windowRect;
948 listRect.right = self.GetColumnHolSizeSum();
950 CCommentList::iterator chatData = commentList.GetShortCut();
955 mdc.FillRect(&listRect,this->normalBkBrush);
957 CCommentList::iterator endData = commentList.end();
960 RECT headerRects[COMMENTVIEW_HEADERITEMSIZE];
961 RECT colLineRects[COMMENTVIEW_HEADERITEMSIZE];
962 RECT selectHeaderRects[COMMENTVIEW_HEADERITEMSIZE];
964 self.m_header.GetItemRect(CCommentView::NO,&headerRects[CCommentView::NO]);
965 self.m_header.GetItemRect(CCommentView::USERNAME,&headerRects[CCommentView::USERNAME]);
966 self.m_header.GetItemRect(CCommentView::COMMENT,&headerRects[CCommentView::COMMENT]);
967 self.m_header.GetItemRect(CCommentView::TIME,&headerRects[CCommentView::TIME]);
968 self.m_header.GetItemRect(CCommentView::INFO,&headerRects[CCommentView::INFO]);
970 memcpy(colLineRects,headerRects,sizeof(headerRects));
976 headerRects[CCommentView::NO].left += SELL_SPACE_LENGTH;
977 headerRects[CCommentView::USERNAME].left += SELL_SPACE_LENGTH;
978 headerRects[CCommentView::COMMENT].left += SELL_SPACE_LENGTH;
979 headerRects[CCommentView::TIME].left += SELL_SPACE_LENGTH;
980 headerRects[CCommentView::INFO].left += SELL_SPACE_LENGTH;
982 headerRects[CCommentView::NO].right -= SELL_SPACE_LENGTH;
983 headerRects[CCommentView::USERNAME].right -= SELL_SPACE_LENGTH;
984 headerRects[CCommentView::COMMENT].right -= SELL_SPACE_LENGTH;
985 headerRects[CCommentView::TIME].right -= SELL_SPACE_LENGTH;
986 headerRects[CCommentView::INFO].right -= SELL_SPACE_LENGTH;
988 headerRects[CCommentView::NO].top = SELL_SPACE_LENGTH;
989 headerRects[CCommentView::USERNAME].top = SELL_SPACE_LENGTH;
990 headerRects[CCommentView::COMMENT].top = SELL_SPACE_LENGTH;
991 headerRects[CCommentView::TIME].top = SELL_SPACE_LENGTH;
992 headerRects[CCommentView::INFO].top = SELL_SPACE_LENGTH;
994 headerRects[CCommentView::NO].bottom = SELL_SPACE_LENGTH;
995 headerRects[CCommentView::USERNAME].bottom = SELL_SPACE_LENGTH;
996 headerRects[CCommentView::COMMENT].bottom = SELL_SPACE_LENGTH;
997 headerRects[CCommentView::TIME].bottom = SELL_SPACE_LENGTH;
998 headerRects[CCommentView::INFO].bottom = SELL_SPACE_LENGTH;
1000 INT_PTR listRectTop = listRect.top;
1001 for(;chatData != endData && listRect.top < clientRect.bottom;++chatData){
1002 CalcItemHeight(*chatData);
1004 // dumpln(TEXT("height:%d"),chatData->viewData.height);
1005 listRect.bottom += chatData->viewData.height;
1007 headerRects[CCommentView::NO].top = listRect.top + SELL_SPACE_LENGTH;
1008 headerRects[CCommentView::USERNAME].top = listRect.top + SELL_SPACE_LENGTH;
1009 headerRects[CCommentView::COMMENT].top = listRect.top + SELL_SPACE_LENGTH;
1010 headerRects[CCommentView::TIME].top = listRect.top + SELL_SPACE_LENGTH;
1011 headerRects[CCommentView::INFO].top = listRect.top + SELL_SPACE_LENGTH;
1013 headerRects[CCommentView::NO].bottom = listRect.bottom - SELL_SPACE_LENGTH;
1014 headerRects[CCommentView::USERNAME].bottom = listRect.bottom - SELL_SPACE_LENGTH;
1015 headerRects[CCommentView::COMMENT].bottom = listRect.bottom - SELL_SPACE_LENGTH;
1016 headerRects[CCommentView::TIME].bottom = listRect.bottom - SELL_SPACE_LENGTH;
1017 headerRects[CCommentView::INFO].bottom = listRect.bottom - SELL_SPACE_LENGTH;
1019 if(chatData->viewData.selectFlag == TRUE){
1021 selectData = chatData;
1022 selectRect = listRect;
1023 memcpy(selectHeaderRects,headerRects,sizeof(headerRects));
1029 this->DrawItem(mdc,listRect,headerRects,*chatData);
1033 listRect.top = listRect.bottom;
1036 viewSellHeight = listRect.bottom;
1040 if(selectFlag == TRUE){
1041 this->DrawItem(mdc,selectRect,selectHeaderRects,*selectData);
1044 //
\8d\80\96Ú
\82Ì
\8fc
\90ü
\82ð
\95`
\89æ
1045 mdc.SelectPen(collLinePen);
1046 mdc.MoveTo(colLineRects[CCommentView::NO].right,listRectTop);
1047 mdc.LineTo(colLineRects[CCommentView::NO].right,listRect.bottom);
1048 mdc.MoveTo(colLineRects[CCommentView::USERNAME].right,listRectTop);
1049 mdc.LineTo(colLineRects[CCommentView::USERNAME].right,listRect.bottom);
1050 mdc.MoveTo(colLineRects[CCommentView::COMMENT].right,listRectTop);
1051 mdc.LineTo(colLineRects[CCommentView::COMMENT].right,listRect.bottom);
1052 mdc.MoveTo(colLineRects[CCommentView::TIME].right,listRectTop);
1053 mdc.LineTo(colLineRects[CCommentView::TIME].right,listRect.bottom);
1054 mdc.MoveTo(colLineRects[CCommentView::INFO].right,listRectTop);
1055 mdc.LineTo(colLineRects[CCommentView::INFO].right,listRect.bottom);
1058 windowRect.left = listRect.right;
1059 mdc.FillRect(&windowRect,(HBRUSH)::GetStockObject(GRAY_BRUSH));
1073 LRESULT CCommentListWindow::OnSetCtrol(UINT uMsg,WPARAM wparam,LPARAM lparam){
1077 self.chatChildCtrlsList.ShowCntrls();
1084 VOID CCommentListWindow::OnSize(UINT wParam, _WTYPES_NS::CSize &windowSize){
1087 SCROLLINFO vScrollInfo = {0};
1088 vScrollInfo.fMask = SIF_ALL;
1091 self.GetScrollInfo(SB_VERT,&vScrollInfo);
1092 BOOL scrollFlag = (UINT)(vScrollInfo.nPage + vScrollInfo.nPos + 1) >= (UINT)vScrollInfo.nMax;
1093 vScrollInfo.nPage = CalcScrollPage(vScrollInfo.nMax);
1095 vScrollInfo.fMask = SIF_PAGE;
1096 self.SetScrollInfo(SB_VERT,&vScrollInfo);
1100 if(scrollFlag == TRUE){
1101 self.SendMessageW(WM_VSCROLL,MAKELONG(SB_BOTTOM,0),0);
1105 this->SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
1111 UINT_PTR CCommentListWindow::CalcScrollPage(UINT_PTR nMax){
1116 this->GetClientRect(&clientRect);
1118 SCROLLINFO vScrollInfo = {0};
1119 if(self.commentlist.empty() != TRUE){
1121 CCommentList::reverse_iterator rbegin = self.commentlist.rbegein();
1122 CCommentList::reverse_iterator rend = self.commentlist.rend();
1123 for(;rbegin != rend;++rbegin){
1124 CalcItemHeight(*rbegin);
1125 height += rbegin->viewData.height;
1127 if(height > clientRect.bottom)goto overclientrect;
1132 vScrollInfo.fMask = SIF_RANGE;
1133 self.GetScrollInfo(SB_VERT,&vScrollInfo);
1143 VOID CCommentListWindow::DrawItem(CDC &dc,const RECT &rc,const RECT *headerRect,CChatData &chatData){
1146 RECT noViewRect = headerRect[CCommentView::NO]; //
\83R
\83\81\94Ô
\95\
\8e¦
\97Ì
\88æ
1147 RECT userNameViewRect = headerRect[CCommentView::USERNAME]; //
\83\86\81[
\83U
\96¼
\95\
\8e¦
\97Ì
\88æ
1148 RECT chatViewRect = headerRect[CCommentView::COMMENT]; //
\83R
\83\81\83\93\83g
\95\
\8e¦
\97Ì
\88æ
1149 RECT timeViewRect = headerRect[CCommentView::TIME]; //
\8e\9e\8aÔ
\95\
\8e¦
\97Ì
\88æ
1150 RECT infoViewRect = headerRect[CCommentView::INFO]; //
\83R
\83\81\83\93\83g
\8fî
\95ñ
\95\
\8e¦
\97Ì
\88æ
1154 //
\83R
\83\81\83\93\83g
\8e\9e\8aÔ
\95\
\8e¦
\97p
\95¶
\8e\9a\97ñ
\8dì
\90¬
1156 time_t chatTime = (time_t)difftime(chatData.date,self.stream.GetStartTime());
1159 BOOL beforeStartFlag = chatTime < 0 ? TRUE : FALSE;
1160 TCHAR noString[sizeof(chatData.no) * 8];
1161 TCHAR dateString[LENGTH_16];
1162 if(chatData.no != 0)_stprintf(noString,TEXT("%u"),chatData.no);
1163 else _tcscpy(noString,TEXT(""));
1164 CNLiteString timeFormat;
1167 if(beforeStartFlag == TRUE){
1169 timeFormat = TEXT("-");
1170 chatTime = -chatTime;
1172 tm ct = *gmtime(&chatTime);
1173 if(ct.tm_hour != 0 ){
1175 timeFormat += TEXT("%H:%M:%S");
1179 timeFormat += TEXT("%M:%S");
1182 _tcsftime(dateString,ARRAY_LENGTH(dateString),timeFormat,&ct);
1185 COLORREF bkColor; //
\94w
\8ci
\90F
1186 CPen originSellLinePen; //
\98g
\90ü
\95`
\89æ
\97p
\83y
\83\93
1187 CBrush originBkBrush; //
\94w
\8ci
\95`
\89æ
\97p
\83u
\83\89\83V
1189 //
\91I
\91ð
\8fó
\91Ô
\82©
\83`
\83F
\83b
\83N
1190 if (chatData.viewData.selectFlag == TRUE)
1192 bkColor = self.viewproperty.selectBackColor;
1194 dc.SelectBrush(this->selectBkBrush);
1195 dc.SelectPen(this->selectSellLinePen);
1200 if(chatData.viewData.sellLineColor == CChatData::ViewData::INIT_COLOR){
1201 dc.SelectPen(this->normalSellLinePen);
1205 originSellLinePen.CreatePen(PS_SOLID,1,chatData.viewData.sellLineColor);
1206 dc.SelectPen(originSellLinePen);
1211 if(chatData.viewData.backColor != CChatData::ViewData::INIT_COLOR || chatData.listenerData->originBkFlag == TRUE){
1213 if(chatData.viewData.backColor != CChatData::ViewData::INIT_COLOR){
1214 bkColor = chatData.viewData.backColor;
1215 originBkBrush.CreateSolidBrush(chatData.viewData.backColor);
1217 }else if(chatData.listenerData->originBkFlag == TRUE){
1219 bkColor = chatData.listenerData->bkColor;
1220 originBkBrush.CreateSolidBrush(chatData.listenerData->bkColor);
1224 dc.SelectBrush(originBkBrush);
1227 bkColor = self.viewproperty.backColor;
1228 dc.SelectBrush(this->normalBkBrush);
1229 dc.SelectBrush(this->normalBkBrush);
1235 //
\94w
\8ci
\82Æ
\98g
\90ü
\82ð
\95`
\89æ
1238 dc.Rectangle(rc.left,rc.top - 1,rc.right ,rc.bottom + 1);
1239 dc.SetBkColor(bkColor);
1242 //
\95`
\89æ
\83T
\83C
\83Y
\82ð
\8cv
\8eZ
1248 dc.SelectFont(linkFont);
1249 dc.SetTextColor(self.viewproperty.linkStringColor);
1250 //
\83e
\83L
\83X
\83g
\95`
\89æ
1251 dc.DrawTextW(noString,_tcslen(noString),&noViewRect,DT_WORD_ELLIPSIS);
1252 dc.DrawTextW(chatData.listenerData->user_id,chatData.listenerData->user_id.Length(),&userNameViewRect,DT_WORD_ELLIPSIS);
1254 dc.SelectFont(::AtlGetDefaultGuiFont());
1255 dc.SetTextColor(chatData.viewData.stringColor == CChatData::ViewData::INIT_COLOR ? chatData.viewData.stringColor :self.viewproperty.baseStringColor);
1256 dc.DrawTextW(dateString,_tcslen(dateString),&timeViewRect,DT_WORD_ELLIPSIS);
1261 VOID CCommentListWindow::ResetViewSellHeight(){
1269 VOID CCommentListWindow::ShowCurSel(){
1271 auto end = self.commentlist.end();
1272 INT_PTR cursel = self.commentlist.GetCurSelNo();
1273 if(cursel == -1)goto end;
1275 SCROLLINFO vScrollInfo;
1276 vScrollInfo.cbSize = sizeof(vScrollInfo);
1277 vScrollInfo.fMask = SIF_ALL;
1278 self.GetScrollInfo(SB_VERT,&vScrollInfo);
1280 if(!(cursel >= vScrollInfo.nPos + static_cast<INT_PTR>(vScrollInfo.nPage) / 2 && cursel <= vScrollInfo.nPos + static_cast<INT_PTR>(vScrollInfo.nPage) / 2)){
1281 self.SetScrollPos(SB_VERT,cursel - (vScrollInfo.nPage / 2));
1282 self.commentlist.SetShortCut(self.GetScrollPos(SB_VERT));
1287 this->SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
1295 VOID CCommentListWindow::CalcItemHeight(CChatData &chatData){
1297 if(chatData.viewData.height == 0){
1299 self.m_header.GetItemRect(CCommentView::COMMENT,&drowSize);
1301 drowSize.bottom = 0;
1303 CChatReadEdit cedit(self);
1305 cedit.GeneralCreate(*this,ENM_REQUESTRESIZE,CALCEDIT_ID);
1307 cedit.SetWindowPos(NULL,0,0,drowSize.right - drowSize.left,drowSize.bottom - drowSize.top,SWP_NOZORDER | SWP_NOMOVE | SWP_NOREDRAW);
1308 cedit.SetWindowText(chatData);
1309 cedit.GetClientRect(&drowSize);
1310 cedit.DestroyWindow();
1311 drowSize.bottom += 12;
1312 if(drowSize.bottom - drowSize.top > 120)drowSize.bottom = drowSize.top + 120;
1313 chatData.viewData.height = drowSize.bottom - drowSize.top;
1321 LRESULT CCommentListWindow::OnCreate(LPCREATESTRUCT lpCreateStruct){
1323 //CComPtr<IUnknown> iu;
1324 //::AtlAxCreateControlEx(TEXT("MSHTML:<HTML><BODY></BODY></HTML>"),*this,(IStream*)NULL,(IUnknown**)NULL,&iu,GUID_NULL);
1326 //iu->QueryInterface(DIID_DWebBrowserEvents2,&addToMyListWindow);
1327 RECT rc = {0,0,300,200};
1328 // addToMyListWindow.Create(m_hWnd, &rc,_T("Shell.Explorer.2"),WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN , 0);
1333 CCommentList::iterator CCommentListWindow::CalcClickLine(INT_PTR height){
1335 INT_PTR heightSum = 0;
1337 CCommentList::iterator chatData = self.commentlist.GetShortCut();
1338 CCommentList::iterator end = self.commentlist.end();
1342 for(; chatData != end ;(++chatData)){
1343 CalcItemHeight(*chatData);
1344 heightSum += chatData->viewData.height;
1347 if(heightSum >= height)break;
1357 BOOL CCommentListWindow::IsOnNoOrUserName(UINT_PTR index,const POINT &point){
1361 self.m_header.GetItemRect(index,&rc);
1364 if((point.x >= rc.left && point.x <= rc.right) && (point.y < static_cast<INT_PTR>(viewSellHeight))){
1366 INT_PTR heightsum = 0;
1367 auto clickData = self.commentlist.GetShortCut();
1368 auto endData = self.commentlist.end();
1369 for(;clickData != endData;++clickData){
1371 heightsum += clickData->viewData.height;
1373 if(heightsum > point.y){
1375 CDC cdc = this->GetDC();
1377 rc.top = heightsum -= clickData->viewData.height;
1378 RECT calcRect = {0};
1379 cdc.SelectFont(linkFont);
1382 if(index == CCommentView::USERNAME){
1383 LPCTSTR viewStr = clickData->listenerData->userName.Length() == 0 ? clickData->listenerData->user_id : clickData->listenerData->userName;
1384 cdc.DrawTextW(viewStr ,_tcslen(viewStr),&calcRect,DT_CALCRECT);
1386 } else if(index == CCommentView::NO){
1387 TCHAR viewStr[sizeof(UINT_PTR) * 8];
1388 _stprintf(viewStr,TEXT("%d"),clickData->no);
1389 cdc.DrawTextW(viewStr,_tcslen(viewStr),&calcRect,DT_CALCRECT);
1392 rc.bottom = rc.top + calcRect.bottom - calcRect.top;
1393 rc.right = rc.right > rc.left + calcRect.right - calcRect.left ? rc.left + calcRect.right - calcRect.left : rc.right;
1394 rslt = (point.y >= rc.top && point.y <= rc.bottom && point.x >= rc.left && point.x <= rc.right);
1408 VOID CCommentListWindow::OnDestroy(){
1410 // this->addToMyListWindow.DestroyWindow();
1414 VOID CCommentListWindow::OnLButtonDown(UINT wParam, _WTYPES_NS::CPoint &point){
1418 CCommentList::iterator ite;
1420 if(point.x > (INT_PTR)self.GetColumnHolSizeSum()) goto end;
1423 if(self.commentlist.empty() == TRUE)goto end;
1425 ite = CalcClickLine(point.y);
1426 self.commentlist.SetCurSel(ite);
1428 if(this->IsOnNoOrUserName(CCommentView::NO,point) == TRUE){
1430 ::SendMessage(self,UM_CLICK_CHATNO,(WPARAM)&(*ite),(LPARAM)self.m_hWnd);
1432 } else if(this->IsOnNoOrUserName(CCommentView::USERNAME,point) == TRUE){
1434 ::SendMessage(self,UM_CLICK_USERNAME,(WPARAM)&(*ite),(LPARAM)self.m_hWnd);
1442 this->SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
1448 VOID CCommentListWindow::OnLButtonDblClk(UINT wParam, _WTYPES_NS::CPoint &point){
1452 if(!(point.x > (INT_PTR)self.GetColumnHolSizeSum() || self.commentlist.empty() == TRUE)){
1454 auto end = self.commentlist.end();
1455 auto lineIte = CalcClickLine(point.y);
1456 if( lineIte == end)goto endlabel;
1460 if(lineIte->listenerData->originBkFlag == FALSE){
1461 CListenerColorCollector colorCollector;
1462 listenerList.BkColorCollect(colorCollector);
1467 srand((unsigned int)time(NULL));
1473 bkColor = PALETTERGB(red,green,blue);
1475 }while(colorCollector.Find(bkColor));
1477 lineIte->listenerData->originBkFlag = TRUE;
1478 lineIte->listenerData->SetBkColor(bkColor);
1482 lineIte->listenerData->originBkFlag = FALSE;
1493 this->Invalidate(TRUE);
1495 this->SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
1499 LRESULT CCommentListWindow::OnEraseBkGnd(HDC lparam){
1504 VOID CCommentListWindow::OnKeyDown(TCHAR vKey,UINT loLParam,UINT hiLParam){
1527 auto cursel = self.commentlist.GetCurSel();
1528 if((dy < 0 && cursel == self.commentlist.begin()) || dy >= static_cast<INT_PTR>(self.commentlist.Size()))goto end;
1531 std::advance(cursel,dy);
1532 self.commentlist.SetCurSel(cursel);
1541 LRESULT CCommentListWindow::OnSetCursor(HWND wparam,UINT loLparam,UINT hiLparam){
1544 POINT mousePoint = {0};
1546 GetCursorPos(&mousePoint);
1547 ::ScreenToClient(*this,&mousePoint);
1549 if(/*static_cast<INT>(loLparam) == 1 &&*/( IsOnNoOrUserName(CCommentView::NO,mousePoint) || IsOnNoOrUserName(CCommentView::USERNAME,mousePoint))){
1552 ::SetCursor(::LoadCursorW(NULL,IDC_HAND));
1567 LRESULT CCommentListWindow::OnMouseWheel(UINT loWparam,SHORT hiWparam,CPoint &point){
1570 self.SendMessageW(WM_VSCROLL,MAKELONG(hiWparam < 0 ? SB_PAGEDOWN : SB_PAGEUP ,0),0);
1577 LRESULT CCommentListWindow::OnChatControlNortify(LPNMHDR lParam){
1581 switch(lParam->code){
1585 ENLINK *lpenlk = (ENLINK *)lParam;
1586 if (lpenlk->msg == WM_LBUTTONDOWN) {
1587 CRichEditCtrl chatReadEdit = lpenlk->nmhdr.hwndFrom;
1588 chatReadEdit.SetSel(lpenlk->chrg);
1590 chatReadEdit.GetSelText(selTextBuf);
1591 if(regex_match((LPCTSTR)selTextBuf,nliteregex::URL) == TRUE){
1596 } else if(regex_match((LPCTSTR)selTextBuf,nliteregex::VIDEOID) == TRUE){
1598 selTextBuf.Insert(0,ADDMYLIST_PART);
1600 } else if( regex_match((LPCTSTR)selTextBuf,nliteregex::LIVEID) == TRUE){
1602 selTextBuf.Insert(0,LIVEURL_PART);
1606 OpenURL(*this,self.generalProperty,selTextBuf,SW_SHOWNORMAL);
1613 auto pmf = (MSGFILTER *)lParam;
1614 if (pmf->msg == WM_LBUTTONDOWN || pmf->msg== WM_LBUTTONDBLCLK || pmf->msg == WM_MOUSEWHEEL){
1617 ::GetWindowRect(pmf->nmhdr.hwndFrom,&windowrect);
1618 _WTYPES_NS::CPoint point(windowrect.left + LOWORD(pmf->lParam),windowrect.top + HIWORD(pmf->lParam));
1619 ::ScreenToClient(*this,&point);
1623 case WM_LBUTTONDOWN:
1624 OnLButtonDown(pmf->wParam,point);
1627 case WM_LBUTTONDBLCLK:
1628 OnLButtonDblClk(pmf->wParam,point);
1632 OnMouseWheel(LOWORD(pmf->wParam),HIWORD(pmf->wParam),point);
1659 LRESULT CCommentListWindow::OnCalcSellSize(LPNMHDR lParam){
1661 auto pReqResize = reinterpret_cast <REQRESIZE *>(lParam);
1662 ::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);