MultilineListDemoDlg.cpp
上传用户:tony_wxd
上传日期:2022-06-16
资源大小:40k
文件大小:7k
源码类别:

ListView/ListBox

开发平台:

Visual C++

  1. // MultilineListDemoDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "MultilineListDemo.h"
  5. #include "MultilineListDemoDlg.h"
  6. #include ".multilinelistdemodlg.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #endif
  10. // CAboutDlg dialog used for App About
  11. class CAboutDlg : public CDialog
  12. {
  13. public:
  14. CAboutDlg();
  15. // Dialog Data
  16. enum { IDD = IDD_ABOUTBOX };
  17. protected:
  18. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  19. // Implementation
  20. protected:
  21. DECLARE_MESSAGE_MAP()
  22. };
  23. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  24. {
  25. }
  26. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  27. {
  28. CDialog::DoDataExchange(pDX);
  29. }
  30. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  31. END_MESSAGE_MAP()
  32. // CMultilineListDemoDlg dialog
  33. CMultilineListDemoDlg::CMultilineListDemoDlg(CWnd* pParent /*=NULL*/)
  34. : CDialog(CMultilineListDemoDlg::IDD, pParent)
  35. {
  36. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  37.    m_initialized = FALSE;
  38. }
  39. void CMultilineListDemoDlg::DoDataExchange(CDataExchange* pDX)
  40. {
  41.    CDialog::DoDataExchange(pDX);
  42.    DDX_Control(pDX, IDC_ITEMS, m_items);
  43. }
  44. BEGIN_MESSAGE_MAP(CMultilineListDemoDlg, CDialog)
  45. ON_WM_SYSCOMMAND()
  46. ON_WM_PAINT()
  47. ON_WM_QUERYDRAGICON()
  48. //}}AFX_MSG_MAP
  49.    ON_WM_SIZE()
  50. END_MESSAGE_MAP()
  51. // CMultilineListDemoDlg message handlers
  52. BOOL CMultilineListDemoDlg::OnInitDialog()
  53. {
  54. CDialog::OnInitDialog();
  55. // Add "About..." menu item to system menu.
  56. // IDM_ABOUTBOX must be in the system command range.
  57. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  58. ASSERT(IDM_ABOUTBOX < 0xF000);
  59. CMenu* pSysMenu = GetSystemMenu(FALSE);
  60. if (pSysMenu != NULL)
  61. {
  62. CString strAboutMenu;
  63. strAboutMenu.LoadString(IDS_ABOUTBOX);
  64. if (!strAboutMenu.IsEmpty())
  65. {
  66. pSysMenu->AppendMenu(MF_SEPARATOR);
  67. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  68. }
  69. }
  70. // Set the icon for this dialog.  The framework does this automatically
  71. //  when the application's main window is not a dialog
  72. SetIcon(m_hIcon, TRUE); // Set big icon
  73. SetIcon(m_hIcon, FALSE); // Set small icon
  74. // TODO: Add extra initialization here
  75. CRect wr;
  76.    GetWindowRect(wr);
  77.    CRect cr;
  78.    m_items.GetWindowRect(cr);
  79.    m_edgeDelta.cx = wr.right - cr.right;
  80.    m_edgeDelta.cy = wr.bottom - cr.bottom;
  81.    m_initialized = TRUE;
  82.    PopulateItemList();
  83. return TRUE;  // return TRUE  unless you set the focus to a control
  84. }
  85. void CMultilineListDemoDlg::OnSysCommand(UINT nID, LPARAM lParam)
  86. {
  87. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  88. {
  89. CAboutDlg dlgAbout;
  90. dlgAbout.DoModal();
  91. }
  92. else
  93. {
  94. CDialog::OnSysCommand(nID, lParam);
  95. }
  96. }
  97. // If you add a minimize button to your dialog, you will need the code below
  98. //  to draw the icon.  For MFC applications using the document/view model,
  99. //  this is automatically done for you by the framework.
  100. void CMultilineListDemoDlg::OnPaint() 
  101. {
  102. if (IsIconic())
  103. {
  104. CPaintDC dc(this); // device context for painting
  105. SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  106. // Center icon in client rectangle
  107. int cxIcon = GetSystemMetrics(SM_CXICON);
  108. int cyIcon = GetSystemMetrics(SM_CYICON);
  109. CRect rect;
  110. GetClientRect(&rect);
  111. int x = (rect.Width() - cxIcon + 1) / 2;
  112. int y = (rect.Height() - cyIcon + 1) / 2;
  113. // Draw the icon
  114. dc.DrawIcon(x, y, m_hIcon);
  115. }
  116. else
  117. {
  118. CDialog::OnPaint();
  119. }
  120. }
  121. // The system calls this function to obtain the cursor to display while the user drags
  122. //  the minimized window.
  123. HCURSOR CMultilineListDemoDlg::OnQueryDragIcon()
  124. {
  125. return static_cast<HCURSOR>(m_hIcon);
  126. }
  127. void CMultilineListDemoDlg::OnSize(UINT nType, int cx, int cy)
  128. {
  129.    CDialog::OnSize(nType, cx, cy);
  130.    if (!m_initialized)
  131.       return;
  132.    CRect wr;
  133.    GetWindowRect(wr);
  134.    CRect cr;
  135.    m_items.GetWindowRect(cr);
  136.    
  137.    cr.right = wr.right - m_edgeDelta.cx;
  138.    cr.bottom = wr.bottom - m_edgeDelta.cy;
  139.    ScreenToClient(cr);
  140.    m_items.MoveWindow(cr);
  141.    m_items.Invalidate(FALSE);
  142. }
  143. #define RAND(min,max) 
  144.    ((int)(((double)rand() / (double)RAND_MAX) * (double)((max)-(min))) + (int)min)
  145. void CMultilineListDemoDlg::PopulateItemList()
  146. {
  147.    //
  148.    // Example 1
  149.    //
  150.    const int numCols = 3;
  151.    const int numRows = 20;
  152.    m_items.SetSize(numCols,numRows);
  153.    m_items.SetColHeading(0,_T("Name"));
  154.    m_items.SetColHeading(1,_T("Quantity"));
  155.    m_items.SetColHeading(2,_T("Description"));
  156.    m_items.SetColWidth(2,280);
  157.    srand((unsigned int)time(0));
  158.    const int numwords = 14;
  159.    char * words[numwords] =
  160.    {
  161.       _T("excellent"),
  162.       _T("quality"),
  163.       _T("product"),
  164.       _T("efficient"),
  165.       _T("cheap"),
  166.       _T("powerful"),
  167.       _T("synergy"),
  168.       _T("power"),
  169.       _T("blue"),
  170.       _T("orange"),
  171.       _T("the"),
  172.       _T("and"),
  173.       _T("or"),
  174.       _T("a")
  175.    };
  176.    const int minwords = 1;
  177.    const int maxwords = 20;
  178.    for (int row = 0; row < numRows; row++)
  179.    {
  180.       CString s;
  181.       s.Format(_T("widget_%d"), row+1);
  182.       m_items.SetCellText(0,row,s);
  183.       s.Format(_T("%d"), RAND(0,100));
  184.       m_items.SetCellText(1,row,s);
  185.       s = _T("");
  186.       int nwords = RAND(minwords,maxwords);
  187.       for (int word = 0; word < nwords; word++)
  188.       {
  189.          int wordNum = RAND(0,numwords-1);
  190.          CString tmp(words[wordNum]);
  191.          s += words[wordNum];
  192.          s += _T(" ");
  193.       }
  194.       m_items.SetCellText(2,row,s);
  195.    }
  196.    /*
  197.    //
  198.    // Example 2
  199.    //
  200.    // create a list with 3 columns and 2 rows
  201.    m_items.SetSize(3,5);
  202.    // first two columns 100 pixels wide and the third column 200 pixels wide
  203.    m_items.SetColWidth(0,100);
  204.    m_items.SetColWidth(1,100);
  205.    m_items.SetColWidth(2,200);
  206.    // set the column heading text
  207.    m_items.SetColHeading(0,_T("Name"));
  208.    m_items.SetColHeading(1,_T("Quantity"));
  209.    m_items.SetColHeading(2,_T("Description"));
  210.    // populate the list data
  211.    m_items.SetCellText(0,0,_T("Coffee Beans"));
  212.    m_items.SetCellText(1,0,_T("12"));
  213.    m_items.SetCellText(2,0,
  214.    _T("An essential part of the daily diet for ensuring productivity is at required levels.nnNOTE: Decaf is for wimps!"));
  215.    m_items.SetCellText(0,2,_T("Water"));
  216.    m_items.SetCellText(1,2,_T("10"));
  217.    m_items.SetCellText(2,2,_T("Listed as a dependency of the coffee beans module."));
  218.    */
  219. }
  220. BOOL CMultilineListDemoDlg::OnCommand(WPARAM wParam, LPARAM lParam)
  221. {
  222.    if ((HIWORD(wParam) == LBN_SELCHANGE) &&
  223.        (LOWORD(wParam) == IDC_ITEMS))
  224.    {
  225.       int selRow = m_items.GetSelRow();
  226.       if (selRow < 0)
  227.       {
  228.          SetWindowText(_T("MultilineListDemo"));
  229.       }
  230.       else
  231.       {
  232.          CString s;
  233.          s.Format(_T("MultilineListDemo (you have selected %s)"), m_items.GetCellText(0,selRow));
  234.          SetWindowText(s);
  235.       }
  236.    }
  237.    return CDialog::OnCommand(wParam, lParam);
  238. }