Commit 70c3e886d93e62fa27c89a61c37c94c8a1f533ac

Authored by liuye
1 parent c22bc376

feat<central_clearing_system>:基本完成下单流程开发

central_clearing_system/ETradeClient.rc
... ... @@ -203,7 +203,7 @@ BEGIN
203 203 CONTROL "新中新电子读卡器",IDC_RADIO_XINZHONGXIN,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,174,186,71,10
204 204 END
205 205  
206   -IDD_DIALOG_PLACE_ORDER DIALOGEX 0, 0, 338, 238
  206 +IDD_DIALOG_PLACE_ORDER DIALOGEX 0, 0, 342, 238
207 207 STYLE DS_SYSMODAL | DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
208 208 CAPTION "结算下单"
209 209 FONT 12, "微软雅黑", 400, 0, 0x86
... ... @@ -212,7 +212,6 @@ BEGIN
212 212 LTEXT "货 主",IDC_STATIC_OWNER,1,19,25,14
213 213 EDITTEXT IDC_EDIT_NAME,91,18,44,14,ES_MULTILINE | ES_AUTOHSCROLL
214 214 LTEXT "商 品",IDC_STATIC_COMM,2,33,26,12
215   - EDITTEXT IDC_EDIT_CARD,29,18,53,15,ES_MULTILINE | ES_AUTOHSCROLL
216 215 EDITTEXT IDC_EDIT_COMM_NUM,29,36,53,15,ES_MULTILINE | ES_AUTOHSCROLL
217 216 EDITTEXT IDC_EDIT_COMM_NAME,92,37,44,13,ES_MULTILINE | ES_AUTOHSCROLL
218 217 LTEXT "单 位",IDC_STATIC_UNIT,1,54,26,12
... ... @@ -224,10 +223,29 @@ BEGIN
224 223 EDITTEXT IDC_EDIT_PRICE,30,70,53,15,ES_MULTILINE | ES_AUTOHSCROLL
225 224 LTEXT "数 量",IDC_STATIC_COUNT,92,70,30,14
226 225 EDITTEXT IDC_EDIT_COUNT,114,69,44,13,ES_MULTILINE | ES_AUTOHSCROLL
227   - PUSHBUTTON "去支付(&S)",IDC_BUTTON_PAY,284,10,50,14
228   - LTEXT "合计:",IDC_STATIC_HEJI,246,227,20,8
  226 + LTEXT "交易金额:",IDC_STATIC_HEJI,246,227,33,8
229 227 LTEXT "",IDC_STATIC_TOTAL_MONEY,289,227,8,8
230 228 LTEXT "",IDC_STATIC_ERROR,262,67,8,8
  229 + LTEXT "买 家",IDC_STATIC_BUYER,170,40,25,14
  230 + EDITTEXT IDC_EDIT_BUYER_NAME,260,39,44,14,ES_MULTILINE | ES_AUTOHSCROLL
  231 + EDITTEXT IDC_EDIT_BUYER_CARD,198,39,53,15,ES_MULTILINE | ES_AUTOHSCROLL
  232 + EDITTEXT IDC_EDIT_CARD,29,18,53,15,ES_MULTILINE | ES_AUTOHSCROLL
  233 + PUSHBUTTON "去支付(&S)",IDC_BUTTON_PAY,287,10,50,14
  234 + PUSHBUTTON "买家刷卡(F11)",IDC_BUTTON_SWIP_CARD,287,53,50,14
  235 +END
  236 +
  237 +IDD_DIALOG_PAY DIALOGEX 0, 0, 229, 119
  238 +STYLE DS_SETFONT | WS_POPUP | WS_BORDER | WS_SYSMENU
  239 +FONT 12, "微软雅黑", 400, 0, 0x0
  240 +BEGIN
  241 + LTEXT "总计金额:",IDC_PAY_STATIC_TOTAL_MONEY,18,20,41,8
  242 + LTEXT "",IDC_PAY_STATIC_MONEY,73,20,8,8
  243 + LTEXT "密 码:",IDC_PAY_STATIC_PASSWORD,18,50,31,8
  244 + EDITTEXT IDC_PAY_EDIT_PASSWORD,56,46,40,14,ES_MULTILINE | ES_AUTOHSCROLL
  245 + PUSHBUTTON "输入密码(&A)",IDC_PAY_BUTTON_PASSWORD,151,51,71,18
  246 + PUSHBUTTON "关闭(&S)",IDC_PAY_BUTTON_CLOSE,155,95,67,17
  247 + PUSHBUTTON "付款(&F)",IDC_PAY_BUTTON_PAY,72,95,67,17
  248 + LTEXT "",IDC_PAY_STATIC_REAL_MONEY,65,20,57,8
231 249 END
232 250  
233 251  
... ... @@ -302,9 +320,18 @@ BEGIN
302 320 IDD_DIALOG_PLACE_ORDER, DIALOG
303 321 BEGIN
304 322 MOCKUP, 1, 50, -25, -30, "C:\Users\WangGY\Desktop\TIM图片20180918183513.png"
305   - RIGHTMARGIN, 334
  323 + RIGHTMARGIN, 337
306 324 HORZGUIDE, 67
307 325 END
  326 +
  327 + IDD_DIALOG_PAY, DIALOG
  328 + BEGIN
  329 + MOCKUP, 1, 50, -5, -34, "C:\Users\WangGY\Desktop\无标题.png"
  330 + LEFTMARGIN, 7
  331 + RIGHTMARGIN, 222
  332 + TOPMARGIN, 7
  333 + BOTTOMMARGIN, 112
  334 + END
308 335 END
309 336 #endif // APSTUDIO_INVOKED
310 337  
... ...
central_clearing_system/ETradeClient.vcxproj
... ... @@ -141,6 +141,8 @@
141 141 <ClInclude Include="ETradeClient\mfc_ui\LoginDialog.h" />
142 142 <ClInclude Include="ETradeClient\mfc_ui\LoginEdit.h" />
143 143 <ClInclude Include="ETradeClient\mfc_ui\MainFrm.h" />
  144 + <ClInclude Include="ETradeClient\mfc_ui\MemDC.h" />
  145 + <ClInclude Include="ETradeClient\mfc_ui\pay_dlg.h" />
144 146 <ClInclude Include="ETradeClient\mfc_ui\place_order_dlg.h" />
145 147 <ClInclude Include="ETradeClient\mfc_ui\PopupBrowserDlgView.h" />
146 148 <ClInclude Include="ETradeClient\mfc_ui\ConfigDialog.h" />
... ... @@ -190,6 +192,7 @@
190 192 <ClCompile Include="ETradeClient\mfc_ui\LoginDialog.cpp" />
191 193 <ClCompile Include="ETradeClient\mfc_ui\LoginEdit.cpp" />
192 194 <ClCompile Include="ETradeClient\mfc_ui\MainFrm.cpp" />
  195 + <ClCompile Include="ETradeClient\mfc_ui\pay_dlg.cpp" />
193 196 <ClCompile Include="ETradeClient\mfc_ui\place_order_dlg.cpp" />
194 197 <ClCompile Include="ETradeClient\mfc_ui\PopupBrowserDlgView.cpp" />
195 198 <ClCompile Include="ETradeClient\mfc_ui\ConfigDialog.cpp" />
... ...
central_clearing_system/ETradeClient.vcxproj.filters
... ... @@ -210,6 +210,12 @@
210 210 <ClInclude Include="ETradeClient\mfc_ui\etrade_edit_control.h">
211 211 <Filter>Header Files\mfc_ui</Filter>
212 212 </ClInclude>
  213 + <ClInclude Include="ETradeClient\mfc_ui\MemDC.h">
  214 + <Filter>Header Files\mfc_ui</Filter>
  215 + </ClInclude>
  216 + <ClInclude Include="ETradeClient\mfc_ui\pay_dlg.h">
  217 + <Filter>Header Files</Filter>
  218 + </ClInclude>
213 219 </ItemGroup>
214 220 <ItemGroup>
215 221 <ClCompile Include="stdafx.cpp">
... ... @@ -338,6 +344,9 @@
338 344 <ClCompile Include="ETradeClient\mfc_ui\etrade_edit_control.cpp">
339 345 <Filter>Source Files\mfc_ui</Filter>
340 346 </ClCompile>
  347 + <ClCompile Include="ETradeClient\mfc_ui\pay_dlg.cpp">
  348 + <Filter>Source Files</Filter>
  349 + </ClCompile>
341 350 </ItemGroup>
342 351 <ItemGroup>
343 352 <ResourceCompile Include="ETradeClient.rc">
... ...
central_clearing_system/ETradeClient/mfc_ui/GridCell.cpp
... ... @@ -5,8 +5,8 @@
5 5 // Provides the implementation for the "default" cell type of the
6 6 // grid control. Adds in cell editing.
7 7 //
8   -// Written by Chris Maunder <chris@codeproject.com>
9   -// Copyright (c) 1998-2005. All Rights Reserved.
  8 +// Written by Chris Maunder <cmaunder@mail.com>
  9 +// Copyright (c) 1998-2002. All Rights Reserved.
10 10 //
11 11 // This code may be used in compiled form in any way you desire. This
12 12 // file may be redistributed unmodified by any means PROVIDING it is
... ... @@ -60,8 +60,9 @@ CGridCell::~CGridCell()
60 60  
61 61 /////////////////////////////////////////////////////////////////////////////
62 62 // GridCell Attributes
63   -
64   -void CGridCell::operator=(const CGridCell& cell)
  63 +//Used for merge cells,remove const
  64 +//by Huang Wei
  65 +void CGridCell::operator=( CGridCell& cell)
65 66 {
66 67 if (this != &cell) CGridCellBase::operator=(cell);
67 68 }
... ... @@ -72,7 +73,6 @@ void CGridCell::Reset()
72 73  
73 74 m_strText.Empty();
74 75 m_nImage = -1;
75   - m_lParam = NULL; // BUG FIX J. Bloggs 20/10/03
76 76 m_pGrid = NULL;
77 77 m_bEditing = FALSE;
78 78 m_pEditWnd = NULL;
... ... @@ -223,28 +223,9 @@ CGridDefaultCell::CGridDefaultCell()
223 223 GetObject(GetStockObject(SYSTEM_FONT), sizeof(LOGFONT), &lf);
224 224 SetFont(&lf);
225 225 #else // not CE
226   -
227 226 NONCLIENTMETRICS ncm;
228   -#if defined(_MSC_VER) && (_MSC_VER < 1300)
229   - ncm.cbSize = sizeof(NONCLIENTMETRICS); // NONCLIENTMETRICS has an extra element after VC6
230   -#else
231   - // Check the operating system's version
232   - OSVERSIONINFOEX osvi;
233   - ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
234   - osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
235   - if( !GetVersionEx((OSVERSIONINFO *) &osvi))
236   - {
237   - osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
238   - GetVersionEx ((OSVERSIONINFO *)&osvi);
239   - }
240   -
241   - if (osvi.dwMajorVersion > 5)
242   - ncm.cbSize = sizeof(NONCLIENTMETRICS);
243   - else
244   - ncm.cbSize = sizeof(NONCLIENTMETRICS) - sizeof(ncm.iPaddedBorderWidth);
245   -#endif
  227 + ncm.cbSize = sizeof(NONCLIENTMETRICS);
246 228 VERIFY(SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0));
247   -
248 229 SetFont(&(ncm.lfMessageFont));
249 230 #endif
250 231 }
... ...
central_clearing_system/ETradeClient/mfc_ui/GridCell.h
... ... @@ -3,8 +3,8 @@
3 3 //
4 4 // MFC Grid Control - Grid cell class header file
5 5 //
6   -// Written by Chris Maunder <chris@codeproject.com>
7   -// Copyright (c) 1998-2005. All Rights Reserved.
  6 +// Written by Chris Maunder <cmaunder@mail.com>
  7 +// Copyright (c) 1998-2002. All Rights Reserved.
8 8 //
9 9 // This code may be used in compiled form in any way you desire. This
10 10 // file may be redistributed unmodified by any means PROVIDING it is
... ... @@ -48,7 +48,7 @@ public:
48 48  
49 49 // Attributes
50 50 public:
51   - void operator=(const CGridCell& cell);
  51 + void operator=( CGridCell& cell);
52 52  
53 53 virtual void SetText(LPCTSTR szText) { m_strText = szText; }
54 54 virtual void SetImage(int nImage) { m_nImage = nImage; }
... ...
central_clearing_system/ETradeClient/mfc_ui/GridCellBase.cpp
... ... @@ -7,8 +7,8 @@
7 7 // implementations of drawing, printingetc provided. MUST be derived
8 8 // from to be used.
9 9 //
10   -// Written by Chris Maunder <chris@codeproject.com>
11   -// Copyright (c) 1998-2005. All Rights Reserved.
  10 +// Written by Chris Maunder <cmaunder@mail.com>
  11 +// Copyright (c) 1998-2002. All Rights Reserved.
12 12 //
13 13 // This code may be used in compiled form in any way you desire. This
14 14 // file may be redistributed unmodified by any means PROVIDING it is
... ... @@ -30,7 +30,6 @@
30 30 // C Maunder - 29 Aug 2000 - operator= checks for NULL font before setting (Martin Richter)
31 31 // C Maunder - 15 Oct 2000 - GetTextExtent fixed (Martin Richter)
32 32 // C Maunder - 1 Jan 2001 - Added ValidateEdit
33   -// Yogurt - 13 Mar 2004 - GetCellExtent fixed
34 33 //
35 34 // NOTES: Each grid cell should take care of it's own drawing, though the Draw()
36 35 // method takes an "erase background" paramter that is called if the grid
... ... @@ -71,10 +70,19 @@ CGridCellBase::~CGridCellBase()
71 70  
72 71 void CGridCellBase::Reset()
73 72 {
  73 + m_Hide=false;
74 74 m_nState = 0;
  75 + m_MergeRange.Set();
  76 + m_IsMergeWithOthers=false;
  77 + m_MergeCellID.row=-1;
  78 + m_MergeCellID.col=-1;
  79 +
  80 +
75 81 }
  82 +//Used for merge cells,remove const
  83 +//by Huang Wei
76 84  
77   -void CGridCellBase::operator=(const CGridCellBase& cell)
  85 +void CGridCellBase::operator=( CGridCellBase& cell)
78 86 {
79 87 if (this == &cell) return;
80 88  
... ... @@ -89,6 +97,11 @@ void CGridCellBase::operator=(const CGridCellBase&amp; cell)
89 97 SetBackClr(cell.GetBackClr());
90 98 SetFont(cell.IsDefaultFont()? NULL : cell.GetFont());
91 99 SetMargin(cell.GetMargin());
  100 +//Used for merge cells
  101 +//by Huang Wei
  102 + SetMergeCellID(cell.GetMergeCellID());
  103 + SetMergeRange(cell.GetMergeRange());
  104 + Show(cell.IsShow());
92 105 }
93 106  
94 107 /////////////////////////////////////////////////////////////////////////////
... ... @@ -115,6 +128,14 @@ BOOL CGridCellBase::Draw(CDC* pDC, int nRow, int nCol, CRect rect, BOOL bEraseB
115 128 // Note - all through this function we totally brutalise 'rect'. Do not
116 129 // depend on it's value being that which was passed in.
117 130  
  131 + //Used for merge cells
  132 + //by Huang Wei
  133 + if( m_Hide && !IsMerged())
  134 + {
  135 + return TRUE;
  136 + }
  137 +
  138 +
118 139 CGridCtrl* pGrid = GetGrid();
119 140 ASSERT(pGrid);
120 141  
... ... @@ -206,7 +227,7 @@ BOOL CGridCellBase::Draw(CDC* pDC, int nRow, int nCol, CRect rect, BOOL bEraseB
206 227 rect.bottom--;
207 228 }
208 229  
209   - //rect.DeflateRect(0,1,1,1); - Removed by Yogurt
  230 + rect.DeflateRect(0,1,1,1);
210 231 }
211 232 else if ((GetState() & GVIS_SELECTED))
212 233 {
... ... @@ -277,10 +298,7 @@ BOOL CGridCellBase::Draw(CDC* pDC, int nRow, int nCol, CRect rect, BOOL bEraseB
277 298 pDC->SelectObject(pFont);
278 299 }
279 300  
280   - //rect.DeflateRect(GetMargin(), 0); - changed by Yogurt
281   - rect.DeflateRect(GetMargin(), GetMargin());
282   - rect.right++;
283   - rect.bottom++;
  301 + rect.DeflateRect(GetMargin(), 0);
284 302  
285 303 if (pGrid->GetImageList() && GetImage() >= 0)
286 304 {
... ... @@ -296,21 +314,14 @@ BOOL CGridCellBase::Draw(CDC* pDC, int nRow, int nCol, CRect rect, BOOL bEraseB
296 314 // pDC->SelectClipRgn(&rgn);
297 315 // rgn.DeleteObject();
298 316  
299   - /*
300   - // removed by Yogurt
301 317 int nImageWidth = Info.rcImage.right-Info.rcImage.left+1;
302 318 int nImageHeight = Info.rcImage.bottom-Info.rcImage.top+1;
  319 +
303 320 if( nImageWidth + rect.left <= rect.right + (int)(2*GetMargin())
304 321 && nImageHeight + rect.top <= rect.bottom + (int)(2*GetMargin()) )
305 322 {
306 323 pGrid->GetImageList()->Draw(pDC, GetImage(), rect.TopLeft(), ILD_NORMAL);
307 324 }
308   - */
309   - // Added by Yogurt
310   - int nImageWidth = Info.rcImage.right-Info.rcImage.left;
311   - int nImageHeight = Info.rcImage.bottom-Info.rcImage.top;
312   - if ((nImageWidth + rect.left <= rect.right) && (nImageHeight + rect.top <= rect.bottom))
313   - pGrid->GetImageList()->Draw(pDC, GetImage(), rect.TopLeft(), ILD_NORMAL);
314 325  
315 326 //rect.left += nImageWidth+GetMargin();
316 327 }
... ... @@ -336,8 +347,7 @@ BOOL CGridCellBase::Draw(CDC* pDC, int nRow, int nCol, CRect rect, BOOL bEraseB
336 347 BOOL bVertical = (GetFont()->lfEscapement == 900);
337 348  
338 349 // Only draw if it'll fit!
339   - //if (size.cx + rect.left < rect.right + (int)(2*GetMargin())) - changed / Yogurt
340   - if (size.cx + rect.left < rect.right)
  350 + if (size.cx + rect.left < rect.right + (int)(2*GetMargin()))
341 351 {
342 352 int nTriangleBase = rect.bottom - nOffset - size.cy; // Triangle bottom right
343 353 //int nTriangleBase = (rect.top + rect.bottom - size.cy)/2; // Triangle middle right
... ... @@ -395,9 +405,6 @@ BOOL CGridCellBase::Draw(CDC* pDC, int nRow, int nCol, CRect rect, BOOL bEraseB
395 405  
396 406 // We want to see '&' characters so use DT_NOPREFIX
397 407 GetTextRect(rect);
398   - rect.right++;
399   - rect.bottom++;
400   -
401 408 DrawText(pDC->m_hDC, GetText(), -1, rect, GetFormat() | DT_NOPREFIX);
402 409  
403 410 pDC->RestoreDC(nSavedDC);
... ... @@ -547,17 +554,16 @@ CSize CGridCellBase::GetTextExtent(LPCTSTR szText, CDC* pDC /*= NULL*/)
547 554 size = rect.Size();
548 555 }
549 556 else
550   - size = pDC->GetTextExtent(szText, (int)_tcslen(szText));
  557 + size = pDC->GetTextExtent(szText, _tcslen(szText));
551 558  
552   - // Removed by Yogurt
553   - //TEXTMETRIC tm;
554   - //pDC->GetTextMetrics(&tm);
555   - //size.cx += (tm.tmOverhang);
  559 + TEXTMETRIC tm;
  560 + pDC->GetTextMetrics(&tm);
  561 + size.cx += (tm.tmOverhang);
556 562  
557 563 if (pOldFont)
558 564 pDC->SelectObject(pOldFont);
559 565  
560   - size += CSize(2*GetMargin(), 2*GetMargin());
  566 + size += CSize(4*GetMargin(), 2*GetMargin());
561 567  
562 568 // Kludge for vertical text
563 569 LOGFONT *pLF = GetFont();
... ... @@ -575,41 +581,40 @@ CSize CGridCellBase::GetTextExtent(LPCTSTR szText, CDC* pDC /*= NULL*/)
575 581 return size;
576 582 }
577 583  
578   -
579 584 CSize CGridCellBase::GetCellExtent(CDC* pDC)
580   -{
581   - CSize size = GetTextExtent(GetText(), pDC);
582   - CSize ImageSize(0,0);
  585 +{
  586 + CSize size = GetTextExtent(GetText(), pDC);
  587 + CSize ImageSize(0,0);
  588 +
  589 + int nImage = GetImage();
  590 + if (nImage >= 0)
  591 + {
  592 + CGridCtrl* pGrid = GetGrid();
  593 + ASSERT(pGrid);
  594 +
  595 + if (pGrid->GetImageList())
  596 + {
  597 + IMAGEINFO Info;
  598 + if (pGrid->GetImageList()->GetImageInfo(nImage, &Info))
  599 + ImageSize = CSize(Info.rcImage.right-Info.rcImage.left+1,
  600 + Info.rcImage.bottom-Info.rcImage.top+1);
  601 + }
  602 + }
583 603  
584   - int nImage = GetImage();
585   - if (nImage >= 0)
586   - {
587   - CGridCtrl* pGrid = GetGrid();
588   - ASSERT(pGrid);
589   - IMAGEINFO Info;
590   - if (pGrid->GetImageList() && pGrid->GetImageList()->GetImageInfo(nImage, &Info))
591   - {
592   - ImageSize = CSize(Info.rcImage.right-Info.rcImage.left,
593   - Info.rcImage.bottom-Info.rcImage.top);
594   - if (size.cx > 2*(int)GetMargin ())
595   - ImageSize.cx += GetMargin();
596   - ImageSize.cy += 2*(int)GetMargin ();
597   - }
598   - }
599   - size.cx += ImageSize.cx + 1;
600   - size.cy = max(size.cy, ImageSize.cy) + 1;
601   - if (IsFixed())
602   - {
603   - size.cx++;
604   - size.cy++;
605   - }
606   - return size;
  604 + return CSize(size.cx + ImageSize.cx, max(size.cy, ImageSize.cy));
607 605 }
608 606  
609 607 // EFW - Added to print cells so that grids that use different colors are
610 608 // printed correctly.
611 609 BOOL CGridCellBase::PrintCell(CDC* pDC, int /*nRow*/, int /*nCol*/, CRect rect)
612 610 {
  611 + //Used for merge cells
  612 + //by Huang Wei
  613 + if( m_Hide && !IsMerged())
  614 + {
  615 + return TRUE;
  616 + }
  617 +
613 618 #if defined(_WIN32_WCE_NO_PRINTING) || defined(GRIDCONTROL_NO_PRINTING)
614 619 return FALSE;
615 620 #else
... ... @@ -627,6 +632,11 @@ BOOL CGridCellBase::PrintCell(CDC* pDC, int /*nRow*/, int /*nCol*/, CRect rect)
627 632 int nSavedDC = pDC->SaveDC();
628 633  
629 634 pDC->SetBkMode(TRANSPARENT);
  635 + //Used for merge cells
  636 + //by Huang Wei
  637 + rect.InflateRect(1,1);
  638 + pDC->Rectangle(rect);
  639 + rect.DeflateRect(1,1);
630 640  
631 641 if (pGrid->GetShadedPrintOut())
632 642 {
... ... @@ -729,6 +739,11 @@ BOOL CGridCellBase::PrintCell(CDC* pDC, int /*nRow*/, int /*nCol*/, CRect rect)
729 739 rect.DeflateRect(1,1);
730 740 pDC->SelectObject(pOldPen);
731 741 }
  742 + else
  743 + {
  744 +// pDC->Rectangle(rect);
  745 +
  746 + }
732 747  
733 748 rect.DeflateRect(GetMargin(), 0);
734 749  
... ... @@ -751,6 +766,7 @@ BOOL CGridCellBase::PrintCell(CDC* pDC, int /*nRow*/, int /*nCol*/, CRect rect)
751 766  
752 767 // Draw without clipping so as not to lose text when printed for real
753 768 // DT_NOCLIP removed 01.01.01. Slower, but who cares - we are printing!
  769 +
754 770 DrawText(pDC->m_hDC, GetText(), -1, rect,
755 771 GetFormat() | /*DT_NOCLIP | */ DT_NOPREFIX);
756 772  
... ... @@ -770,4 +786,67 @@ LRESULT CGridCellBase::SendMessageToParent(int nRow, int nCol, int nMessage)
770 786 return pGrid->SendMessageToParent(nRow, nCol, nMessage);
771 787 else
772 788 return 0;
773   -}
774 789 \ No newline at end of file
  790 +}
  791 +//Used for merge cells
  792 +//by Huang Wei
  793 +void CGridCellBase::Show(bool IsShow)
  794 +{
  795 + m_Hide=!IsShow;
  796 +}
  797 +//Used for merge cells
  798 +//by Huang Wei
  799 +void CGridCellBase::SetMergeRange(CCellRange range)
  800 +{
  801 + m_MergeRange=range;
  802 +}
  803 +//Used for merge cells
  804 +//by Huang Wei
  805 +CCellRange CGridCellBase::GetMergeRange()
  806 +{
  807 + return m_MergeRange;
  808 +}
  809 +//Used for merge cells
  810 +//by Huang Wei
  811 +bool CGridCellBase::IsMerged()
  812 +{
  813 + return m_MergeRange.Count()>1;
  814 +}
  815 +//Used for merge cells
  816 +//by Huang Wei
  817 +void CGridCellBase::SetMergeCellID(CCellID cell)
  818 +{
  819 + m_MergeCellID=cell;
  820 + if(cell.row!=-1)
  821 + m_IsMergeWithOthers=true;
  822 + else
  823 + m_IsMergeWithOthers=false;
  824 +
  825 +}
  826 +//Used for merge cells
  827 +//by Huang Wei
  828 +CCellID CGridCellBase::GetMergeCellID()
  829 +{
  830 + return m_MergeCellID;
  831 +}
  832 +//Used for merge cells
  833 +//by Huang Wei
  834 +bool CGridCellBase::IsMergeWithOthers()
  835 +{
  836 + return m_IsMergeWithOthers;
  837 +}
  838 +//Used for merge cells
  839 +//by Huang Wei
  840 +bool CGridCellBase::IsShow()
  841 +{
  842 + return !m_Hide;
  843 +}
  844 +//Used for merge cells
  845 +//by Huang Wei
  846 +void CGridCellBase::UnMerge()
  847 +{
  848 + m_Hide=false;
  849 + m_MergeRange.Set();
  850 + m_IsMergeWithOthers=false;
  851 + m_MergeCellID.row=-1;
  852 + m_MergeCellID.col=-1;
  853 +}
... ...
central_clearing_system/ETradeClient/mfc_ui/GridCellBase.h
... ... @@ -3,8 +3,8 @@
3 3 //
4 4 // MFC Grid Control - Grid cell base class header file
5 5 //
6   -// Written by Chris Maunder <chris@codeproject.com>
7   -// Copyright (c) 1998-2005. All Rights Reserved.
  6 +// Written by Chris Maunder <cmaunder@mail.com>
  7 +// Copyright (c) 1998-2002. All Rights Reserved.
8 8 //
9 9 // This code may be used in compiled form in any way you desire. This
10 10 // file may be redistributed unmodified by any means PROVIDING it is
... ... @@ -25,6 +25,7 @@
25 25 #if !defined(AFX_GRIDCELLBASE_H__519FA702_722C_11D1_ABBA_00A0243D1382__INCLUDED_)
26 26 #define AFX_GRIDCELLBASE_H__519FA702_722C_11D1_ABBA_00A0243D1382__INCLUDED_
27 27  
  28 +#include "CellRange.h" // Added by ClassView
28 29 #if _MSC_VER >= 1000
29 30 #pragma once
30 31 #endif // _MSC_VER >= 1000
... ... @@ -127,10 +128,13 @@ public:
127 128  
128 129 // Operators
129 130 public:
130   - virtual void operator=(const CGridCellBase& cell);
  131 + virtual void operator=( CGridCellBase& cell);
131 132  
132 133 // Operations
133 134 public:
  135 + bool IsMerged();
  136 + void SetMergeRange(CCellRange range);
  137 + void Show(bool IsShow);
134 138 virtual void Reset();
135 139  
136 140 virtual BOOL Draw(CDC* pDC, int nRow, int nCol, CRect rect, BOOL bEraseBkgnd = TRUE);
... ... @@ -162,8 +166,20 @@ protected:
162 166 virtual void OnDblClick( CPoint PointCellRelative);
163 167 virtual BOOL OnSetCursor();
164 168  
  169 +public:
  170 + void UnMerge();
  171 + virtual bool IsShow() ;
  172 + virtual CCellRange GetMergeRange();
  173 + virtual bool IsMergeWithOthers();
  174 + virtual CCellID GetMergeCellID();
  175 + virtual void SetMergeCellID(CCellID cell);
165 176 protected:
166 177 DWORD m_nState; // Cell state (selected/focus etc)
  178 +private:
  179 + CCellRange m_MergeRange;
  180 + bool m_IsMergeWithOthers;
  181 + CCellID m_MergeCellID;
  182 + bool m_Hide;
167 183 };
168 184  
169 185 //{{AFX_INSERT_LOCATION}}
... ...
central_clearing_system/ETradeClient/mfc_ui/GridCtrl.cpp
1 1 // GridCtrl.cpp : implementation file
2 2 //
3   -// MFC Grid Control v2.26
  3 +// MFC Grid Control v2.24
  4 +//
  5 +// Written by Chris Maunder <cmaunder@mail.com>
  6 +// Copyright (c) 1998-2002. All Rights Reserved.
4 7 //
5   -// Written by Chris Maunder <chris@codeproject.com>
6   -// Copyright (c) 1998-2005. All Rights Reserved.
7   -/
8 8 // The code contained in this file was based on the original
9 9 // WorldCom Grid control written by Joe Willcoxson,
10 10 // mailto:chinajoe@aol.com
... ... @@ -94,25 +94,18 @@
94 94 // - WS_EX_CLIENTEDGE style now implicit
95 95 //
96 96 // [ Only the latest version and major version changes will be shown ]
97   -////
98   -// 2.25 13 Mar 2004 - Chris Maunder
99   -// - Minor changes so it will compile in VS.NET (inc. Whidbey)
100   -// - Fixed minor bug in EnsureVisible - Junlin Xu
101   -// - Changed AfxGetInstanceHandle for AfxGetResourceHandle in RegisterWindowClass
102   -// - Various changes thanks to Yogurt
103 97 //
104   -// 2.26 13 Dec 2005 - Pierre Couderc
105   -// - Added sort in Virtual mode
106   -// - Change row/column order programatically or via drag and drop
107   -// - Added save/restore layer (for undoing row/column order changes)
  98 +// 2.24 13 Jul 2002 - Chris Maunder
  99 +// - Optimised OnDraw for invisible cells.
108 100 //
109 101 // TODO: 1) Implement sparse grids (super easy now)
110 102 // 2) Fix it so that as you drag select, the speed of selection increases
111 103 // with time.
112 104 // 3) Scrolling is still a little dodgy (too much grey area). I know there
113 105 // is a simple fix but it's been a low priority
  106 +// 4) Get some sleep
114 107 //
115   -// ISSUES: 1) WindowFromPoint seems to do weird things in W2K. Causing problems for
  108 +// ISSUES: 2) WindowFromPoint seems to do weird things in W2K. Causing problems for
116 109 // the rigt-click-on-titletip code.
117 110 //
118 111 /////////////////////////////////////////////////////////////////////////////
... ... @@ -120,7 +113,6 @@
120 113 #include "stdafx.h"
121 114 #include "MemDC.h"
122 115 #include "GridCtrl.h"
123   -#include <algorithm>
124 116  
125 117 // OLE stuff for clipboard operations
126 118 #include <afxadv.h> // For CSharedFile
... ... @@ -215,7 +207,6 @@ CGridCtrl::CGridCtrl(int nRows, int nCols, int nFixedRows, int nFixedCols)
215 207 m_nCols = 0;
216 208 m_nFixedRows = 0;
217 209 m_nFixedCols = 0;
218   - m_InDestructor = false;
219 210  
220 211 m_bVirtualMode = FALSE;
221 212 m_pfnCallback = NULL;
... ... @@ -259,7 +250,7 @@ CGridCtrl::CGridCtrl(int nRows, int nCols, int nFixedRows, int nFixedCols)
259 250 m_bAscending = TRUE; // sorting stuff
260 251 m_nSortColumn = -1;
261 252 m_pfnCompare = NULL;
262   - m_pfnVirtualCompare = NULL;
  253 +
263 254 m_nAutoSizeColumnStyle = GVS_BOTH; // Autosize grid using header and data info
264 255  
265 256 m_nTimerID = 0; // For drag-selection
... ... @@ -271,10 +262,7 @@ CGridCtrl::CGridCtrl(int nRows, int nCols, int nFixedRows, int nFixedCols)
271 262 m_bAllowDragAndDrop = FALSE; // for drag and drop - EFW - off by default
272 263 m_bTrackFocusCell = TRUE; // Track Focus cell?
273 264 m_bFrameFocus = TRUE; // Frame the selected cell?
274   - m_AllowReorderColumn = false;
275   - m_QuitFocusOnTab = false;
276   - m_AllowSelectRowInFixedCol = false;
277   - m_bDragRowMode = TRUE; // allow to drop a line over another one to change row order
  265 +
278 266 m_pRtcDefault = RUNTIME_CLASS(CGridCell);
279 267  
280 268 SetupDefaultCells();
... ... @@ -303,7 +291,6 @@ CGridCtrl::CGridCtrl(int nRows, int nCols, int nFixedRows, int nFixedCols)
303 291  
304 292 CGridCtrl::~CGridCtrl()
305 293 {
306   - m_InDestructor = true;
307 294 DeleteAllItems();
308 295  
309 296 #ifndef GRIDCONTROL_NO_TITLETIPS
... ... @@ -325,8 +312,8 @@ CGridCtrl::~CGridCtrl()
325 312 BOOL CGridCtrl::RegisterWindowClass()
326 313 {
327 314 WNDCLASS wndcls;
328   - //HINSTANCE hInst = AfxGetInstanceHandle();
329   - HINSTANCE hInst = AfxGetResourceHandle();
  315 + HINSTANCE hInst = AfxGetInstanceHandle();
  316 + //HINSTANCE hInst = AfxGetResourceHandle();
330 317  
331 318 if (!(::GetClassInfo(hInst, GRIDCTRL_CLASSNAME, &wndcls)))
332 319 {
... ... @@ -429,9 +416,6 @@ BOOL CGridCtrl::Create(const RECT&amp; rect, CWnd* pParentWnd, UINT nID, DWORD dwSty
429 416 return TRUE;
430 417 }
431 418  
432   -
433   -
434   -
435 419 void CGridCtrl::SetupDefaultCells()
436 420 {
437 421 m_cellDefault.SetGrid(this); // Normal editable cell
... ... @@ -523,42 +507,6 @@ LRESULT CGridCtrl::SendCacheHintToParent(const CCellRange&amp; range) const
523 507 return 0;
524 508 }
525 509  
526   -#define LAYER_SIGNATURE (0x5FD4E64)
527   -int CGridCtrl::GetLayer(int** pLayer) // used to save and restore order of columns
528   -{ // gives back the size of the area (do not forget to delete pLayer)
529   - int Length = 2+GetColumnCount()*2;
530   - int *Layer = new int[Length]; // the caller is supposed to delete it
531   - Layer[0]= LAYER_SIGNATURE;
532   - Layer[1]= GetColumnCount();
533   - memcpy(&Layer[2], &m_arColOrder[0], GetColumnCount()*sizeof(int));
534   - memcpy(&Layer[2+GetColumnCount()], &m_arColWidths[0], GetColumnCount()*sizeof(int));
535   - *pLayer = Layer;
536   - return Length;
537   -}
538   -void CGridCtrl::SetLayer(int* pLayer)
539   -{ // coming from a previous GetLayer (ignored if not same number of column, or the same revision number)
540   - if(pLayer[0] != LAYER_SIGNATURE) return;
541   - if(pLayer[1] != GetColumnCount()) return;
542   -/* TRACE(" %d == %d \n",m_arColOrder[0],pLayer[2]);
543   - TRACE(" %d == %d \n",m_arColOrder[1],pLayer[3]);
544   - TRACE(" %d == %d \n",m_arColOrder[2],pLayer[4]);
545   - TRACE(" %d == %d \n",m_arColWidths[0],pLayer[2+3]);
546   - TRACE(" %d == %d \n",m_arColWidths[1],pLayer[3+3]);
547   - TRACE(" %d == %d \n",m_arColWidths[2],pLayer[4+3]);
548   - TRACE(" %d == %d \n",GetColumnCount(),3);
549   -
550   -
551   - ASSERT(m_arColOrder[0]==pLayer[2]);
552   - ASSERT(m_arColOrder[1]==pLayer[3]);
553   - ASSERT(m_arColOrder[2]==pLayer[4]);
554   - ASSERT(m_arColWidths[0]==pLayer[2+3]);
555   - ASSERT(m_arColWidths[1]==pLayer[3+3]);
556   - ASSERT(m_arColWidths[2]==pLayer[4+3]);
557   - ASSERT(GetColumnCount()==3);
558   -*/ memcpy(&m_arColOrder[0],&pLayer[2], GetColumnCount()*sizeof(int));
559   - memcpy(&m_arColWidths[0],&pLayer[2+GetColumnCount()], GetColumnCount()*sizeof(int));
560   -}
561   -
562 510 BEGIN_MESSAGE_MAP(CGridCtrl, CWnd)
563 511 //EFW - Added ON_WM_RBUTTONUP
564 512 //{{AFX_MSG_MAP(CGridCtrl)
... ... @@ -672,8 +620,8 @@ void CGridCtrl::EraseBkgnd(CDC* pDC)
672 620 // Draw non-fixed cell background
673 621 if (rect.IntersectRect(VisRect, ClipRect))
674 622 {
675   - CRect CellRect(__max(nFixedColumnWidth, rect.left),
676   - __max(nFixedRowHeight, rect.top),
  623 + CRect CellRect(max(nFixedColumnWidth, rect.left),
  624 + max(nFixedRowHeight, rect.top),
677 625 rect.right, rect.bottom);
678 626 pDC->FillRect(CellRect, &TextBack);
679 627 }
... ... @@ -910,6 +858,7 @@ void CGridCtrl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
910 858 CWnd::OnKeyDown(nChar, nRepCnt, nFlags);
911 859 return;
912 860 }
  861 +
913 862 CCellID next = m_idCurrentCell;
914 863 BOOL bChangeLine = FALSE;
915 864 BOOL bHorzScrollAction = FALSE;
... ... @@ -922,10 +871,6 @@ void CGridCtrl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
922 871 case 'A':
923 872 OnEditSelectAll();
924 873 break;
925   - case 'k': // This is ctrl+ on french keyboard, may need to be better processed for other locales
926   - AutoSizeColumns();
927   - Invalidate();
928   - break;
929 874 #ifndef GRIDCONTROL_NO_CLIPBOARD
930 875 case 'X':
931 876 OnEditCut();
... ... @@ -991,13 +936,6 @@ void CGridCtrl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
991 936 }
992 937 else if (nChar == VK_RIGHT || (nChar == VK_TAB && !IsSHIFTpressed()) )
993 938 {
994   - if( (nChar == VK_TAB) && m_QuitFocusOnTab )
995   - {
996   - CDialog* p= (CDialog*) GetParent();
997   - if(p) p->NextDlgCtrl();
998   - return;
999   -
1000   - }
1001 939 // don't let user go to a hidden column
1002 940 bFoundVisible = FALSE;
1003 941 iOrig = next.col;
... ... @@ -1317,7 +1255,7 @@ LRESULT CGridCtrl::OnImeChar(WPARAM wCharCode, LPARAM)
1317 1255 {
1318 1256 // EFW - BUG FIX
1319 1257 if (!IsCTRLpressed() && m_MouseMode == MOUSE_NOTHING && wCharCode != VK_ESCAPE)
1320   - OnEditCell(m_idCurrentCell.row, m_idCurrentCell.col, CPoint( -1, -1), (UINT)wCharCode);
  1258 + OnEditCell(m_idCurrentCell.row, m_idCurrentCell.col, CPoint( -1, -1), wCharCode);
1321 1259 return 0;
1322 1260 }
1323 1261  
... ... @@ -1347,8 +1285,8 @@ void CGridCtrl::OnEndInPlaceEdit(NMHDR* pNMHDR, LRESULT* pResult)
1347 1285 case VK_PRIOR:
1348 1286 case VK_HOME:
1349 1287 case VK_END:
1350   - OnKeyDown((UINT)pgvItem->lParam, 0, 0);
1351   - OnEditCell(m_idCurrentCell.row, m_idCurrentCell.col, CPoint( -1, -1), (UINT)pgvItem->lParam);
  1288 + OnKeyDown(pgvItem->lParam, 0, 0);
  1289 + OnEditCell(m_idCurrentCell.row, m_idCurrentCell.col, CPoint( -1, -1), pgvItem->lParam);
1352 1290 }
1353 1291  
1354 1292 *pResult = 0;
... ... @@ -1406,7 +1344,7 @@ void CGridCtrl::OnHScroll(UINT nSBCode, UINT /*nPos*/, CScrollBar* /*pScrollBar*
1406 1344 }
1407 1345  
1408 1346 int xScroll = GetColumnWidth(iColToUse);
1409   - SetScrollPos32(SB_HORZ, __max(0, scrollPos - xScroll));
  1347 + SetScrollPos32(SB_HORZ, max(0, scrollPos - xScroll));
1410 1348 rect.left = GetFixedColumnWidth();
1411 1349 //ScrollWindow(xScroll, 0, rect);
1412 1350 //rect.right = rect.left + xScroll;
... ... @@ -1431,7 +1369,7 @@ void CGridCtrl::OnHScroll(UINT nSBCode, UINT /*nPos*/, CScrollBar* /*pScrollBar*
1431 1369 {
1432 1370 rect.left = GetFixedColumnWidth();
1433 1371 int offset = -rect.Width();
1434   - int pos = __max(0, scrollPos + offset);
  1372 + int pos = max(0, scrollPos + offset);
1435 1373 SetScrollPos32(SB_HORZ, pos);
1436 1374 rect.left = GetFixedColumnWidth();
1437 1375 InvalidateRect(rect);
... ... @@ -1528,7 +1466,7 @@ void CGridCtrl::OnVScroll(UINT nSBCode, UINT /*nPos*/, CScrollBar* /*pScrollBar*
1528 1466 }
1529 1467  
1530 1468 int yScroll = GetRowHeight( iRowToUse);
1531   - SetScrollPos32(SB_VERT, __max(0, scrollPos - yScroll));
  1469 + SetScrollPos32(SB_VERT, max(0, scrollPos - yScroll));
1532 1470 rect.top = GetFixedRowHeight();
1533 1471 //ScrollWindow(0, yScroll, rect);
1534 1472 //rect.bottom = rect.top + yScroll;
... ... @@ -1552,7 +1490,7 @@ void CGridCtrl::OnVScroll(UINT nSBCode, UINT /*nPos*/, CScrollBar* /*pScrollBar*
1552 1490 {
1553 1491 rect.top = GetFixedRowHeight();
1554 1492 int offset = -rect.Height();
1555   - int pos = __max(0, scrollPos + offset);
  1493 + int pos = max(0, scrollPos + offset);
1556 1494 SetScrollPos32(SB_VERT, pos);
1557 1495 rect.top = GetFixedRowHeight();
1558 1496 InvalidateRect(rect);
... ... @@ -1632,28 +1570,106 @@ void CGridCtrl::OnDraw(CDC* pDC)
1632 1570 if (GetVirtualMode())
1633 1571 SendCacheHintToParent(VisCellRange);
1634 1572  
1635   - // draw top-left cells 0..m_nFixedRows-1, 0..m_nFixedCols-1
1636   - rect.bottom = -1;
1637   - for (row = 0; row < m_nFixedRows; row++)
  1573 + CPen pen;
  1574 + pen.CreatePen(PS_SOLID, 0, m_crGridLineColour);
  1575 + pDC->SelectObject(&pen);
  1576 +
  1577 + // draw vertical lines (drawn at ends of cells)
  1578 + if (m_nGridLines == GVL_BOTH || m_nGridLines == GVL_VERT)
  1579 + {
  1580 + int x = nFixedColWidth;
  1581 + for (col = minVisibleCol; col <= maxVisibleCol; col++)
  1582 + {
  1583 + if (GetColumnWidth(col) <= 0) continue;
  1584 +
  1585 + x += GetColumnWidth(col);
  1586 + pDC->MoveTo(x-1, nFixedRowHeight);
  1587 + pDC->LineTo(x-1, VisRect.bottom);
  1588 + }
  1589 + }
  1590 +
  1591 + // draw horizontal lines (drawn at bottom of each cell)
  1592 + if (m_nGridLines == GVL_BOTH || m_nGridLines == GVL_HORZ)
  1593 + {
  1594 + int y = nFixedRowHeight;
  1595 + for (row = minVisibleRow; row <= maxVisibleRow; row++)
  1596 + {
  1597 + if (GetRowHeight(row) <= 0) continue;
  1598 +
  1599 + y += GetRowHeight(row);
  1600 + pDC->MoveTo(nFixedColWidth, y-1);
  1601 + pDC->LineTo(VisRect.right, y-1);
  1602 + }
  1603 + }
  1604 +
  1605 + pDC->SelectStockObject(NULL_PEN);
  1606 +
  1607 + // draw rest of non-fixed cells
  1608 + rect.bottom = nFixedRowHeight-1;
  1609 + for (row = minVisibleRow; row <= maxVisibleRow; row++)
1638 1610 {
1639 1611 if (GetRowHeight(row) <= 0) continue;
1640 1612  
1641 1613 rect.top = rect.bottom+1;
1642 1614 rect.bottom = rect.top + GetRowHeight(row)-1;
1643   - rect.right = -1;
1644 1615  
1645   - for (col = 0; col < m_nFixedCols; col++)
  1616 + // rect.bottom = bottom pixel of previous row
  1617 + if (rect.top > clipRect.bottom)
  1618 + break; // Gone past cliprect
  1619 + if (rect.bottom < clipRect.top)
  1620 + continue; // Reached cliprect yet?
  1621 +
  1622 + rect.right = nFixedColWidth-1;
  1623 + for (col = minVisibleCol; col <= maxVisibleCol; col++)
1646 1624 {
1647 1625 if (GetColumnWidth(col) <= 0) continue;
1648 1626  
1649 1627 rect.left = rect.right+1;
1650 1628 rect.right = rect.left + GetColumnWidth(col)-1;
1651 1629  
  1630 + if (rect.left > clipRect.right)
  1631 + break; // gone past cliprect
  1632 + if (rect.right < clipRect.left)
  1633 + continue; // Reached cliprect yet?
  1634 +
1652 1635 pCell = GetCell(row, col);
  1636 +
  1637 + // TRACE(_T("Cell %d,%d type: %s\n"), row, col, pCell->GetRuntimeClass()->m_lpszClassName);
1653 1638 if (pCell)
1654 1639 {
1655   - pCell->SetCoords(row,col);
1656   - pCell->Draw(pDC, row, col, rect, FALSE);
  1640 + //Used for merge cells
  1641 + //by Huang Wei
  1642 +
  1643 + if(!pCell->IsMerged())
  1644 + {
  1645 + if(!pCell->IsMergeWithOthers())
  1646 + {
  1647 + pCell->SetCoords(row,col);
  1648 + pCell->Draw(pDC, row, col, rect, FALSE);
  1649 + }
  1650 + else
  1651 + {
  1652 + CGridCellBase* pMergedCell=GetCell(pCell->GetMergeCellID());
  1653 + CRect mergerect=rect;
  1654 + if(GetCellRangeRect(pMergedCell->m_MergeRange,&mergerect))
  1655 + {
  1656 + mergerect.DeflateRect(0,0,1,1);
  1657 + pMergedCell->SetCoords(pCell->GetMergeCellID().row,pCell->GetMergeCellID().col);
  1658 + pMergedCell->Draw(pDC, pCell->GetMergeCellID().row,pCell->GetMergeCellID().col, mergerect, TRUE);
  1659 + }
  1660 + }
  1661 + }
  1662 + else
  1663 + {
  1664 + CRect mergerect=rect;
  1665 +
  1666 + if(GetCellRangeRect(pCell->m_MergeRange,&mergerect))
  1667 + {
  1668 + mergerect.DeflateRect(0,0,1,1);
  1669 + pCell->SetCoords(row,col);
  1670 + pCell->Draw(pDC, row, col, mergerect, TRUE);
  1671 + }
  1672 + }
1657 1673 }
1658 1674 }
1659 1675 }
... ... @@ -1687,10 +1703,46 @@ void CGridCtrl::OnDraw(CDC* pDC)
1687 1703 continue; // Reached cliprect yet?
1688 1704  
1689 1705 pCell = GetCell(row, col);
  1706 + // if (pCell)
  1707 + //{
  1708 + // pCell->SetCoords(row,col);
  1709 + // pCell->Draw(pDC, row, col, rect, TRUE);
  1710 + //}
1690 1711 if (pCell)
1691 1712 {
1692   - pCell->SetCoords(row,col);
1693   - pCell->Draw(pDC, row, col, rect, FALSE);
  1713 + //Used for merge cells
  1714 + //by Huang Wei
  1715 +
  1716 + if(!pCell->IsMerged())
  1717 + {
  1718 + if(!pCell->IsMergeWithOthers())
  1719 + {
  1720 + pCell->SetCoords(row,col);
  1721 + pCell->Draw(pDC, row, col, rect, FALSE);
  1722 + }
  1723 + else
  1724 + {
  1725 + CGridCellBase* pMergedCell=GetCell(pCell->GetMergeCellID());
  1726 + CRect mergerect=rect;
  1727 + if(GetCellRangeRect(pMergedCell->m_MergeRange,&mergerect))
  1728 + {
  1729 + mergerect.DeflateRect(0,0,1,1);
  1730 + pMergedCell->SetCoords(pCell->GetMergeCellID().row,pCell->GetMergeCellID().col);
  1731 + pMergedCell->Draw(pDC, pCell->GetMergeCellID().row,pCell->GetMergeCellID().col, mergerect, TRUE);
  1732 + }
  1733 + }
  1734 + }
  1735 + else
  1736 + {
  1737 + CRect mergerect=rect;
  1738 +
  1739 + if(GetCellRangeRect(pCell->m_MergeRange,&mergerect))
  1740 + {
  1741 + mergerect.DeflateRect(0,0,1,1);
  1742 + pCell->SetCoords(row,col);
  1743 + pCell->Draw(pDC, row, col, mergerect, TRUE);
  1744 + }
  1745 + }
1694 1746 }
1695 1747 }
1696 1748 }
... ... @@ -1724,44 +1776,70 @@ void CGridCtrl::OnDraw(CDC* pDC)
1724 1776 continue; // Reached cliprect yet?
1725 1777  
1726 1778 pCell = GetCell(row, col);
  1779 + // if (pCell)
  1780 + //{
  1781 + // pCell->SetCoords(row,col);
  1782 + // pCell->Draw(pDC, row, col, rect, TRUE);
  1783 + //}
1727 1784 if (pCell)
1728 1785 {
1729   - pCell->SetCoords(row,col);
1730   - pCell->Draw(pDC, row, col, rect, FALSE);
  1786 + //Used for merge cells
  1787 + //by Huang Wei
  1788 +
  1789 + if(!pCell->IsMerged())
  1790 + {
  1791 + if(!pCell->IsMergeWithOthers())
  1792 + {
  1793 + pCell->SetCoords(row,col);
  1794 + pCell->Draw(pDC, row, col, rect, FALSE);
  1795 + }
  1796 + else
  1797 + {
  1798 + CGridCellBase* pMergedCell=GetCell(pCell->GetMergeCellID());
  1799 + CRect mergerect=rect;
  1800 + if(GetCellRangeRect(pMergedCell->m_MergeRange,&mergerect))
  1801 + {
  1802 + mergerect.DeflateRect(0,0,1,1);
  1803 + pMergedCell->SetCoords(pCell->GetMergeCellID().row,pCell->GetMergeCellID().col);
  1804 + pMergedCell->Draw(pDC, pCell->GetMergeCellID().row,pCell->GetMergeCellID().col, mergerect, TRUE);
  1805 + }
  1806 + }
  1807 + }
  1808 + else
  1809 + {
  1810 + CRect mergerect=rect;
  1811 +
  1812 + if(GetCellRangeRect(pCell->m_MergeRange,&mergerect))
  1813 + {
  1814 + mergerect.DeflateRect(0,0,1,1);
  1815 + pCell->SetCoords(row,col);
  1816 + pCell->Draw(pDC, row, col, mergerect, TRUE);
  1817 + }
  1818 + }
1731 1819 }
1732 1820 }
1733 1821 }
1734 1822  
1735   - // draw rest of non-fixed cells
1736   - rect.bottom = nFixedRowHeight-1;
1737   - for (row = minVisibleRow; row <= maxVisibleRow; row++)
  1823 +
  1824 +/*
  1825 + // draw top-left cells 0..m_nFixedRows-1, 0..m_nFixedCols-1
  1826 + rect.bottom = -1;
  1827 + for (row = 0; row < m_nFixedRows; row++)
1738 1828 {
1739 1829 if (GetRowHeight(row) <= 0) continue;
1740 1830  
1741 1831 rect.top = rect.bottom+1;
1742 1832 rect.bottom = rect.top + GetRowHeight(row)-1;
  1833 + rect.right = -1;
1743 1834  
1744   - // rect.bottom = bottom pixel of previous row
1745   - if (rect.top > clipRect.bottom)
1746   - break; // Gone past cliprect
1747   - if (rect.bottom < clipRect.top)
1748   - continue; // Reached cliprect yet?
1749   -
1750   - rect.right = nFixedColWidth-1;
1751   - for (col = minVisibleCol; col <= maxVisibleCol; col++)
  1835 + for (col = 0; col < m_nFixedCols; col++)
1752 1836 {
1753 1837 if (GetColumnWidth(col) <= 0) continue;
1754 1838  
1755 1839 rect.left = rect.right+1;
1756 1840 rect.right = rect.left + GetColumnWidth(col)-1;
1757 1841  
1758   - if (rect.left > clipRect.right)
1759   - break; // gone past cliprect
1760   - if (rect.right < clipRect.left)
1761   - continue; // Reached cliprect yet?
1762   -
1763 1842 pCell = GetCell(row, col);
1764   - // TRACE(_T("Cell %d,%d type: %s\n"), row, col, pCell->GetRuntimeClass()->m_lpszClassName);
1765 1843 if (pCell)
1766 1844 {
1767 1845 pCell->SetCoords(row,col);
... ... @@ -1769,41 +1847,70 @@ void CGridCtrl::OnDraw(CDC* pDC)
1769 1847 }
1770 1848 }
1771 1849 }
  1850 +*/
1772 1851  
1773 1852  
1774   - CPen pen;
1775   - pen.CreatePen(PS_SOLID, 0, m_crGridLineColour);
1776   - pDC->SelectObject(&pen);
1777   -
1778   - // draw vertical lines (drawn at ends of cells)
1779   - if (m_nGridLines == GVL_BOTH || m_nGridLines == GVL_VERT)
1780   - {
1781   - int x = nFixedColWidth;
1782   - for (col = minVisibleCol; col <= maxVisibleCol; col++)
1783   - {
1784   - if (GetColumnWidth(col) <= 0) continue;
  1853 + // draw top-left cells 0..m_nFixedRows-1, 0..m_nFixedCols-1
  1854 + rect.bottom = -1;
  1855 + for (row = 0; row < m_nFixedRows; row++)
  1856 + {
  1857 + if (GetRowHeight(row) <= 0) continue;
1785 1858  
1786   - x += GetColumnWidth(col);
1787   - pDC->MoveTo(x-1, nFixedRowHeight);
1788   - pDC->LineTo(x-1, VisRect.bottom);
1789   - }
1790   - }
  1859 + rect.top = rect.bottom+1;
  1860 + rect.bottom = rect.top + GetRowHeight(row)-1;
  1861 + rect.right = -1;
1791 1862  
1792   - // draw horizontal lines (drawn at bottom of each cell)
1793   - if (m_nGridLines == GVL_BOTH || m_nGridLines == GVL_HORZ)
1794   - {
1795   - int y = nFixedRowHeight;
1796   - for (row = minVisibleRow; row <= maxVisibleRow; row++)
1797   - {
1798   - if (GetRowHeight(row) <= 0) continue;
  1863 + for (col = 0; col < m_nFixedCols; col++)
  1864 + {
  1865 + if (GetColumnWidth(col) <= 0) continue;
  1866 +
  1867 + rect.left = rect.right+1;
  1868 + rect.right = rect.left + GetColumnWidth(col)-1;
  1869 +
  1870 + pCell = GetCell(row, col);
  1871 + // if (pCell)
  1872 + //{
  1873 + //pCell->SetCoords(row,col);
  1874 + //pCell->Draw(pDC, row, col, rect, FALSE);
  1875 + //}
  1876 + if (pCell)
  1877 + {
  1878 + //Used for merge cells by Huang Wei
  1879 + //bugfix by Luther Bruck
1799 1880  
1800   - y += GetRowHeight(row);
1801   - pDC->MoveTo(nFixedColWidth, y-1);
1802   - pDC->LineTo(VisRect.right, y-1);
1803   - }
1804   - }
  1881 + if(!pCell->IsMerged())
  1882 + {
  1883 + if(!pCell->IsMergeWithOthers())
  1884 + {
  1885 + pCell->SetCoords(row,col);
  1886 + pCell->Draw(pDC, row, col, rect, FALSE);
  1887 + }
  1888 + else
  1889 + {
  1890 + CGridCellBase* pMergedCell=GetCell(pCell->GetMergeCellID());
  1891 + CRect mergerect=rect;
  1892 + if(GetCellRangeRect(pMergedCell->m_MergeRange,&mergerect))
  1893 + {
  1894 + mergerect.DeflateRect(0,0,1,1);
  1895 + pMergedCell->SetCoords(pCell->GetMergeCellID().row,pCell->GetMergeCellID().col);
  1896 + pMergedCell->Draw(pDC, pCell->GetMergeCellID().row,pCell->GetMergeCellID().col, mergerect, TRUE);
  1897 + }
  1898 + }
  1899 + }
  1900 + else
  1901 + {
  1902 + CRect mergerect=rect;
1805 1903  
1806   - pDC->SelectStockObject(NULL_PEN);
  1904 + if(GetCellRangeRect(pCell->m_MergeRange,&mergerect))
  1905 + {
  1906 + mergerect.DeflateRect(0,0,1,1);
  1907 + pCell->SetCoords(row,col);
  1908 + pCell->Draw(pDC, row, col, mergerect, TRUE);
  1909 + }
  1910 + }
  1911 + }
  1912 + }
  1913 + }
1807 1914  
1808 1915 // Let parent know it can discard it's data if it needs to.
1809 1916 if (GetVirtualMode())
... ... @@ -2047,24 +2154,18 @@ void CGridCtrl::SetSelectedRange(int nMinRow, int nMinCol, int nMaxRow, int nMax
2047 2154 pDC = GetDC();
2048 2155  
2049 2156 // Only redraw visible cells
2050   - CCellRange VisCellRange, FixedVisCellRange;
  2157 + CCellRange VisCellRange;
2051 2158 if (IsWindow(GetSafeHwnd()))
2052   -
2053   - {
2054 2159 VisCellRange = GetVisibleNonFixedCellRange();
2055   - FixedVisCellRange = GetVisibleFixedCellRange();
2056   - }
2057 2160  
2058 2161 // EFW - Bug fix - Don't allow selection of fixed rows
2059   - int Left= (m_AllowSelectRowInFixedCol ? 0 : GetFixedColumnCount());
2060   -
2061 2162 if(nMinRow >= 0 && nMinRow < GetFixedRowCount())
2062 2163 nMinRow = GetFixedRowCount();
2063 2164 if(nMaxRow >= 0 && nMaxRow < GetFixedRowCount())
2064 2165 nMaxRow = GetFixedRowCount();
2065   - if(nMinCol >= 0 && nMinCol < Left)
  2166 + if(nMinCol >= 0 && nMinCol < GetFixedColumnCount())
2066 2167 nMinCol = GetFixedColumnCount();
2067   - if(nMaxCol >= 0 && nMaxCol < Left)
  2168 + if(nMaxCol >= 0 && nMaxCol < GetFixedColumnCount())
2068 2169 nMaxCol = GetFixedColumnCount();
2069 2170  
2070 2171 // If we are selecting cells, then first clear out the list of currently selected cells, then
... ... @@ -2091,7 +2192,7 @@ void CGridCtrl::SetSelectedRange(int nMinRow, int nMinCol, int nMaxRow, int nMax
2091 2192 nMinCol <= cell.col && cell.col <= nMaxCol)
2092 2193 continue;
2093 2194  
2094   - if ( (VisCellRange.IsValid() && VisCellRange.InRange( cell )) || FixedVisCellRange.InRange( cell ) )
  2195 + if ( VisCellRange.IsValid() && VisCellRange.InRange( cell ) )
2095 2196 {
2096 2197 if (bForceRepaint && pDC) // Redraw NOW
2097 2198 RedrawCell(cell.row, cell.col, pDC);
... ... @@ -2127,7 +2228,7 @@ void CGridCtrl::SetSelectedRange(int nMinRow, int nMinCol, int nMaxRow, int nMax
2127 2228 // Set state as Selected. This will add the cell to m_SelectedCellMap
2128 2229 SetItemState(cell.row, cell.col, nState | GVIS_SELECTED);
2129 2230  
2130   - if (( VisCellRange.IsValid() && VisCellRange.InRange( cell )) || FixedVisCellRange.InRange( cell ) )
  2231 + if ( VisCellRange.IsValid() && VisCellRange.InRange( cell ) )
2131 2232 {
2132 2233 // Redraw (immediately or at leisure)
2133 2234 if (bForceRepaint && pDC)
... ... @@ -2159,7 +2260,7 @@ void CGridCtrl::SetSelectedRange(int nMinRow, int nMinCol, int nMaxRow, int nMax
2159 2260 else
2160 2261 SetItemState(row, col, GetItemState(row, col) & ~GVIS_SELECTED);
2161 2262  
2162   - if ( (VisCellRange.IsValid() && VisCellRange.InRange(row, col)) || FixedVisCellRange.InRange(row, col) )
  2263 + if ( VisCellRange.IsValid() && VisCellRange.InRange(row, col) )
2163 2264 {
2164 2265 // Redraw (immediately or at leisure)
2165 2266 if (bForceRepaint && pDC)
... ... @@ -2221,15 +2322,15 @@ void CGridCtrl::SelectRows(CCellID currentCell,
2221 2322 return;
2222 2323 if (!IsValid(currentCell))
2223 2324 return;
2224   - int Left = ( m_AllowSelectRowInFixedCol ? 0 : GetFixedColumnCount());
  2325 +
2225 2326 if (GetSingleRowSelection())
2226   - SetSelectedRange(currentCell.row, Left ,
  2327 + SetSelectedRange(currentCell.row, GetFixedColumnCount(),
2227 2328 currentCell.row, GetColumnCount()-1,
2228 2329 bForceRedraw, bSelectCells);
2229 2330 else
2230 2331 SetSelectedRange(min(m_SelectionStartCell.row, currentCell.row),
2231   - Left,
2232   - __max(m_SelectionStartCell.row, currentCell.row),
  2332 + GetFixedColumnCount(),
  2333 + max(m_SelectionStartCell.row, currentCell.row),
2233 2334 GetColumnCount()-1,
2234 2335 bForceRedraw, bSelectCells);
2235 2336 }
... ... @@ -2254,8 +2355,8 @@ void CGridCtrl::SelectCells(CCellID currentCell,
2254 2355  
2255 2356 SetSelectedRange(min(m_SelectionStartCell.row, row),
2256 2357 min(m_SelectionStartCell.col, col),
2257   - __max(m_SelectionStartCell.row, row),
2258   - __max(m_SelectionStartCell.col, col),
  2358 + max(m_SelectionStartCell.row, row),
  2359 + max(m_SelectionStartCell.col, col),
2259 2360 bForceRedraw, bSelectCells);
2260 2361 }
2261 2362  
... ... @@ -2388,9 +2489,8 @@ COleDataSource* CGridCtrl::CopyTextFromGrid()
2388 2489 if (col != Selection.GetMaxCol())
2389 2490 str += _T("\t");
2390 2491 }
2391   -
2392 2492 if (row != Selection.GetMaxRow())
2393   - str += _T("\r\n");
  2493 + str += _T("\n");
2394 2494  
2395 2495 sf.Write(T2A(str.GetBuffer(1)), str.GetLength());
2396 2496 str.ReleaseBuffer();
... ... @@ -2427,20 +2527,20 @@ BOOL CGridCtrl::PasteTextToGrid(CCellID cell, COleDataObject* pDataObject,
2427 2527  
2428 2528 // Get the text from the COleDataObject
2429 2529 HGLOBAL hmem = pDataObject->GetGlobalData(CF_TEXT);
2430   - CMemFile sf((BYTE*) ::GlobalLock(hmem), (UINT)::GlobalSize(hmem));
  2530 + CMemFile sf((BYTE*) ::GlobalLock(hmem), ::GlobalSize(hmem));
2431 2531  
2432 2532 // CF_TEXT is ANSI text, so we need to allocate a char* buffer
2433 2533 // to hold this.
2434   - LPSTR szBuffer = new char[::GlobalSize(hmem)]; // FIX: Use LPSTR char here
  2534 + LPSTR szBuffer = new char[::GlobalSize(hmem)];
2435 2535 if (!szBuffer)
2436 2536 return FALSE;
2437 2537  
2438   - sf.Read(szBuffer, (UINT)::GlobalSize(hmem));
  2538 + sf.Read(szBuffer, ::GlobalSize(hmem));
2439 2539 ::GlobalUnlock(hmem);
2440 2540  
2441 2541 // Now store in generic TCHAR form so we no longer have to deal with
2442 2542 // ANSI/UNICODE problems
2443   - CString strText(szBuffer);
  2543 + CString strText = (LPWSTR)szBuffer;
2444 2544 delete szBuffer;
2445 2545  
2446 2546 // Parse text data and set in cells...
... ... @@ -2534,12 +2634,10 @@ BOOL CGridCtrl::PasteTextToGrid(CCellID cell, COleDataObject* pDataObject,
2534 2634 // Start drag n drop
2535 2635 void CGridCtrl::OnBeginDrag()
2536 2636 {
2537   - COleDataSource* pSource = NULL;
2538   - if (!m_bAllowDragAndDrop && m_CurCol==-1)
  2637 + if (!m_bAllowDragAndDrop)
2539 2638 return;
2540 2639  
2541   - if (m_CurCol>=0) pSource = new COleDataSource();
2542   - if (!pSource && m_bAllowDragAndDrop) pSource = CopyTextFromGrid();
  2640 + COleDataSource* pSource = CopyTextFromGrid();
2543 2641 if (pSource)
2544 2642 {
2545 2643 SendMessageToParent(GetSelectedCellRange().GetTopLeft().row,
... ... @@ -2556,7 +2654,6 @@ void CGridCtrl::OnBeginDrag()
2556 2654  
2557 2655 if (pSource)
2558 2656 delete pSource; // Did not pass source to clipboard, so must delete
2559   -
2560 2657 }
2561 2658 }
2562 2659  
... ... @@ -2564,41 +2661,23 @@ void CGridCtrl::OnBeginDrag()
2564 2661 DROPEFFECT CGridCtrl::OnDragOver(COleDataObject* pDataObject, DWORD dwKeyState,
2565 2662 CPoint point)
2566 2663 {
2567   - // Find which cell we are over and drop-highlight it
2568   - CCellID cell = GetCellFromPt(point, FALSE);
2569   - bool Valid;
2570 2664 // Any text data available for us?
2571   - if(m_CurCol==-1)
2572   - {
2573   - if(m_bDragRowMode)
2574   - {
2575   - Valid = cell.col>=GetFixedColumnCount() && cell.row>=GetFixedRowCount();
2576   - }
2577   - else
2578   - {
2579 2665 if (!m_bAllowDragAndDrop || !IsEditable() || !pDataObject->IsDataAvailable(CF_TEXT))
2580 2666 return DROPEFFECT_NONE;
2581   - Valid = IsValid(cell)!=0;
2582   - }
2583   - }
2584   - else
2585   - {
2586   - Valid = cell.col>=GetFixedColumnCount() && cell.row<GetFixedRowCount() ;
2587   - }
2588 2667  
  2668 + // Find which cell we are over and drop-highlight it
  2669 + CCellID cell = GetCellFromPt(point, FALSE);
2589 2670  
2590 2671 // If not valid, set the previously drop-highlighted cell as no longer drop-highlighted
2591   - if (!Valid)
  2672 + if (!IsValid(cell))
2592 2673 {
2593 2674 OnDragLeave();
2594 2675 m_LastDragOverCell = CCellID(-1,-1);
2595 2676 return DROPEFFECT_NONE;
2596 2677 }
2597   - if(m_CurCol==-1)
2598   - {
2599   - if (!m_bDragRowMode && !IsCellEditable(cell))
  2678 +
  2679 + if (!IsCellEditable(cell))
2600 2680 return DROPEFFECT_NONE;
2601   - }
2602 2681  
2603 2682 // Have we moved over a different cell than last time?
2604 2683 if (cell != m_LastDragOverCell)
... ... @@ -2636,28 +2715,18 @@ DROPEFFECT CGridCtrl::OnDragEnter(COleDataObject* pDataObject, DWORD dwKeyState,
2636 2715 CPoint point)
2637 2716 {
2638 2717 // Any text data available for us?
2639   - m_LastDragOverCell = GetCellFromPt(point, m_CurCol>=0);
2640   - bool Valid;
2641   - if(m_CurCol==-1)
2642   - {
2643 2718 if (!m_bAllowDragAndDrop || !pDataObject->IsDataAvailable(CF_TEXT))
2644 2719 return DROPEFFECT_NONE;
2645 2720  
2646 2721 // Find which cell we are over and drop-highlight it
  2722 + m_LastDragOverCell = GetCellFromPt(point, FALSE);
2647 2723 if (!IsValid(m_LastDragOverCell))
2648 2724 return DROPEFFECT_NONE;
2649 2725  
2650 2726 if (!IsCellEditable(m_LastDragOverCell))
2651 2727 return DROPEFFECT_NONE;
2652   - Valid = IsValid(m_LastDragOverCell)!=0;
2653 2728  
2654   - }
2655   - else
2656   - {
2657   - Valid = m_LastDragOverCell.row>=0 && m_LastDragOverCell.row<GetFixedRowCount() && m_LastDragOverCell.col>=GetFixedColumnCount();
2658   - }
2659   -
2660   - if (Valid)
  2729 + if (IsValid(m_LastDragOverCell))
2661 2730 {
2662 2731 UINT nState = GetItemState(m_LastDragOverCell.row, m_LastDragOverCell.col);
2663 2732 SetItemState(m_LastDragOverCell.row, m_LastDragOverCell.col,
... ... @@ -2690,39 +2759,14 @@ BOOL CGridCtrl::OnDrop(COleDataObject* pDataObject, DROPEFFECT /*dropEffect*/,
2690 2759 CPoint /* point */)
2691 2760 {
2692 2761 m_MouseMode = MOUSE_NOTHING;
2693   - if(m_CurCol ==-1)
2694   - {
2695   - if (!m_bAllowDragAndDrop || (!IsCellEditable(m_LastDragOverCell) && !m_bDragRowMode))
  2762 +
  2763 + if (!m_bAllowDragAndDrop || !IsCellEditable(m_LastDragOverCell))
2696 2764 return FALSE;
2697   - }
2698 2765  
2699 2766 OnDragLeave();
2700   - if (m_CurCol>=0)
2701   - {
2702   - if(m_LastDragOverCell.col == m_CurCol || m_LastDragOverCell.row >= GetFixedRowCount())
2703   - return FALSE;
2704   - else
2705   - {
2706   - int New = m_arColOrder[m_CurCol];
2707   - m_arColOrder.erase(m_arColOrder.begin()+m_CurCol);
2708   - m_arColOrder.insert(m_arColOrder.begin()+m_LastDragOverCell.col, New);
2709   - m_CurCol=-1;
2710   - Invalidate();
2711   - return TRUE;
2712   - }
2713   - }
2714   - else
2715   - {
2716   - if(m_bDragRowMode)
2717   - {
2718   - Reorder(m_CurRow,m_LastDragOverCell.row);
2719   - Invalidate();
2720   - return TRUE;
2721   - }
2722   - else
  2767 +
2723 2768 return PasteTextToGrid(m_LastDragOverCell, pDataObject, FALSE);
2724 2769 }
2725   -}
2726 2770 #endif
2727 2771  
2728 2772 #ifndef GRIDCONTROL_NO_CLIPBOARD
... ... @@ -2845,7 +2889,10 @@ BOOL CGridCtrl::MouseOverRowResizeArea(CPoint&amp; point)
2845 2889 if (!GetCellOrigin(idCurrentCell, &start))
2846 2890 return FALSE;
2847 2891  
2848   - int endy = start.y + GetRowHeight(idCurrentCell.row);
  2892 + //int endy = start.y + GetRowHeight(idCurrentCell.row);
  2893 + //Merge the selected cells
  2894 + //by Huang Wei
  2895 + int endy = start.y + GetMergeCellHeight(idCurrentCell);
2849 2896  
2850 2897 if ((point.y - start.y < m_nResizeCaptureRange && idCurrentCell.row != 0) ||
2851 2898 endy - point.y < m_nResizeCaptureRange)
... ... @@ -2867,7 +2914,10 @@ BOOL CGridCtrl::MouseOverColumnResizeArea(CPoint&amp; point)
2867 2914 if (!GetCellOrigin(idCurrentCell, &start))
2868 2915 return FALSE;
2869 2916  
2870   - int endx = start.x + GetColumnWidth(idCurrentCell.col);
  2917 + //int endx = start.x + GetColumnWidth(idCurrentCell.col);
  2918 + //Merge the selected cells
  2919 + //by Huang Wei
  2920 + int endx = start.x + GetMergeCellWidth(idCurrentCell);
2871 2921  
2872 2922 if ((point.x - start.x < m_nResizeCaptureRange && idCurrentCell.col != 0) ||
2873 2923 endx - point.x < m_nResizeCaptureRange)
... ... @@ -2905,7 +2955,6 @@ CCellID CGridCtrl::GetCellFromPt(CPoint point, BOOL bAllowFixedCellCheck /*=TRUE
2905 2955 break;
2906 2956 col++;
2907 2957 }
2908   -
2909 2958 cellID.col = col;
2910 2959 }
2911 2960 else // in non-fixed col
... ... @@ -2960,6 +3009,7 @@ CCellID CGridCtrl::GetCellFromPt(CPoint point, BOOL bAllowFixedCellCheck /*=TRUE
2960 3009 else
2961 3010 cellID.row = row;
2962 3011 }
  3012 + cellID=GetMergeCellID(cellID);
2963 3013 return cellID;
2964 3014 }
2965 3015  
... ... @@ -2990,15 +3040,10 @@ CCellID CGridCtrl::GetTopleftNonFixedCell(BOOL bForceRecalculation /*=FALSE*/)
2990 3040 return m_idTopLeftCell;
2991 3041 }
2992 3042  
2993   -
2994   -
2995   -
2996   -
2997 3043 // This gets even partially visible cells
2998 3044 CCellRange CGridCtrl::GetVisibleNonFixedCellRange(LPRECT pRect /*=NULL*/,
2999 3045 BOOL bForceRecalculation /*=FALSE*/)
3000 3046 {
3001   - int i;
3002 3047 CRect rect;
3003 3048 GetClientRect(rect);
3004 3049  
... ... @@ -3006,6 +3051,7 @@ CCellRange CGridCtrl::GetVisibleNonFixedCellRange(LPRECT pRect /*=NULL*/,
3006 3051  
3007 3052 // calc bottom
3008 3053 int bottom = GetFixedRowHeight();
  3054 + int i = 0;
3009 3055 for (i = idTopLeft.row; i < GetRowCount(); i++)
3010 3056 {
3011 3057 bottom += GetRowHeight(i);
... ... @@ -3039,54 +3085,6 @@ CCellRange CGridCtrl::GetVisibleNonFixedCellRange(LPRECT pRect /*=NULL*/,
3039 3085 return CCellRange(idTopLeft.row, idTopLeft.col, maxVisibleRow, maxVisibleCol);
3040 3086 }
3041 3087  
3042   -
3043   -CCellRange CGridCtrl::GetVisibleFixedCellRange(LPRECT pRect /*=NULL*/,
3044   - BOOL bForceRecalculation /*=FALSE*/)
3045   -{
3046   - int i;
3047   - CRect rect;
3048   - GetClientRect(rect);
3049   -
3050   - CCellID idTopLeft = GetTopleftNonFixedCell(bForceRecalculation);
3051   -
3052   - // calc bottom
3053   - int bottom = GetFixedRowHeight();
3054   - for (i = idTopLeft.row; i < GetRowCount(); i++)
3055   - {
3056   - bottom += GetRowHeight(i);
3057   - if (bottom >= rect.bottom)
3058   - {
3059   - bottom = rect.bottom;
3060   - break;
3061   - }
3062   - }
3063   - int maxVisibleRow = min(i, GetRowCount() - 1);
3064   -
3065   - // calc right
3066   - int right = 0;
3067   - for (i = 0; i < GetFixedColumnCount(); i++)
3068   - {
3069   - right += GetColumnWidth(i);
3070   - if (right >= rect.right)
3071   - {
3072   - right = rect.right;
3073   - break;
3074   - }
3075   - }
3076   - int maxVisibleCol = min(i, GetColumnCount() - 1);
3077   - if (pRect)
3078   - {
3079   - pRect->left = pRect->top = 0;
3080   - pRect->right = right;
3081   - pRect->bottom = bottom;
3082   - }
3083   -
3084   - return CCellRange(idTopLeft.row, 0, maxVisibleRow, maxVisibleCol);
3085   -}
3086   -
3087   -
3088   -
3089   -
3090 3088 // used by ResetScrollBars() - This gets only fully visible cells
3091 3089 CCellRange CGridCtrl::GetUnobstructedNonFixedCellRange(BOOL bForceRecalculation /*=FALSE*/)
3092 3090 {
... ... @@ -3096,8 +3094,8 @@ CCellRange CGridCtrl::GetUnobstructedNonFixedCellRange(BOOL bForceRecalculation
3096 3094 CCellID idTopLeft = GetTopleftNonFixedCell(bForceRecalculation);
3097 3095  
3098 3096 // calc bottom
3099   - int i;
3100 3097 int bottom = GetFixedRowHeight();
  3098 + int i = 0;
3101 3099 for (i = idTopLeft.row; i < GetRowCount(); i++)
3102 3100 {
3103 3101 bottom += GetRowHeight(i);
... ... @@ -3138,8 +3136,8 @@ CCellRange CGridCtrl::GetSelectedCellRange() const
3138 3136  
3139 3137 Selection.SetMinRow( min(Selection.GetMinRow(), cell.row) );
3140 3138 Selection.SetMinCol( min(Selection.GetMinCol(), cell.col) );
3141   - Selection.SetMaxRow( __max(Selection.GetMaxRow(), cell.row) );
3142   - Selection.SetMaxCol( __max(Selection.GetMaxCol(), cell.col) );
  3139 + Selection.SetMaxRow( max(Selection.GetMaxRow(), cell.row) );
  3140 + Selection.SetMaxCol( max(Selection.GetMaxCol(), cell.col) );
3143 3141 }
3144 3142  
3145 3143 return Selection;
... ... @@ -3341,6 +3339,7 @@ void CGridCtrl::ResetScrollBars()
3341 3339 // Row/Column position functions
3342 3340  
3343 3341 // returns the top left point of the cell. Returns FALSE if cell not visible.
  3342 +// consider cell's merge
3344 3343 BOOL CGridCtrl::GetCellOrigin(int nRow, int nCol, LPPOINT p)
3345 3344 {
3346 3345 int i;
... ... @@ -3352,6 +3351,72 @@ BOOL CGridCtrl::GetCellOrigin(int nRow, int nCol, LPPOINT p)
3352 3351 if (nCol >= m_nFixedCols || nRow >= m_nFixedRows)
3353 3352 idTopLeft = GetTopleftNonFixedCell();
3354 3353  
  3354 + //Merge the selected cells
  3355 + //by Huang Wei
  3356 +
  3357 + //if ((nRow >= m_nFixedRows && nRow < idTopLeft.row) ||
  3358 + // (nCol>= m_nFixedCols && nCol < idTopLeft.col))
  3359 + // return FALSE;
  3360 +
  3361 + p->x = 0;
  3362 + if (nCol < m_nFixedCols) // is a fixed column
  3363 + for (i = 0; i < nCol; i++)
  3364 + p->x += GetColumnWidth(i);
  3365 + else
  3366 + { // is a scrollable data column
  3367 + for (i = 0; i < m_nFixedCols; i++)
  3368 + p->x += GetColumnWidth(i);
  3369 + //Merge the selected cells
  3370 + //by Huang Wei
  3371 + if(nCol>idTopLeft.col)
  3372 + {
  3373 + for (i = idTopLeft.col; i < nCol; i++)
  3374 + p->x += GetColumnWidth(i);
  3375 + }
  3376 + else
  3377 + {
  3378 + for (i = nCol; i <idTopLeft.col ; i++)
  3379 + p->x -= GetColumnWidth(i);
  3380 + }
  3381 + }
  3382 +
  3383 + p->y = 0;
  3384 + if (nRow < m_nFixedRows) // is a fixed row
  3385 + for (i = 0; i < nRow; i++)
  3386 + p->y += GetRowHeight(i);
  3387 + else
  3388 + { // is a scrollable data row
  3389 + for (i = 0; i < m_nFixedRows; i++)
  3390 + p->y += GetRowHeight(i);
  3391 + //Merge the selected cells
  3392 + //by Huang Wei
  3393 + if(nRow>idTopLeft.row)
  3394 + {
  3395 + for (i = idTopLeft.row; i < nRow; i++)
  3396 + p->y += GetRowHeight(i);
  3397 + }
  3398 + else
  3399 + {
  3400 + for (i = nRow; i <idTopLeft.row; i++)
  3401 + p->y -= GetRowHeight(i);
  3402 + }
  3403 + }
  3404 +
  3405 + return TRUE;
  3406 +}
  3407 +// returns the top left point of the cell. Returns FALSE if cell not visible.
  3408 +// don't consider cell's merge
  3409 +BOOL CGridCtrl::GetCellOriginNoMerge(int nRow, int nCol, LPPOINT p)
  3410 +{
  3411 + int i;
  3412 +
  3413 + if (!IsValid(nRow, nCol))
  3414 + return FALSE;
  3415 +
  3416 + CCellID idTopLeft;
  3417 + if (nCol >= m_nFixedCols || nRow >= m_nFixedRows)
  3418 + idTopLeft = GetTopleftNonFixedCell();
  3419 +
3355 3420 if ((nRow >= m_nFixedRows && nRow < idTopLeft.row) ||
3356 3421 (nCol>= m_nFixedCols && nCol < idTopLeft.col))
3357 3422 return FALSE;
... ... @@ -3383,10 +3448,16 @@ BOOL CGridCtrl::GetCellOrigin(int nRow, int nCol, LPPOINT p)
3383 3448 return TRUE;
3384 3449 }
3385 3450  
  3451 +
  3452 +
3386 3453 BOOL CGridCtrl::GetCellOrigin(const CCellID& cell, LPPOINT p)
3387 3454 {
3388 3455 return GetCellOrigin(cell.row, cell.col, p);
3389 3456 }
  3457 +BOOL CGridCtrl::GetCellOriginNoMerge(const CCellID& cell, LPPOINT p)
  3458 +{
  3459 + return GetCellOriginNoMerge(cell.row, cell.col, p);
  3460 +}
3390 3461  
3391 3462 // Returns the bounding box of the cell
3392 3463 BOOL CGridCtrl::GetCellRect(const CCellID& cell, LPRECT pRect)
... ... @@ -3400,11 +3471,21 @@ BOOL CGridCtrl::GetCellRect(int nRow, int nCol, LPRECT pRect)
3400 3471 if (!GetCellOrigin(nRow, nCol, &CellOrigin))
3401 3472 return FALSE;
3402 3473  
3403   - pRect->left = CellOrigin.x;
3404   - pRect->top = CellOrigin.y;
3405   - pRect->right = CellOrigin.x + GetColumnWidth(nCol)-1;
3406   - pRect->bottom = CellOrigin.y + GetRowHeight(nRow)-1;
3407   -
  3474 + //Merge the selected cells
  3475 + //by Huang Wei
  3476 + CGridCellBase *pCell = (CGridCellBase*) GetCell(nRow,nCol);
  3477 +
  3478 + if(!pCell->IsMerged())
  3479 + {
  3480 + pRect->left = CellOrigin.x;
  3481 + pRect->top = CellOrigin.y;
  3482 + pRect->right = CellOrigin.x + GetColumnWidth(nCol)-1;
  3483 + pRect->bottom = CellOrigin.y + GetRowHeight(nRow)-1;
  3484 + }
  3485 + else
  3486 + {
  3487 + GetCellRangeRect(pCell->m_MergeRange,pRect);
  3488 + }
3408 3489 //TRACE("Row %d, col %d: L %d, T %d, W %d, H %d: %d,%d - %d,%d\n",
3409 3490 // nRow,nCol, CellOrigin.x, CellOrigin.y, GetColumnWidth(nCol), GetRowHeight(nRow),
3410 3491 // pRect->left, pRect->top, pRect->right, pRect->bottom);
... ... @@ -3686,7 +3767,6 @@ BOOL CGridCtrl::SetRowCount(int nRows)
3686 3767 for (int row = startRow; row < nRows; row++)
3687 3768 m_arRowHeights[row] = m_cellDefault.GetHeight();
3688 3769 }
3689   - ResetVirtualOrder();
3690 3770 }
3691 3771 else
3692 3772 {
... ... @@ -3774,17 +3854,16 @@ BOOL CGridCtrl::SetColumnCount(int nCols)
3774 3854 // and set the default column width
3775 3855 if (addedCols > 0)
3776 3856 {
3777   - int row, col;
3778   -
3779 3857 // initialized column widths
3780 3858 int startCol = nCols - addedCols;
  3859 + int col = 0;
3781 3860 for (col = startCol; col < nCols; col++)
3782 3861 m_arColWidths[col] = m_cellFixedColDef.GetWidth();
3783 3862  
3784 3863 // initialise column data
3785 3864 if (!GetVirtualMode())
3786 3865 {
3787   - for (row = 0; row < m_nRows; row++)
  3866 + for (int row = 0; row < m_nRows; row++)
3788 3867 for (col = startCol; col < nCols; col++)
3789 3868 {
3790 3869 GRID_ROW* pRow = m_RowData[row];
... ... @@ -3803,12 +3882,6 @@ BOOL CGridCtrl::SetColumnCount(int nCols)
3803 3882 }
3804 3883 END_CATCH
3805 3884  
3806   - m_arColOrder.resize(nCols); // Reset Column Order
3807   - for (int i = 0; i < nCols; i++)
3808   - {
3809   - m_arColOrder[i] = i;
3810   - }
3811   -
3812 3885 m_nCols = nCols;
3813 3886  
3814 3887 SetModified();
... ... @@ -3823,7 +3896,6 @@ int CGridCtrl::InsertColumn(LPCTSTR strHeading,
3823 3896 UINT nFormat /* = DT_CENTER|DT_VCENTER|DT_SINGLELINE */,
3824 3897 int nColumn /* = -1 */)
3825 3898 {
3826   - ASSERT(!m_AllowReorderColumn); // function not implemented in case of m_AllowReorderColumn option
3827 3899 if (nColumn >= 0 && nColumn < m_nFixedCols)
3828 3900 {
3829 3901  
... ... @@ -3886,18 +3958,11 @@ int CGridCtrl::InsertColumn(LPCTSTR strHeading,
3886 3958 CATCH (CMemoryException, e)
3887 3959 {
3888 3960 e->ReportError();
3889   - return -1;
  3961 + return FALSE;
3890 3962 }
3891 3963 END_CATCH
3892 3964  
3893 3965 m_nCols++;
3894   -
3895   - // Column Order
3896   - m_arColOrder.resize(m_nCols);
3897   - for (int i = 0; i < m_nCols; i++)
3898   - {
3899   - m_arColOrder[i] = i;
3900   - }
3901 3966  
3902 3967 // Initialise column data
3903 3968 SetItemText(0, nColumn, strHeading);
... ... @@ -3949,19 +4014,12 @@ int CGridCtrl::InsertRow(LPCTSTR strHeading, int nRow /* = -1 */)
3949 4014 m_arRowHeights.Add(0);
3950 4015 if (!GetVirtualMode())
3951 4016 m_RowData.Add(new GRID_ROW);
3952   - else
3953   - m_arRowOrder.push_back(m_nRows);
3954   -
3955 4017 }
3956 4018 else
3957 4019 {
3958 4020 m_arRowHeights.InsertAt(nRow, (UINT)0);
3959 4021 if (!GetVirtualMode())
3960 4022 m_RowData.InsertAt(nRow, new GRID_ROW);
3961   - else
3962   - {
3963   - ResetVirtualOrder();
3964   - }
3965 4023 }
3966 4024  
3967 4025 if (!GetVirtualMode())
... ... @@ -3970,7 +4028,7 @@ int CGridCtrl::InsertRow(LPCTSTR strHeading, int nRow /* = -1 */)
3970 4028 CATCH (CMemoryException, e)
3971 4029 {
3972 4030 e->ReportError();
3973   - return -1;
  4031 + return FALSE;
3974 4032 }
3975 4033 END_CATCH
3976 4034  
... ... @@ -4126,20 +4184,6 @@ BOOL CGridCtrl::DeleteColumn(int nColumn)
4126 4184 return TRUE;
4127 4185 }
4128 4186  
4129   -
4130   -void CGridCtrl::AddSubVirtualRow(int Num, int Nb)
4131   -{
4132   - ASSERT(Nb == -1 || Nb ==1); // only these vlaues are implemented now
4133   - if(!GetVirtualMode()) return;
4134   - for(int ind = 0; ind<m_nRows ; ind++)
4135   - if(m_arRowOrder[ind]>Num) m_arRowOrder[ind]+=Nb;
4136   - if(Nb>0)
4137   - m_arRowOrder.insert(m_arRowOrder.begin()+Num,Num);
4138   - else
4139   - m_arRowOrder.erase(m_arRowOrder.begin()+Num);
4140   -}
4141   -
4142   -
4143 4187 BOOL CGridCtrl::DeleteRow(int nRow)
4144 4188 {
4145 4189 if (nRow < 0 || nRow >= GetRowCount())
... ... @@ -4159,8 +4203,6 @@ BOOL CGridCtrl::DeleteRow(int nRow)
4159 4203 delete pRow;
4160 4204 m_RowData.RemoveAt(nRow);
4161 4205 }
4162   - else
4163   - AddSubVirtualRow(nRow,-1);
4164 4206  
4165 4207 m_arRowHeights.RemoveAt(nRow);
4166 4208  
... ... @@ -4184,26 +4226,14 @@ BOOL CGridCtrl::DeleteRow(int nRow)
4184 4226 BOOL CGridCtrl::DeleteNonFixedRows()
4185 4227 {
4186 4228 ResetSelectedRange();
  4229 +
4187 4230 int nFixed = GetFixedRowCount();
4188 4231 int nCount = GetRowCount();
4189   - if (GetVirtualMode())
4190   - {
4191   - if(nCount != nFixed)
4192   - {
4193   - SetRowCount(nFixed);
4194   - m_arRowOrder.resize(nFixed);
4195   - m_arRowHeights.SetSize(nFixed);
4196   - m_idCurrentCell.row = m_idCurrentCell.col = -1;
4197   - ResetScrollBars();
4198   - SetModified();
4199   - }
4200   - }
4201   - else
4202   - {
  4232 +
4203 4233 // Delete all data rows
4204 4234 for (int nRow = nCount; nRow >= nFixed; nRow--)
4205 4235 DeleteRow(nRow);
4206   - }
  4236 +
4207 4237 return TRUE;
4208 4238 }
4209 4239  
... ... @@ -4230,9 +4260,6 @@ BOOL CGridCtrl::DeleteAllItems()
4230 4260 // Remove all rows
4231 4261 m_RowData.RemoveAll();
4232 4262 }
4233   - else
4234   - m_arRowOrder.clear();
4235   -
4236 4263  
4237 4264 m_idCurrentCell.row = m_idCurrentCell.col = -1;
4238 4265 m_nRows = m_nFixedRows = m_nCols = m_nFixedCols = 0;
... ... @@ -4380,6 +4407,10 @@ CCellID CGridCtrl::GetNextItem(CCellID&amp; cell, int nFlags) const
4380 4407 // Sorts on a given column using the cell text
4381 4408 BOOL CGridCtrl::SortTextItems(int nCol, BOOL bAscending, LPARAM data /* = 0 */)
4382 4409 {
  4410 + SetSortColumn(nCol);
  4411 + SetSortAscending(bAscending);
  4412 + ResetSelectedRange();
  4413 + SetFocusCell(-1, - 1);
4383 4414 return CGridCtrl::SortItems(pfnCellTextCompare, nCol, bAscending, data);
4384 4415 }
4385 4416  
... ... @@ -4444,13 +4475,7 @@ int CALLBACK CGridCtrl::pfnCellNumericCompare(LPARAM lParam1, LPARAM lParam2, LP
4444 4475 return 1;
4445 4476 }
4446 4477  
4447   -
4448   -CGridCtrl * CGridCtrl::m_This;
4449 4478 // private recursive sort implementation
4450   -bool CGridCtrl::NotVirtualCompare(int c1, int c2)
4451   -{
4452   - return ! CGridCtrl::m_This->m_pfnVirtualCompare(c1, c2);
4453   -}
4454 4479 BOOL CGridCtrl::SortItems(PFNLVCOMPARE pfnCompare, int nCol, BOOL bAscending, LPARAM data,
4455 4480 int low, int high)
4456 4481 {
... ... @@ -4465,17 +4490,6 @@ BOOL CGridCtrl::SortItems(PFNLVCOMPARE pfnCompare, int nCol, BOOL bAscending, LP
4465 4490  
4466 4491 if (hi <= lo)
4467 4492 return FALSE;
4468   -
4469   - if (GetVirtualMode())
4470   - {
4471   - ASSERT(m_pfnVirtualCompare);
4472   - m_CurCol = m_arColOrder[nCol];
4473   - m_This = this;
4474   - std::stable_sort(m_arRowOrder.begin() + m_nFixedRows, m_arRowOrder.end(),
4475   - bAscending ? m_pfnVirtualCompare : NotVirtualCompare);
4476   - return TRUE;
4477   - }
4478   -
4479 4493  
4480 4494 //LPARAM midItem = GetItemData((lo + hi)/2, nCol);
4481 4495 LPARAM pMidCell = (LPARAM) GetCell((lo + hi)/2, nCol);
... ... @@ -4907,7 +4921,7 @@ int CGridCtrl::GetColumnWidth(int nCol) const
4907 4921 if (nCol < 0 || nCol >= m_nCols)
4908 4922 return -1;
4909 4923  
4910   - return m_arColWidths[m_arColOrder[nCol]];
  4924 + return m_arColWidths[nCol];
4911 4925 }
4912 4926  
4913 4927 BOOL CGridCtrl::SetRowHeight(int nRow, int height)
... ... @@ -4928,7 +4942,7 @@ BOOL CGridCtrl::SetColumnWidth(int nCol, int width)
4928 4942 if (nCol < 0 || nCol >= m_nCols || width < 0)
4929 4943 return FALSE;
4930 4944  
4931   - m_arColWidths[m_arColOrder[nCol]] = width;
  4945 + m_arColWidths[nCol] = width;
4932 4946 ResetScrollBars();
4933 4947  
4934 4948 return TRUE;
... ... @@ -5143,13 +5157,13 @@ void CGridCtrl::ExpandColumnsToFit(BOOL bExpandFixed /*=TRUE*/)
5143 5157  
5144 5158 EnableScrollBars(SB_HORZ, FALSE);
5145 5159  
5146   - int col;
5147 5160 CRect rect;
5148 5161 GetClientRect(rect);
5149 5162  
5150 5163 int nFirstColumn = (bExpandFixed)? 0 : GetFixedColumnCount();
5151 5164  
5152 5165 int nNumColumnsAffected = 0;
  5166 + int col = 0;
5153 5167 for (col = nFirstColumn; col < GetColumnCount(); col++)
5154 5168 {
5155 5169 if (m_arColWidths[col] > 0)
... ... @@ -5243,13 +5257,13 @@ void CGridCtrl::ExpandRowsToFit(BOOL bExpandFixed /*=TRUE*/)
5243 5257  
5244 5258 EnableScrollBars(SB_VERT, FALSE);
5245 5259  
5246   - int row;
5247 5260 CRect rect;
5248 5261 GetClientRect(rect);
5249 5262  
5250 5263 int nFirstRow = (bExpandFixed)? 0 : GetFixedRowCount();
5251 5264  
5252 5265 int nNumRowsAffected = 0;
  5266 + int row = 0;
5253 5267 for (row = nFirstRow; row < GetRowCount(); row++)
5254 5268 {
5255 5269 if (m_arRowHeights[row] > 0)
... ... @@ -5318,10 +5332,10 @@ void CGridCtrl::SetVirtualMode(BOOL bVirtual)
5318 5332 if (m_bVirtualMode)
5319 5333 {
5320 5334 SetEditable(FALSE);
  5335 + SetHeaderSort(FALSE);
5321 5336 SetAutoSizeStyle(GVS_HEADER);
5322 5337 SetFixedColumnSelection(FALSE);
5323 5338 SetFixedRowSelection(FALSE);
5324   - ResetVirtualOrder();
5325 5339 }
5326 5340 }
5327 5341  
... ... @@ -5426,7 +5440,7 @@ void CGridCtrl::EnsureVisible(int nRow, int nCol)
5426 5440 }
5427 5441 */
5428 5442  
5429   - // We are going to send some scroll messages, which will steal the focus
  5443 + // We are gonna send some scroll messages, which will steal the focus
5430 5444 // from it's rightful owner. Squirrel it away ourselves so we can give
5431 5445 // it back. (Damir)
5432 5446 CWnd* pFocusWnd = GetFocus();
... ... @@ -5489,35 +5503,34 @@ void CGridCtrl::EnsureVisible(int nRow, int nCol)
5489 5503  
5490 5504 GetClientRect(rectWindow);
5491 5505  
5492   - // The previous fix was fixed properly by Martin Richter
  5506 + // The previous fix was fixed properly by Martin Richter <martin.richter@grutzeck.de>
5493 5507 while (rectCell.right > rectWindow.right
5494   - && rectCell.left > GetFixedColumnWidth()
5495   - && IsVisibleHScroll() // Junlin Xu: added to prevent infinite loop
5496   - )
  5508 + && rectCell.left > GetFixedColumnWidth())
5497 5509 {
5498 5510 SendMessage(WM_HSCROLL, SB_LINERIGHT, 0);
5499 5511 if (!GetCellRect(nRow, nCol, rectCell))
5500 5512 {
5501   - pFocusWnd->SetFocus();
  5513 + if (pFocusWnd && ::IsWindow(pFocusWnd->GetSafeHwnd()))
  5514 + pFocusWnd->SetFocus();
5502 5515 return;
5503 5516 }
5504 5517 }
5505 5518  
5506 5519 while (rectCell.bottom > rectWindow.bottom
5507   - && rectCell.top > GetFixedRowHeight()
5508   - && IsVisibleVScroll() // Junlin Xu: added to prevent infinite loop
5509   - )
  5520 + && rectCell.top > GetFixedRowHeight())
5510 5521 {
5511 5522 SendMessage(WM_VSCROLL, SB_LINEDOWN, 0);
5512 5523 if (!GetCellRect(nRow, nCol, rectCell))
5513 5524 {
5514   - pFocusWnd->SetFocus();
  5525 + if (pFocusWnd && ::IsWindow(pFocusWnd->GetSafeHwnd()))
  5526 + pFocusWnd->SetFocus();
5515 5527 return;
5516 5528 }
5517 5529 }
5518 5530  
5519 5531 // restore focus to whoever owned it
5520   - pFocusWnd->SetFocus();
  5532 + if (pFocusWnd && ::IsWindow(pFocusWnd->GetSafeHwnd()))
  5533 + pFocusWnd->SetFocus();
5521 5534 }
5522 5535  
5523 5536 BOOL CGridCtrl::IsCellEditable(CCellID &cell) const
... ... @@ -5798,7 +5811,7 @@ void CGridCtrl::OnMouseMove(UINT /*nFlags*/, CPoint point)
5798 5811 && pCell->GetTipTextRect( &TextRect)
5799 5812 && GetCellRect(idCurrentCell.row, idCurrentCell.col, CellRect) )
5800 5813 {
5801   -// TRACE0("Showing TitleTip\n");
  5814 + TRACE0("Showing TitleTip\n");
5802 5815 m_TitleTip.Show(TextRect, pCell->GetTipText(), 0, CellRect,
5803 5816 pCell->GetFont(), GetTitleTipTextClr(), GetTitleTipBackClr());
5804 5817 }
... ... @@ -6033,13 +6046,12 @@ void CGridCtrl::OnLButtonDown(UINT nFlags, CPoint point)
6033 6046 // CWnd::OnLButtonDown(nFlags, point);
6034 6047  
6035 6048 SetFocus();
6036   - m_CurCol = -1;
  6049 +
6037 6050 m_bLMouseButtonDown = TRUE;
6038 6051 m_LeftClickDownPoint = point;
6039 6052 m_LeftClickDownCell = GetCellFromPt(point);
6040 6053 if (!IsValid(m_LeftClickDownCell))
6041 6054 return;
6042   - m_CurRow = m_LeftClickDownCell.row;
6043 6055  
6044 6056 // If the SHIFT key is not down, then the start of the selection area should be the
6045 6057 // cell just clicked. Otherwise, keep the previous selection-start-cell so the user
... ... @@ -6085,8 +6097,6 @@ void CGridCtrl::OnLButtonDown(UINT nFlags, CPoint point)
6085 6097 // (If the user moves the mouse, then dragging occurs)
6086 6098 else if (IsCellSelected(m_LeftClickDownCell))
6087 6099 {
6088   - SetFocusCell(m_LeftClickDownCell.row, m_LeftClickDownCell.col);
6089   -
6090 6100 // If control is pressed then unselect the cell or row (depending on the list mode)
6091 6101 if (nFlags & MK_CONTROL)
6092 6102 {
... ... @@ -6355,16 +6365,7 @@ void CGridCtrl::OnLButtonDown(UINT nFlags, CPoint point)
6355 6365 }
6356 6366  
6357 6367 if (m_LeftClickDownCell.row < GetFixedRowCount())
6358   - {
6359 6368 OnFixedRowClick(m_LeftClickDownCell);
6360   - if(m_AllowReorderColumn && m_LeftClickDownCell.col >= GetFixedColumnCount())
6361   - {
6362   - ResetSelectedRange(); // TODO : This is not the better solution, as we do not see why clicking in column header should reset selection
6363   - //but the state of selection is instable after drag (at least until someone debugs it), so better clear it allways.
6364   - m_MouseMode = MOUSE_PREPARE_DRAG;
6365   - m_CurCol = m_LeftClickDownCell.col;
6366   - }
6367   - }
6368 6369 else if (m_LeftClickDownCell.col < GetFixedColumnCount())
6369 6370 OnFixedColumnClick(m_LeftClickDownCell);
6370 6371 else
... ... @@ -6436,12 +6437,18 @@ void CGridCtrl::OnLButtonUp(UINT nFlags, CPoint point)
6436 6437 if (m_LeftClickDownPoint != point && (point.x != 0 || point.y != 0)) // 0 pt fix by email1@bierling.net
6437 6438 {
6438 6439 CPoint start;
  6440 + //Used for merge cells
  6441 + //by Huang Wei
  6442 + m_LeftClickDownCell=GetMergeCellID(m_LeftClickDownCell);
6439 6443 if (!GetCellOrigin(m_LeftClickDownCell, &start))
6440 6444 return;
6441 6445  
6442   - int nColumnWidth = __max(point.x - start.x, m_bAllowColHide? 0 : 1);
  6446 + int nColumnWidth = max(point.x - start.x, m_bAllowColHide? 0 : 1);
  6447 + //Used for merge cells
  6448 + //by Huang Wei
  6449 + int mergewidth=GetMergeCellWidth(m_LeftClickDownCell)-GetColumnWidth(m_LeftClickDownCell.col);
  6450 + SetColumnWidth(m_LeftClickDownCell.col, nColumnWidth-mergewidth);
6443 6451  
6444   - SetColumnWidth(m_LeftClickDownCell.col, nColumnWidth);
6445 6452 ResetScrollBars();
6446 6453 Invalidate();
6447 6454 }
... ... @@ -6462,12 +6469,18 @@ void CGridCtrl::OnLButtonUp(UINT nFlags, CPoint point)
6462 6469 if (m_LeftClickDownPoint != point && (point.x != 0 || point.y != 0)) // 0 pt fix by email1@bierling.net
6463 6470 {
6464 6471 CPoint start;
  6472 + //Used for merge cells
  6473 + //by Huang Wei
  6474 + m_LeftClickDownCell=GetMergeCellID(m_LeftClickDownCell);
6465 6475 if (!GetCellOrigin(m_LeftClickDownCell, &start))
6466 6476 return;
6467 6477  
6468   - int nRowHeight = __max(point.y - start.y, m_bAllowRowHide? 0 : 1);
  6478 + int nRowHeight = max(point.y - start.y, m_bAllowRowHide? 0 : 1);
  6479 + //Used for merge cells
  6480 + //by Huang Wei
  6481 + int mergeheight=GetMergeCellHeight(m_LeftClickDownCell)-GetRowHeight(m_LeftClickDownCell.row);
6469 6482  
6470   - SetRowHeight(m_LeftClickDownCell.row, nRowHeight);
  6483 + SetRowHeight(m_LeftClickDownCell.row, nRowHeight-mergeheight);
6471 6484 ResetScrollBars();
6472 6485 Invalidate();
6473 6486 }
... ... @@ -6509,7 +6522,6 @@ void CGridCtrl::OnRButtonDown(UINT nFlags, CPoint point)
6509 6522 #endif
6510 6523 }
6511 6524  
6512   -#include "resource.h"
6513 6525 // EFW - Added to forward right click to parent so that a context
6514 6526 // menu can be shown without deriving a new grid class.
6515 6527 void CGridCtrl::OnRButtonUp(UINT nFlags, CPoint point)
... ... @@ -6529,8 +6541,8 @@ void CGridCtrl::OnRButtonUp(UINT nFlags, CPoint point)
6529 6541 else
6530 6542 {
6531 6543 SetFocusCell(-1,-1);
6532   - SetFocusCell(__max(FocusCell.row, m_nFixedRows),
6533   - __max(FocusCell.col, m_nFixedCols));
  6544 + SetFocusCell(max(FocusCell.row, m_nFixedRows),
  6545 + max(FocusCell.col, m_nFixedCols));
6534 6546  
6535 6547 // tell the cell about it
6536 6548 CGridCellBase* pCell = GetCell(FocusCell.row, FocusCell.col);
... ... @@ -6539,13 +6551,6 @@ void CGridCtrl::OnRButtonUp(UINT nFlags, CPoint point)
6539 6551  
6540 6552 SendMessageToParent(FocusCell.row, FocusCell.col, NM_RCLICK);
6541 6553 }
6542   -
6543   - //右键菜单
6544   - CMenu menu;
6545   - menu.LoadMenu(IDR_MENU1);
6546   - CMenu *pPopup = menu.GetSubMenu(0);
6547   - GetCursorPos(&point);//获取当前光标的位置,以便使得菜单可以跟随光标
6548   - pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, GetParent());//在指定位置显示弹出菜单
6549 6554 }
6550 6555 #endif
6551 6556  
... ... @@ -6676,7 +6681,7 @@ void CGridCtrl::OnBeginPrinting(CDC *pDC, CPrintInfo *pInfo)
6676 6681  
6677 6682 // Create the printer font
6678 6683 int nFontSize = -10;
6679   - CString strFontName = _T("Arial");
  6684 + CString strFontName = L"Arial";
6680 6685 m_PrinterFont.CreateFont(nFontSize, 0,0,0, FW_NORMAL, 0,0,0, DEFAULT_CHARSET,
6681 6686 OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY,
6682 6687 DEFAULT_PITCH | FF_DONTCARE, strFontName);
... ... @@ -6894,6 +6899,25 @@ void CGridCtrl::OnPrint(CDC *pDC, CPrintInfo *pInfo)
6894 6899 BOOL bFirstPrintedRow = TRUE;
6895 6900 CRect rect;
6896 6901 rect.bottom = -1;
  6902 +
  6903 + //Used for merge cells
  6904 + //by Huang Wei
  6905 + int Row=m_nCurrPrintRow;
  6906 + CRect range;
  6907 + range.bottom = -1;
  6908 + while (Row < GetRowCount())
  6909 + {
  6910 + range.top = range.bottom+1;
  6911 + range.bottom = range.top + GetRowHeight(Row) - 1;
  6912 +
  6913 + if (range.bottom > m_nPageHeight)
  6914 + {
  6915 + range.bottom=range.top;
  6916 + break;
  6917 + }
  6918 + Row++;
  6919 + }
  6920 +
6897 6921 while (m_nCurrPrintRow < GetRowCount())
6898 6922 {
6899 6923 rect.top = rect.bottom+1;
... ... @@ -6916,34 +6940,60 @@ void CGridCtrl::OnPrint(CDC *pDC, CPrintInfo *pInfo)
6916 6940  
6917 6941 CGridCellBase* pCell = GetCell(m_nCurrPrintRow, col);
6918 6942 if (pCell)
6919   - pCell->PrintCell(pDC, m_nCurrPrintRow, col, rect);
  6943 + {
  6944 + //Used for merge cells
  6945 + //by Huang Wei
  6946 + int row=m_nCurrPrintRow;
  6947 + if(!pCell->IsMerged())
  6948 + {
  6949 + if(!pCell->IsMergeWithOthers())
  6950 + {
  6951 + pCell->PrintCell(pDC, row, col, rect);
  6952 + }
  6953 + }
  6954 + else
  6955 + {
  6956 + CRect mergerect=rect;
  6957 + if(GetCellRangeRect(pCell->m_MergeRange,&mergerect))
  6958 + {
  6959 + //mergerect.DeflateRect(0,0,1,1);
  6960 + mergerect.OffsetRect(rect.TopLeft()-mergerect.TopLeft());
  6961 + pCell->PrintCell(pDC, row, col, mergerect);
  6962 + }
  6963 + }
  6964 + }
6920 6965  
6921   - if (m_nGridLines == GVL_BOTH || m_nGridLines == GVL_HORZ)
6922   - {
6923   - int Overlap = (col == 0)? 0:1;
6924   - pDC->MoveTo(rect.left-Overlap, rect.bottom);
6925   - pDC->LineTo(rect.right, rect.bottom);
6926   - if (m_nCurrPrintRow == 0) {
6927   - pDC->MoveTo(rect.left-Overlap, rect.top);
6928   - pDC->LineTo(rect.right, rect.top);
6929   - }
6930   - }
6931   - if (m_nGridLines == GVL_BOTH || m_nGridLines == GVL_VERT)
6932   - {
6933   - int Overlap = (bFirstPrintedRow)? 0:1;
6934   - pDC->MoveTo(rect.right, rect.top-Overlap);
6935   - pDC->LineTo(rect.right, rect.bottom);
6936   - if (col == 0) {
6937   - pDC->MoveTo(rect.left, rect.top-Overlap);
6938   - pDC->LineTo(rect.left, rect.bottom);
6939   - }
6940   - }
  6966 + //if (m_nGridLines == GVL_BOTH || m_nGridLines == GVL_HORZ)
  6967 + //{
  6968 + // int Overlap = (col == 0)? 0:1;
  6969 + // pDC->MoveTo(rect.left-Overlap, rect.bottom);
  6970 + // pDC->LineTo(rect.right, rect.bottom);
  6971 + // if (m_nCurrPrintRow == 0) {
  6972 + // pDC->MoveTo(rect.left-Overlap, rect.top);
  6973 + // pDC->LineTo(rect.right, rect.top);
  6974 + // }
  6975 + //}
  6976 + //if (m_nGridLines == GVL_BOTH || m_nGridLines == GVL_VERT)
  6977 + //{
  6978 + // int Overlap = (bFirstPrintedRow)? 0:1;
  6979 + // pDC->MoveTo(rect.right, rect.top-Overlap);
  6980 + // pDC->LineTo(rect.right, rect.bottom);
  6981 + // if (col == 0) {
  6982 + // pDC->MoveTo(rect.left, rect.top-Overlap);
  6983 + // pDC->LineTo(rect.left, rect.bottom);
  6984 + // }
  6985 + //}
6941 6986  
6942 6987 }
6943 6988 m_nCurrPrintRow++;
6944 6989 bFirstPrintedRow = FALSE;
6945 6990 }
6946 6991  
  6992 + //Used for merge cells
  6993 + //by Huang Wei
  6994 + CRect white_rect(CPoint(0,0),m_LogicalPageSize);
  6995 + white_rect.top=range.bottom+1;
  6996 + pDC->FillSolidRect(white_rect,RGB(255,255,255));
6947 6997  
6948 6998 // Footer
6949 6999 pInfo->m_rectDraw.bottom = m_nFooterHeight * m_CharSize.cy;
... ... @@ -6973,37 +7023,58 @@ void CGridCtrl::PrintFixedRowCells(int nStartColumn, int nStopColumn, int&amp; row,
6973 7023  
6974 7024 CGridCellBase* pCell = GetCell(row, col);
6975 7025 if (pCell)
6976   - pCell->PrintCell(pDC, row, col, rect);
  7026 + {
  7027 + //Used for merge cells
  7028 + //by Huang Wei
  7029 + int row=m_nCurrPrintRow;
  7030 + if(!pCell->IsMerged())
  7031 + {
  7032 + if(!pCell->IsMergeWithOthers())
  7033 + {
  7034 + pCell->PrintCell(pDC, row, col, rect);
  7035 + }
  7036 + }
  7037 + else
  7038 + {
  7039 + CRect mergerect=rect;
  7040 + if(GetCellRangeRect(pCell->m_MergeRange,&mergerect))
  7041 + {
  7042 + //mergerect.DeflateRect(0,0,1,1);
  7043 + mergerect.OffsetRect(rect.TopLeft()-mergerect.TopLeft());
  7044 + pCell->PrintCell(pDC, row, col, mergerect);
  7045 + }
  7046 + }
  7047 + }
6977 7048  
6978   - if (m_nGridLines == GVL_BOTH || m_nGridLines == GVL_HORZ)
6979   - {
6980   - int Overlap = (col == 0)? 0:1;
6981   -
6982   - pDC->MoveTo(rect.left-Overlap, rect.bottom);
6983   - pDC->LineTo(rect.right, rect.bottom);
6984   -
6985   - if (row == 0)
6986   - {
6987   - pDC->MoveTo(rect.left-Overlap, rect.top);
6988   - pDC->LineTo(rect.right, rect.top);
6989   - }
6990   - }
6991   -
6992   - if (m_nGridLines == GVL_BOTH || m_nGridLines == GVL_VERT)
6993   - {
6994   - int Overlap = (row == 0)? 0:1;
6995   -
6996   - pDC->MoveTo(rect.right, rect.top-Overlap);
6997   - pDC->LineTo(rect.right, rect.bottom);
6998   -
6999   - if( bFirst)
7000   - {
7001   - pDC->MoveTo(rect.left-1, rect.top-Overlap);
7002   - pDC->LineTo(rect.left-1, rect.bottom);
7003   - bFirst = FALSE;
7004   - }
7005   -
7006   - }
  7049 + //if (m_nGridLines == GVL_BOTH || m_nGridLines == GVL_HORZ)
  7050 + //{
  7051 + // int Overlap = (col == 0)? 0:1;
  7052 + //
  7053 + // pDC->MoveTo(rect.left-Overlap, rect.bottom);
  7054 + // pDC->LineTo(rect.right, rect.bottom);
  7055 + //
  7056 + // if (row == 0)
  7057 + // {
  7058 + // pDC->MoveTo(rect.left-Overlap, rect.top);
  7059 + // pDC->LineTo(rect.right, rect.top);
  7060 + // }
  7061 + //}
  7062 +
  7063 + //if (m_nGridLines == GVL_BOTH || m_nGridLines == GVL_VERT)
  7064 + //{
  7065 + // int Overlap = (row == 0)? 0:1;
  7066 +
  7067 + // pDC->MoveTo(rect.right, rect.top-Overlap);
  7068 + // pDC->LineTo(rect.right, rect.bottom);
  7069 + //
  7070 + // if( bFirst)
  7071 + // {
  7072 + // pDC->MoveTo(rect.left-1, rect.top-Overlap);
  7073 + // pDC->LineTo(rect.left-1, rect.bottom);
  7074 + // bFirst = FALSE;
  7075 + // }
  7076 +
  7077 + // }
7007 7078  
7008 7079 } // end of column cells loop
7009 7080  
... ... @@ -7297,7 +7368,7 @@ BOOL CGridCtrl::Load(LPCTSTR filename, TCHAR chSeparator/*=_T(&#39;,&#39;)*/)
7297 7368 }
7298 7369  
7299 7370 // Read in rest of data
7300   - int nItem = 1;
  7371 + int nItem = 0;
7301 7372 while (File.ReadString(buffer, 1024))
7302 7373 {
7303 7374 // Get first token
... ... @@ -7567,24 +7638,116 @@ CString CGridCtrl::GetItemText(int nRow, int nCol) const
7567 7638  
7568 7639 return pCell->GetText();
7569 7640 }
7570   -
7571   -void CGridCtrl::ResetVirtualOrder()
  7641 +//Merge the selected cells
  7642 +//by Huang Wei
  7643 +CCellID CGridCtrl::GetMergeCellID(CCellID cell)
  7644 +{
  7645 + CGridCellBase *pCell = (CGridCellBase*) GetCell(cell);
  7646 + if(pCell && pCell->IsMergeWithOthers())
  7647 + return pCell->GetMergeCellID();
  7648 + return cell;
  7649 +}
  7650 +//Merge the selected cells
  7651 +//by Huang Wei
  7652 +CGridCellBase* CGridCtrl::GetCell(CCellID cell)
7572 7653 {
7573   - m_arRowOrder.resize(m_nRows);
7574   - for (int i = 0; i < m_nRows; i++)
  7654 + return GetCell(cell.row,cell.col);
  7655 +}
  7656 +//Merge the selected cells
  7657 +//by Huang Wei
  7658 +void CGridCtrl::MergeSelectedCells()
  7659 +{
  7660 + CCellRange range=GetSelectedCellRange();
  7661 + if(range.GetColSpan()<=1 && range.GetRowSpan()<=1)
  7662 + return;
  7663 + MergeCells(range.GetMinRow(), range.GetMinCol(), range.GetMaxRow(), range.GetMaxCol());
  7664 +}
  7665 +//Merge the selected cells
  7666 +//by Huang Wei
  7667 +void CGridCtrl::MergeCells(int nStartRow, int nStartCol, int nEndRow, int nEndCol)
  7668 +{
  7669 + for(int row=nStartRow;row<=nEndRow;row++)
7575 7670 {
7576   - m_arRowOrder[i] = i;
  7671 + for(int col=nStartCol;col<=nEndCol;col++)
  7672 + {
  7673 + CGridCellBase *pCell = (CGridCellBase*) GetCell(row,col);
  7674 + pCell->Show(false);
  7675 + if(row==nStartRow && col==nStartCol)
  7676 + {
  7677 + CCellRange range(nStartRow, nStartCol, nEndRow, nEndCol);
  7678 + pCell->SetMergeRange(range);
  7679 + }
  7680 + else
  7681 + {
  7682 + CCellID cell(nStartRow,nStartCol);
  7683 + pCell->SetMergeCellID(cell);
  7684 + }
  7685 +
  7686 + }
7577 7687 }
  7688 + Invalidate();
7578 7689 }
7579   -
7580   -
7581   -void CGridCtrl::Reorder(int From, int To)
  7690 +//Merge the selected cells
  7691 +//by Huang Wei
  7692 +void CGridCtrl::UnMergeSelectedCells()
7582 7693 {
7583   - // Set line From just after Line To
7584   - ASSERT(From>= GetFixedRowCount() && To>=GetFixedRowCount()-1 && From<m_nRows && To<m_nRows);
7585   - int Value = m_arRowOrder[From];
7586   - m_arRowOrder.erase(m_arRowOrder.begin()+From);
7587   - int Offset = (From>=To ? 1:0);
7588   - m_arRowOrder.insert(m_arRowOrder.begin()+To+Offset, Value);
  7694 + CCellRange range=GetSelectedCellRange();
  7695 + UnMergeCells(range.GetMinRow(), range.GetMinCol(), range.GetMaxRow(), range.GetMaxCol());
  7696 +}
  7697 +//Merge the selected cells
  7698 +//by Huang Wei
  7699 +void CGridCtrl::UnMergeCells(int nStartRow, int nStartCol, int nEndRow, int nEndCol)
  7700 +{
  7701 + for(int row=nStartRow;row<=nEndRow;row++)
  7702 + {
  7703 + for(int col=nStartCol;col<=nEndCol;col++)
  7704 + {
  7705 + CGridCellBase *pCell = (CGridCellBase*) GetCell(row,col);
  7706 + if(pCell->IsMerged())
  7707 + {
  7708 + for(int mergerow=pCell->GetMergeRange().GetMaxRow();mergerow>=pCell->GetMergeRange().GetMinRow();mergerow--)
  7709 + for(int mergecol=pCell->GetMergeRange().GetMaxCol();mergecol>=pCell->GetMergeRange().GetMinCol();mergecol--)
  7710 + {
  7711 + if(pCell->GetMergeRange().GetMaxRow()==-1 || pCell->GetMergeRange().GetMaxCol()==-1)
  7712 + break;
  7713 + CGridCellBase *pMergedCell = (CGridCellBase*) GetCell(mergerow,mergecol);
  7714 + pMergedCell->UnMerge();
  7715 + }
7589 7716  
  7717 + }
  7718 + else
  7719 + pCell->UnMerge();
  7720 + }
  7721 + }
  7722 + Invalidate();
  7723 +}
  7724 +//Merge the selected cells
  7725 +//by Huang Wei
  7726 +int CGridCtrl::GetMergeCellWidth(CCellID cell)
  7727 +{
  7728 + CCellID mergecell =GetMergeCellID(cell);
  7729 + CGridCellBase *pCell = (CGridCellBase*) GetCell(mergecell);
  7730 + if(!pCell->IsMerged())
  7731 + return GetColumnWidth(cell.col);
  7732 + int width=0;
  7733 + for(int mergecol=pCell->GetMergeRange().GetMaxCol();mergecol>=pCell->GetMergeRange().GetMinCol();mergecol--)
  7734 + {
  7735 + width+=GetColumnWidth(mergecol);
  7736 + }
  7737 + return width;
  7738 +}
  7739 +//Merge the selected cells
  7740 +//by Huang Wei
  7741 +int CGridCtrl::GetMergeCellHeight(CCellID cell)
  7742 +{
  7743 + CCellID mergecell =GetMergeCellID(cell);
  7744 + CGridCellBase *pCell = (CGridCellBase*) GetCell(mergecell);
  7745 + if(!pCell->IsMerged())
  7746 + return GetRowHeight(cell.row);
  7747 + int height=0;
  7748 + for(int mergerow=pCell->GetMergeRange().GetMaxRow();mergerow>=pCell->GetMergeRange().GetMinRow();mergerow--)
  7749 + {
  7750 + height+=GetRowHeight(mergerow);
  7751 + }
  7752 + return height;
7590 7753 }
... ...
central_clearing_system/ETradeClient/mfc_ui/GridCtrl.h
... ... @@ -3,8 +3,8 @@
3 3 //
4 4 // MFC Grid Control - main header
5 5 //
6   -// Written by Chris Maunder <chris@codeproject.com>
7   -// Copyright (c) 1998-2005. All Rights Reserved.
  6 +// Written by Chris Maunder <cmaunder@mail.com>
  7 +// Copyright (c) 1998-2002. All Rights Reserved.
8 8 //
9 9 // This code may be used in compiled form in any way you desire. This
10 10 // file may be redistributed unmodified by any means PROVIDING it is
... ... @@ -32,7 +32,6 @@
32 32 #include "CellRange.h"
33 33 #include "GridCell.h"
34 34 #include <afxtempl.h>
35   -#include <vector>
36 35  
37 36  
38 37 ///////////////////////////////////////////////////////////////////////////////////
... ... @@ -181,8 +180,6 @@ class CGridCtrl;
181 180 /////////////////////////////////////////////////////////////////////////////
182 181 // CGridCtrl window
183 182  
184   -typedef bool (*PVIRTUALCOMPARE)(int, int);
185   -
186 183 class CGridCtrl : public CWnd
187 184 {
188 185 DECLARE_DYNCREATE(CGridCtrl)
... ... @@ -537,6 +534,21 @@ public:
537 534  
538 535 // Implementation
539 536 public:
  537 + //Merge the selected cells
  538 + //by Huang Wei
  539 + CGridCellBase* GetCell(CCellID cell);
  540 + CCellID GetMergeCellID(CCellID cell);
  541 + void UnMergeSelectedCells();
  542 + void MergeSelectedCells();
  543 + void UnMergeCells(int nStartRow, int nStartCol, int nEndRow, int nEndCol);
  544 + void MergeCells(int nStartRow, int nStartCol, int nEndRow, int nEndCol);
  545 + int GetMergeCellWidth(CCellID cell);
  546 + int GetMergeCellHeight(CCellID cell);
  547 + BOOL GetCellOriginNoMerge(int nRow, int nCol, LPPOINT p);
  548 + BOOL GetCellOriginNoMerge(const CCellID& cell, LPPOINT p);
  549 +
  550 +
  551 +
540 552 virtual ~CGridCtrl();
541 553  
542 554 protected:
... ... @@ -566,7 +578,6 @@ protected:
566 578 CCellID GetTopleftNonFixedCell(BOOL bForceRecalculation = FALSE);
567 579 CCellRange GetUnobstructedNonFixedCellRange(BOOL bForceRecalculation = FALSE);
568 580 CCellRange GetVisibleNonFixedCellRange(LPRECT pRect = NULL, BOOL bForceRecalculation = FALSE);
569   - CCellRange GetVisibleFixedCellRange(LPRECT pRect = NULL, BOOL bForceRecalculation = FALSE);
570 581  
571 582 BOOL IsVisibleVScroll() { return ( (m_nBarState & GVL_VERT) > 0); }
572 583 BOOL IsVisibleHScroll() { return ( (m_nBarState & GVL_HORZ) > 0); }
... ... @@ -681,7 +692,7 @@ protected:
681 692 CPoint m_LeftClickDownPoint, m_LastMousePoint;
682 693 CCellID m_LeftClickDownCell, m_SelectionStartCell;
683 694 CCellID m_idCurrentCell, m_idTopLeftCell;
684   - INT_PTR m_nTimerID;
  695 + int m_nTimerID;
685 696 int m_nTimerInterval;
686 697 int m_nResizeCaptureRange;
687 698 BOOL m_bAllowRowResize, m_bAllowColumnResize;
... ... @@ -787,34 +798,6 @@ protected:
787 798 MOUSE_PREPARE_DRAG, MOUSE_DRAGGING
788 799 #endif
789 800 };
790   -// for sort in virtual mode, and column order, save and load layer
791   -public:
792   - typedef std::vector<int> intlist;
793   - void Reorder(int From, int To);
794   - void SetVirtualCompare(PVIRTUALCOMPARE VirtualCompare) { m_pfnVirtualCompare = VirtualCompare;}
795   - int m_CurCol;
796   - void AllowReorderColumn(bool b=true) { m_AllowReorderColumn = b;}
797   - void EnableDragRowMode(bool b=true) { m_bDragRowMode = b; if(b) EnableDragAndDrop(); } // to change row order
798   - int GetLayer(int** pLayer); // gives back the number of ints of the area (do not forget to delete *pLayer)
799   - void SetLayer(int* pLayer); // coming from a previous GetLayer (ignored if not same number of column, or the same revision number)
800   - void ForceQuitFocusOnTab(bool b=true) { m_QuitFocusOnTab = b;} // use only if GetParent() is a CDialog
801   - void AllowSelectRowInFixedCol(bool b=true) { m_AllowSelectRowInFixedCol = b;} //
802   -// allow acces?
803   - intlist m_arRowOrder, m_arColOrder;
804   - static CGridCtrl* m_This;
805   -protected:
806   - virtual void AddSubVirtualRow(int Num, int Nb);
807   - bool m_bDragRowMode;
808   - int m_CurRow;
809   -private:
810   - void ResetVirtualOrder();
811   - PVIRTUALCOMPARE m_pfnVirtualCompare;
812   - static bool NotVirtualCompare(int c1, int c2);
813   - bool m_InDestructor;
814   - bool m_AllowReorderColumn;
815   - bool m_QuitFocusOnTab;
816   - bool m_AllowSelectRowInFixedCol;
817   -
818 801 };
819 802  
820 803 // Returns the default cell implementation for the given grid region
... ... @@ -853,18 +836,12 @@ inline CGridCellBase* CGridCtrl::GetCell(int nRow, int nCol) const
853 836 if (nRow < GetFixedRowCount()) gvdi.item.nState |= (GVIS_FIXED | GVIS_FIXEDROW);
854 837 if (nCol < GetFixedColumnCount()) gvdi.item.nState |= (GVIS_FIXED | GVIS_FIXEDCOL);
855 838 if (GetFocusCell() == CCellID(nRow, nCol)) gvdi.item.nState |= GVIS_FOCUSED;
856   - if(!m_InDestructor)
857   - {
858   - gvdi.item.row = m_arRowOrder[nRow];
859   - gvdi.item.col = m_arColOrder[nCol];
860   -
861   - if (m_pfnCallback)
862   - m_pfnCallback(&gvdi, m_lParam);
863   - else
864   - SendDisplayRequestToParent(&gvdi);
865   - gvdi.item.row = nRow;
866   - gvdi.item.col = nCol;
867   - }
  839 +
  840 + if (m_pfnCallback)
  841 + m_pfnCallback(&gvdi, m_lParam);
  842 + else
  843 + SendDisplayRequestToParent(&gvdi);
  844 +
868 845 static CGridCell cell;
869 846 cell.SetState(gvdi.item.nState);
870 847 cell.SetFormat(gvdi.item.nFormat);
... ... @@ -882,7 +859,7 @@ inline CGridCellBase* CGridCtrl::GetCell(int nRow, int nCol) const
882 859  
883 860 GRID_ROW* pRow = m_RowData[nRow];
884 861 if (!pRow) return NULL;
885   - return pRow->GetAt(m_arColOrder[nCol]);
  862 + return pRow->GetAt(nCol);
886 863 }
887 864  
888 865 inline BOOL CGridCtrl::SetCell(int nRow, int nCol, CGridCellBase* pCell)
... ...
central_clearing_system/ETradeClient/mfc_ui/GridDropTarget.cpp
... ... @@ -6,8 +6,8 @@
6 6 // is handle the drag and drop windows messages and pass them
7 7 // directly onto the grid control.
8 8 //
9   -// Written by Chris Maunder <chris@codeproject.com>
10   -// Copyright (c) 1998-2005. All Rights Reserved.
  9 +// Written by Chris Maunder <cmaunder@mail.com>
  10 +// Copyright (c) 1998-2002. All Rights Reserved.
11 11 //
12 12 // This code may be used in compiled form in any way you desire. This
13 13 // file may be redistributed unmodified by any means PROVIDING it is
... ...
central_clearing_system/ETradeClient/mfc_ui/GridDropTarget.h
... ... @@ -3,8 +3,8 @@
3 3 //
4 4 // MFC Grid Control - Drag/Drop target implementation
5 5 //
6   -// Written by Chris Maunder <chris@codeproject.com>
7   -// Copyright (c) 1998-2005. All Rights Reserved.
  6 +// Written by Chris Maunder <cmaunder@mail.com>
  7 +// Copyright (c) 1998-2002. All Rights Reserved.
8 8 //
9 9 // This code may be used in compiled form in any way you desire. This
10 10 // file may be redistributed unmodified by any means PROVIDING it is
... ...
central_clearing_system/ETradeClient/mfc_ui/InPlaceEdit.h
... ... @@ -3,8 +3,8 @@
3 3 //
4 4 // MFC Grid Control - inplace editing class
5 5 //
6   -// Written by Chris Maunder <chris@codeproject.com>
7   -// Copyright (c) 1998-2005. All Rights Reserved.
  6 +// Written by Chris Maunder <cmaunder@mail.com>
  7 +// Copyright (c) 1998-2002. All Rights Reserved.
8 8 //
9 9 // This code may be used in compiled form in any way you desire. This
10 10 // file may be redistributed unmodified by any means PROVIDING it is
... ...
central_clearing_system/ETradeClient/mfc_ui/MemDC.h
... ... @@ -8,7 +8,7 @@
8 8 //
9 9  
10 10 //////////////////////////////////////////////////
11   -// CGridMemDC - memory DC
  11 +// CMemDC - memory DC
12 12 //
13 13 // Author: Keith Rule
14 14 // Email: keithr@europa.com
... ... @@ -92,7 +92,7 @@ public:
92 92  
93 93 private:
94 94 CBitmap m_bitmap; // Offscreen bitmap
95   - CBitmap* m_pOldBitmap; // bitmap originally found in CGridMemDC
  95 + CBitmap* m_pOldBitmap; // bitmap originally found in CMemDC
96 96 CDC* m_pDC; // Saves CDC passed in constructor
97 97 CRect m_rect; // Rectangle of drawing area.
98 98 BOOL m_bMemDC; // TRUE if CDC really is a Memory DC.
... ...
central_clearing_system/ETradeClient/mfc_ui/TitleTip.h
... ... @@ -3,8 +3,8 @@
3 3 //
4 4 // MFC Grid Control - cell titletips
5 5 //
6   -// Written by Chris Maunder <chris@codeproject.com>
7   -// Copyright (c) 1998-2005. All Rights Reserved.
  6 +// Written by Chris Maunder <cmaunder@mail.com>
  7 +// Copyright (c) 1998-2001. All Rights Reserved.
8 8 //
9 9 // This code may be used in compiled form in any way you desire. This
10 10 // file may be redistributed unmodified by any means PROVIDING it is
... ...
central_clearing_system/ETradeClient/mfc_ui/pay_dlg.cpp 0 → 100644
  1 +// D:\GitProject\etradeclient\central_clearing_system\ETradeClient\mfc_ui\pay_dlg.cpp : 实现文件
  2 +//
  3 +
  4 +#include "stdafx.h"
  5 +#include "ETradeClient.h"
  6 +#include "D:\GitProject\etradeclient\central_clearing_system\ETradeClient\mfc_ui\pay_dlg.h"
  7 +#include "afxdialogex.h"
  8 +
  9 +
  10 +// PayDlg 对话框
  11 +
  12 +IMPLEMENT_DYNAMIC(PayDlg, CDialogEx)
  13 +
  14 +PayDlg::PayDlg(CWnd* pParent /*=NULL*/)
  15 + : CDialogEx(PayDlg::IDD, pParent)
  16 +{
  17 +
  18 +}
  19 +
  20 +PayDlg::~PayDlg()
  21 +{
  22 +}
  23 +
  24 +void PayDlg::DoDataExchange(CDataExchange* pDX)
  25 +{
  26 + CDialogEx::DoDataExchange(pDX);
  27 + DDX_Control(pDX, IDC_PAY_STATIC_TOTAL_MONEY, total_money_static_);
  28 + DDX_Control(pDX, IDC_PAY_STATIC_REAL_MONEY, real_money_static_);
  29 + DDX_Control(pDX, IDC_PAY_STATIC_PASSWORD, password_static_);
  30 + DDX_Control(pDX, IDC_PAY_EDIT_PASSWORD, password_edit_);
  31 + DDX_Control(pDX, IDC_PAY_BUTTON_PAY, pay_button_);
  32 + DDX_Control(pDX, IDC_PAY_BUTTON_CLOSE, close_button_);
  33 + DDX_Control(pDX, IDC_PAY_BUTTON_PASSWORD, password_button_);
  34 +}
  35 +
  36 +
  37 +BEGIN_MESSAGE_MAP(PayDlg, CDialogEx)
  38 + ON_BN_CLICKED(IDC_PAY_BUTTON_CLOSE, &PayDlg::OnBnClickedPayButtonClose)
  39 +END_MESSAGE_MAP()
  40 +
  41 +
  42 +// PayDlg 消息处理程序
  43 +
  44 +
  45 +BOOL PayDlg::OnInitDialog()
  46 +{
  47 + CDialogEx::OnInitDialog();
  48 +
  49 + SetCtrlPos();
  50 +
  51 + return TRUE; // return TRUE unless you set the focus to a control
  52 + // 异常: OCX 属性页应返回 FALSE
  53 +}
  54 +
  55 +void PayDlg::SetCtrlPos()
  56 +{
  57 + const int StaticWidth = 80, StaticHeigth = 35;
  58 + const int EditWidth = 140, EditHeigth = 35;
  59 + const int EditWidthShort = 70, StaticWidthShort = 70;
  60 + const int ButtonWidth = 120, ButtonHeight = 40;
  61 +
  62 + CRect ctrl_rect;
  63 + ctrl_rect.top = 30 + 10;
  64 + ctrl_rect.bottom = ctrl_rect.top + StaticHeigth;
  65 + ctrl_rect.left = 30;
  66 + ctrl_rect.right = ctrl_rect.left + StaticWidth;
  67 + total_money_static_.MoveWindow(&ctrl_rect);
  68 +
  69 + ctrl_rect.left = ctrl_rect.right;
  70 + ctrl_rect.right += StaticWidth;
  71 + real_money_static_.MoveWindow(&ctrl_rect);
  72 +
  73 + ctrl_rect.top = ctrl_rect.bottom + 30;
  74 + ctrl_rect.bottom = ctrl_rect.top + StaticHeigth;
  75 + ctrl_rect.left = 30;
  76 + ctrl_rect.right = ctrl_rect.left + StaticWidth;
  77 + password_static_.MoveWindow(ctrl_rect);
  78 +
  79 + ctrl_rect.left = ctrl_rect.right;
  80 + ctrl_rect.right += EditWidth;
  81 + password_edit_.MoveWindow(&ctrl_rect);
  82 +
  83 + ctrl_rect.left = ctrl_rect.right + 10;
  84 + ctrl_rect.right += ButtonWidth;
  85 + password_button_.MoveWindow(&ctrl_rect);
  86 +
  87 + CRect dlg_rect;
  88 + GetClientRect(&dlg_rect);
  89 + ctrl_rect.bottom = dlg_rect.bottom;
  90 + ctrl_rect.top = ctrl_rect.bottom - ButtonHeight;
  91 + ctrl_rect.right = dlg_rect.right - 100;
  92 + ctrl_rect.left = ctrl_rect.right - ButtonWidth;
  93 + close_button_.MoveWindow(&ctrl_rect);
  94 +
  95 + ctrl_rect.right = ctrl_rect.left - 100;
  96 + ctrl_rect.left = ctrl_rect.right - ButtonWidth;
  97 + pay_button_.MoveWindow(ctrl_rect);
  98 +
  99 + CRect rect;
  100 + password_edit_.GetClientRect(&rect);
  101 + OffsetRect(&rect, 0, 10);
  102 + password_edit_.SendMessage(EM_SETRECT, 0, (LPARAM)&rect);
  103 +
  104 + password_edit_.EnableWindow(FALSE);
  105 +}
  106 +
  107 +void PayDlg::OnBnClickedPayButtonClose()
  108 +{
  109 + CDialogEx::OnCancel();
  110 +}
... ...
central_clearing_system/ETradeClient/mfc_ui/pay_dlg.h 0 → 100644
  1 +#pragma once
  2 +#include "afxwin.h"
  3 +
  4 +
  5 +// PayDlg 对话框
  6 +
  7 +class PayDlg : public CDialogEx
  8 +{
  9 + DECLARE_DYNAMIC(PayDlg)
  10 +
  11 +public:
  12 + PayDlg(CWnd* pParent = NULL); // 标准构造函数
  13 + virtual ~PayDlg();
  14 +
  15 +// 对话框数据
  16 + enum { IDD = IDD_DIALOG_PAY };
  17 +
  18 +protected:
  19 + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
  20 +
  21 + DECLARE_MESSAGE_MAP()
  22 +public:
  23 + virtual BOOL OnInitDialog();
  24 + CStatic total_money_static_;
  25 + CStatic real_money_static_;
  26 + CStatic password_static_;
  27 + CEdit password_edit_;
  28 + CButton pay_button_;
  29 + CButton close_button_;
  30 +
  31 + void SetCtrlPos();
  32 + afx_msg void OnBnClickedPayButtonClose();
  33 + CButton password_button_;
  34 +};
... ...
central_clearing_system/ETradeClient/mfc_ui/place_order_dlg.cpp
... ... @@ -12,6 +12,8 @@
12 12 #include "etradeclient/browser/session.h"
13 13 #include "ETradeClient/utility/string_converter.h"
14 14 #include "ETradeClient/utility/win_msg_define.h"
  15 +#include <vector>
  16 +#include "pay_dlg.h"
15 17  
16 18  
17 19 // PlaceOrderDlg 对话框
... ... @@ -23,15 +25,6 @@ PlaceOrderDlg::PlaceOrderDlg(CWnd* pParent /*=NULL*/)
23 25 {
24 26 line_pen_.CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
25 27 edit_brush_.CreateSolidBrush(RGB(245, 247, 250));
26   - /*error_count_ = 6;
27   - card_num_ = ErrorCode;
28   - card_name_ = ErrorCode;
29   - comm_num_ = ErrorCode;
30   - comm_name_ = ErrorCode;
31   - unit_ = ErrorCode;
32   - heavy_ = ErrorCode;
33   - price_ = ErrorCode;
34   - count_ = ErrorCode;*/
35 28 }
36 29  
37 30 PlaceOrderDlg::~PlaceOrderDlg()
... ... @@ -61,6 +54,10 @@ void PlaceOrderDlg::DoDataExchange(CDataExchange* pDX)
61 54 DDX_Control(pDX, IDC_STATIC_HEJI, total_money_static_);
62 55 DDX_Control(pDX, IDC_STATIC_TOTAL_MONEY, total_real_money_static_);
63 56 DDX_Control(pDX, IDC_STATIC_ERROR, error_static_);
  57 + DDX_Control(pDX, IDC_STATIC_BUYER, buyer_static_);
  58 + DDX_Control(pDX, IDC_EDIT_BUYER_CARD, buyer_card_edit_);
  59 + DDX_Control(pDX, IDC_EDIT_BUYER_NAME, buyer_name_edit_);
  60 + DDX_Control(pDX, IDC_BUTTON_SWIP_CARD, swip_card_button_);
64 61 }
65 62  
66 63  
... ... @@ -135,8 +132,32 @@ void PlaceOrderDlg::SetCtrlPos()
135 132 ctrl_rect.bottom = ctrl_rect.top + StaticHeigth;
136 133 ctrl_rect.left = 30;
137 134 ctrl_rect.right = ctrl_rect.left + StaticWidth;
  135 + buyer_static_.MoveWindow(ctrl_rect);
  136 +
  137 + ctrl_rect.top -= 10;
  138 + ctrl_rect.left = ctrl_rect.right;
  139 + ctrl_rect.right += EditWidth;
  140 + buyer_card_edit_.MoveWindow(&ctrl_rect);
  141 +
  142 + line_point_[3].x = ctrl_rect.right + 3;
  143 + line_point_[3].y = ctrl_rect.bottom - EditHeigth / 2 - 3;
  144 +
  145 + ctrl_rect.left = ctrl_rect.right + 30;
  146 + ctrl_rect.right = ctrl_rect.left + EditWidth;
  147 + buyer_name_edit_.MoveWindow(&ctrl_rect);
  148 +
  149 + const int ButtonWidth = 120, ButtonHeight = 40;
  150 + ctrl_rect.left = ctrl_rect.right + 30;
  151 + ctrl_rect.right = ctrl_rect.left + ButtonWidth;
  152 + swip_card_button_.MoveWindow(&ctrl_rect);
  153 +
  154 +
  155 + ctrl_rect.top = ctrl_rect.bottom + 30;
  156 + ctrl_rect.bottom = ctrl_rect.top + StaticHeigth;
  157 + ctrl_rect.left = 30;
  158 + ctrl_rect.right = ctrl_rect.left + StaticWidth;
138 159 owner_static_.MoveWindow(ctrl_rect);
139   - ctrl_rect.top = 30;
  160 + ctrl_rect.top -= 10;
140 161  
141 162 ctrl_rect.left = ctrl_rect.right;
142 163 ctrl_rect.right += EditWidth;
... ... @@ -230,7 +251,7 @@ void PlaceOrderDlg::SetCtrlPos()
230 251  
231 252 ctrl_rect.top = ctrl_rect.bottom + 5;
232 253 ctrl_rect.bottom = dlg_rect.bottom;
233   - ctrl_rect.right = dlg_rect.right - TotalMoneyStaticWidth - 10;
  254 + ctrl_rect.right = dlg_rect.right - TotalMoneyStaticWidth - 100 - ButtonWidth;
234 255 ctrl_rect.left = ctrl_rect.right - TotalMoneyStaticWidth;
235 256 total_money_static_.MoveWindow(&ctrl_rect);
236 257  
... ... @@ -238,9 +259,6 @@ void PlaceOrderDlg::SetCtrlPos()
238 259 ctrl_rect.right = dlg_rect.right;
239 260 total_real_money_static_.MoveWindow(&ctrl_rect);
240 261  
241   - const int ButtonWidth = 120, ButtonHeight = 40;
242   - ctrl_rect.top = 10;
243   - ctrl_rect.bottom = ctrl_rect.top + ButtonHeight;
244 262 ctrl_rect.right = dlg_rect.right - 10;
245 263 ctrl_rect.left = ctrl_rect.right - ButtonWidth;
246 264 pay_button_.MoveWindow(&ctrl_rect);
... ... @@ -280,6 +298,17 @@ void PlaceOrderDlg::SetCtrlPos()
280 298 count_edit_.GetClientRect(&rect);
281 299 OffsetRect(&rect, 0, 10);
282 300 count_edit_.SendMessage(EM_SETRECT, 0, (LPARAM)&rect);
  301 +
  302 + buyer_card_edit_.GetClientRect(&rect);
  303 + OffsetRect(&rect, 0, 10);
  304 + buyer_card_edit_.SendMessage(EM_SETRECT, 0, (LPARAM)&rect);
  305 +
  306 + buyer_name_edit_.GetClientRect(&rect);
  307 + OffsetRect(&rect, 0, 10);
  308 + buyer_name_edit_.SendMessage(EM_SETRECT, 0, (LPARAM)&rect);
  309 +
  310 + buyer_card_edit_.EnableWindow(FALSE);
  311 + buyer_name_edit_.EnableWindow(FALSE);
283 312 }
284 313  
285 314 void PlaceOrderDlg::OnPaint()
... ... @@ -293,6 +322,9 @@ void PlaceOrderDlg::OnPaint()
293 322 dc.MoveTo(line_point_[1]);
294 323 dc.LineTo(line_point_[1].x + 24, line_point_[1].y);
295 324  
  325 + dc.MoveTo(line_point_[3]);
  326 + dc.LineTo(line_point_[3].x + 24, line_point_[3].y);
  327 +
296 328 dc.SelectObject(old_pen);
297 329  
298 330 CDialogEx::OnPaint();
... ... @@ -317,7 +349,8 @@ HBRUSH PlaceOrderDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
317 349  
318 350 void PlaceOrderDlg::OnBnClickedButtonPay()
319 351 {
320   - SetErrorMsg(CString(L"anniuanniu"));
  352 + PayDlg pay_dlg;
  353 + pay_dlg.DoModal();
321 354 }
322 355  
323 356 void PlaceOrderDlg::InitList()
... ... @@ -346,12 +379,12 @@ void PlaceOrderDlg::InitList()
346 379  
347 380 product_list_.SetEditable(FALSE);
348 381  
  382 + product_list_.SetFixedRowCount(1);
  383 + product_list_.SetFixedColumnCount(2);
349 384  
350 385 product_list_.SetListMode(TRUE);
351   - product_list_.SetSingleRowSelection(TRUE);
352   -
353   - product_list_.SetFixedColumnCount(1);
354   - product_list_.SetFixedColumnCount(2);
  386 + product_list_.SetSingleColSelection(TRUE);
  387 + product_list_.SetSingleRowSelection(FALSE);
355 388  
356 389 product_list_.SetRowResize(FALSE);
357 390 product_list_.SetColumnResize(FALSE);
... ... @@ -377,7 +410,12 @@ void PlaceOrderDlg::OnAcceleratorTab()
377 410 }
378 411 void PlaceOrderDlg::OnAcceleratorEnter()
379 412 {
380   - OnEditKillFocus(GetFocus()->GetDlgCtrlID(), NULL);
  413 + OnEditKillFocus(IDC_EDIT_CARD, NULL);
  414 + OnEditKillFocus(IDC_EDIT_COMM_NUM, NULL);
  415 + OnEditKillFocus(IDC_EDIT_UNIT, NULL);
  416 + OnEditKillFocus(IDC_EDIT_HEAVY, NULL);
  417 + OnEditKillFocus(IDC_EDIT_PRICE, NULL);
  418 + OnEditKillFocus(IDC_EDIT_COUNT, NULL);
381 419  
382 420 do
383 421 {
... ... @@ -423,8 +461,22 @@ void PlaceOrderDlg::OnAcceleratorEnter()
423 461 product_list_.SetItemFormat(row_index, index, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
424 462 }
425 463  
426   - product_list_.
427   -
  464 + EmptyCtrl();
  465 + SortList();
  466 +
  467 + CString subtotal;
  468 + double total_price = 0;
  469 + int list_count = product_list_.GetRowCount();
  470 + for (int index = 1; index <= count; ++index)
  471 + {
  472 + subtotal = product_list_.GetItemText(index, 7);
  473 + total_price += _ttof(subtotal);
  474 + }
  475 +
  476 + CString total_price_s;
  477 + total_price_s.Format(L"%.2f", total_price);
  478 + total_real_money_static_.SetWindowText(total_price_s);
  479 +
428 480 } while (0);
429 481  
430 482 UpdateWindow();
... ... @@ -530,6 +582,12 @@ LRESULT PlaceOrderDlg::OnEditKillFocus(WPARAM wParam, LPARAM lParam)
530 582 break;
531 583 }
532 584 case IDC_EDIT_HEAVY:
  585 + {
  586 + if (!heavy_edit_.IsWindowEnabled())
  587 + {
  588 + break;
  589 + }
  590 + }
533 591 case IDC_EDIT_PRICE:
534 592 case IDC_EDIT_COUNT:
535 593 {
... ... @@ -690,3 +748,75 @@ void PlaceOrderDlg::OnSetFocus(CWnd* pOldWnd)
690 748 // TODO: 在此处添加消息处理程序代码
691 749 }
692 750  
  751 +void PlaceOrderDlg::SortList()
  752 +{
  753 + product_list_.SortItems(0, TRUE);
  754 +
  755 +
  756 + int row_count = product_list_.GetRowCount();
  757 + CString card_num, old_card_num;
  758 +
  759 + struct CombineRange
  760 + {
  761 + int start_row;
  762 + int end_row;
  763 + struct CombineRange()
  764 + {
  765 + start_row = 0;
  766 + end_row = 0;
  767 + }
  768 +
  769 + struct CombineRange(int start, int end)
  770 + {
  771 + start_row = start;
  772 + end_row = end;
  773 + };
  774 + };
  775 +
  776 + std::vector<CombineRange> combine_list;
  777 + int start_row = 0, end_row = 0;
  778 + for (int index = 1; index <= row_count; ++index)
  779 + {
  780 + card_num = product_list_.GetItemText(index, 0);
  781 + if (card_num.Compare(old_card_num) == 0)
  782 + {
  783 + end_row++;
  784 + }
  785 + else
  786 + {
  787 + if (start_row != end_row)
  788 + {
  789 + combine_list.push_back(CombineRange(start_row, end_row));
  790 + }
  791 + old_card_num = card_num;
  792 + start_row = index;
  793 + end_row = start_row;
  794 + }
  795 + }
  796 +
  797 + int combine_count = combine_list.size();
  798 + for (int index = 0; index < combine_count; ++index)
  799 + {
  800 + product_list_.MergeCells(combine_list[index].start_row, 0, combine_list[index].end_row, 0);
  801 + product_list_.MergeCells(combine_list[index].start_row, 1, combine_list[index].end_row, 1);
  802 + }
  803 +
  804 + product_list_.Invalidate(TRUE);
  805 +}
  806 +
  807 +void PlaceOrderDlg::EmptyCtrl()
  808 +{
  809 + card_edit_.SetWindowText(L"8888");
  810 + name_edit_.SetWindowText(L"");
  811 + comm_num_edit_.SetWindowText(L"");
  812 + comm_name_edit_.SetWindowText(L"");
  813 + unit_edit_.SetWindowText(L"");;
  814 + real_unit_static.SetWindowText(L"斤");
  815 + heavy_edit_.SetWindowText(L"");
  816 + heavy_edit_.EnableWindow(FALSE);
  817 + price_edit_.SetWindowText(L"");
  818 + count_edit_.SetWindowText(L"");
  819 +
  820 + card_edit_.SetFocus();
  821 + card_edit_.SetSel(4, 4);
  822 +}
693 823 \ No newline at end of file
... ...
central_clearing_system/ETradeClient/mfc_ui/place_order_dlg.h
... ... @@ -59,7 +59,7 @@ public:
59 59 CGridCtrl product_list_;
60 60  
61 61 CPen line_pen_;
62   - CPoint line_point_[2];
  62 + CPoint line_point_[3];
63 63  
64 64 CBrush edit_brush_;
65 65 public:
... ... @@ -89,20 +89,11 @@ public:
89 89 afx_msg void OnAcceleratorUp();
90 90 afx_msg void OnSetFocus(CWnd* pOldWnd);
91 91  
92   - //bool CheckCardData(CString card_data);
93   - //bool CheckCommData(CString comm_data);
94   - //bool CheckUnitData(CString unit_data);
95   - //bool CheckPriceData(CString price_data);
96   - //bool CheckCountData(CString count_data);
97   -
98   - //CString card_num_;
99   - //CString card_name_;
100   - //CString comm_num_;
101   - //CString comm_name_;
102   - //CString unit_;
103   - //CString heavy_;
104   - //CString price_;
105   - //CString count_;
106   - //int error_count_;
107   - //const CString ErrorCode = L"-9000";
  92 + void SortList();
  93 +
  94 + void EmptyCtrl();
  95 + CStatic buyer_static_;
  96 + CEditBox buyer_card_edit_;
  97 + CEditBox buyer_name_edit_;
  98 + CButton swip_card_button_;
108 99 };
... ...
central_clearing_system/Resource.h
... ... @@ -15,6 +15,7 @@
15 15 #define IDD_DIALOG_PLACE_ORDER 327
16 16 #define IDR_MENU1 329
17 17 #define IDR_ACCELERATOR_ORDER 330
  18 +#define IDD_DIALOG_PAY 331
18 19 #define IDC_USERNAME 1000
19 20 #define IDC_PWD 1001
20 21 #define IDC_ACCOUNT_EDIT 1002
... ... @@ -36,6 +37,8 @@
36 37 #define IDC_BUTTON1 1019
37 38 #define IDC_BUTTON_ERROR_ICO 1019
38 39 #define IDC_BUTTON_PAY 1019
  40 +#define IDC_PAY_BUTTON_PASSWORD 1019
  41 +#define IDC_BUTTON_SWIP_CARD 1022
39 42 #define IDC_GRID_PRODUCT 1024
40 43 #define IDC_EDIT_CARD 1025
41 44 #define IDC_EDIT_NAME 1026
... ... @@ -55,6 +58,16 @@
55 58 #define IDC_STATIC_HEJI 1042
56 59 #define IDC_STATIC_TOTAL_MONEY 1043
57 60 #define IDC_STATIC_ERROR 1046
  61 +#define IDC_PAY_STATIC_TOTAL_MONEY 1047
  62 +#define IDC_PAY_STATIC_MONEY 1048
  63 +#define IDC_STATIC_BUYER 1049
  64 +#define IDC_PAY_STATIC_PASSWORD 1049
  65 +#define IDC_EDIT_BUYER_NAME 1050
  66 +#define IDC_PAY_EDIT_PASSWORD 1050
  67 +#define IDC_EDIT_BUYER_CARD 1051
  68 +#define IDC_PAY_BUTTON_CLOSE 1051
  69 +#define IDC_PAY_BUTTON_PAY 1052
  70 +#define IDC_PAY_STATIC_REAL_MONEY 1053
58 71 #define ID_PAY_FEE 10001
59 72 #define ID_ORDER 10002
60 73 #define ID_STATEMENT_MANAGE 10003
... ... @@ -73,16 +86,15 @@
73 86 #define ID_ACCELERATOR_TAB 32851
74 87 #define ID_ACCELERATOR_ENTER 32852
75 88 #define ID_ACCELERATOR_UP 32854
76   -#define ID_ACCELERATOR_LEFT 32855
77 89 #define ID_ACCELERATOR_DOWN 32855
78 90  
79 91 // Next default values for new objects
80 92 //
81 93 #ifdef APSTUDIO_INVOKED
82 94 #ifndef APSTUDIO_READONLY_SYMBOLS
83   -#define _APS_NEXT_RESOURCE_VALUE 331
  95 +#define _APS_NEXT_RESOURCE_VALUE 332
84 96 #define _APS_NEXT_COMMAND_VALUE 32857
85   -#define _APS_NEXT_CONTROL_VALUE 1047
  97 +#define _APS_NEXT_CONTROL_VALUE 1054
86 98 #define _APS_NEXT_SYMED_VALUE 311
87 99 #endif
88 100 #endif
... ...