⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmaloglistbox.cpp

📁 日志表控件
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// ==========================================================================
// Les Fonctions Relatives aux messages de la boite de dialogue
// ==========================================================================

BOOL MMALogbookDlgProc_Destroy(HWND hwnd)
 {
  CMMALogbookDlg *pcLogbookDlg = (CMMALogbookDlg *)GetWindowLong(hwnd, GWL_USERDATA);

  pcLogbookDlg->m_cMMALogListBox.Detach();

  if (pcLogbookDlg->m_hListBox)
   {
    DestroyWindow(pcLogbookDlg->m_hListBox);
    pcLogbookDlg->m_hListBox = NULL;
   }
  
  return FALSE;
 }

// --------------------------------------------------------------------------

BOOL MMALogbookDlgProc_InitDialog(HWND hwnd, HWND hwndFocus, LPARAM lInitParam)
 {
  CMMALogbookDlg *pcLogbookDlg = (CMMALogbookDlg *)lInitParam;

  SetWindowLong(hwnd, GWL_USERDATA, (LONG)pcLogbookDlg);

  HMENU hSysMenu = GetSystemMenu(hwnd,FALSE);

  int iSysCount = GetMenuItemCount(hSysMenu);

  EnableMenuItem(hSysMenu, SC_CLOSE, MF_BYCOMMAND | MF_GRAYED);

  MENUITEMINFO stMII;

  // Add Separator line to system menu
  memset(&stMII, 0, sizeof(stMII));

  stMII.cbSize   = sizeof(stMII);
  stMII.fMask    = MIIM_TYPE;
  stMII.fType    = MFT_SEPARATOR;
  
  InsertMenuItem(hSysMenu, iSysCount - 2, TRUE, &stMII);

  // Add new string to system menu
  memset(&stMII, 0, sizeof(stMII));

  stMII.cbSize     = sizeof(stMII);
  stMII.fMask      = MIIM_TYPE | MIIM_ID;
  stMII.fType      = MFT_STRING;
  stMII.dwTypeData = "Printer Setup";
  stMII.cch        = 13;
  stMII.wID        = 10000;
  
  InsertMenuItem(hSysMenu, iSysCount - 1, TRUE, &stMII);

  // Add new string to system menu
  memset(&stMII, 0, sizeof(stMII));

  stMII.cbSize     = sizeof(stMII);
  stMII.fMask      = MIIM_TYPE | MIIM_ID | MIIM_STATE;
  stMII.fType      = MFT_STRING;
  stMII.dwTypeData = "Printer and Page Setup";
  stMII.cch        = 22;
  stMII.wID        = 10001;
  stMII.fState     = MFS_DISABLED;
  
  InsertMenuItem(hSysMenu, iSysCount, TRUE, &stMII);

  // Add new string to system menu
  memset(&stMII, 0, sizeof(stMII));

  stMII.cbSize     = sizeof(stMII);
  stMII.fMask      = MIIM_TYPE | MIIM_ID;
  stMII.fType      = MFT_STRING;
  stMII.dwTypeData = "Print";
  stMII.cch        = 5;
  stMII.wID        = 10002;
  
  InsertMenuItem(hSysMenu, iSysCount + 1, TRUE, &stMII);

  RECT stDlgRect;

  GetClientRect(hwnd, &stDlgRect);

  pcLogbookDlg->m_hListBox = CreateWindowEx(WS_EX_CLIENTEDGE,
                                            "LISTBOX",
                                            "",
                                            WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | LBS_NOINTEGRALHEIGHT | LBS_OWNERDRAWVARIABLE | LBS_NOSEL,
                                            MMALOGBOOKDLG_LEFTMARGIN,
                                            MMALOGBOOKDLG_TOPMARGIN,
                                            (stDlgRect.right - stDlgRect.left) - (MMALOGBOOKDLG_LEFTMARGIN + MMALOGBOOKDLG_RIGHTMARGIN),
                                            (stDlgRect.bottom - stDlgRect.top) - (MMALOGBOOKDLG_TOPMARGIN + MMALOGBOOKDLG_BOTTOMMARGIN),
                                            hwnd,
                                            (HMENU)1000,
                                            pcLogbookDlg->m_hInstance,
                                            0);

  if (pcLogbookDlg->m_hDlgFont)
   SendMessage(pcLogbookDlg->m_hListBox, WM_SETFONT, (WPARAM)pcLogbookDlg->m_hDlgFont, MAKELPARAM(TRUE,0));

  pcLogbookDlg->m_cMMALogListBox.Attach(pcLogbookDlg->m_hListBox, pcLogbookDlg->m_szFileName, pcLogbookDlg->m_lNbrLines);

  return TRUE;
 }

// --------------------------------------------------------------------------

BOOL MMALogbookDlgProc_DrawItem(HWND hwnd, UINT idCtl, LPDRAWITEMSTRUCT lpdis)
 {
  CMMALogbookDlg *pcLogbookDlg = (CMMALogbookDlg *)GetWindowLong(hwnd, GWL_USERDATA);

  if (idCtl == 1000)
   {
    MMALogListBoxWndProc_DrawItem(lpdis);
    return TRUE;
   }

  return FALSE;
 }

// --------------------------------------------------------------------------

BOOL MMALogbookDlgProc_GetMinMaxInfo(HWND hwnd, LPMINMAXINFO lpmmi)
 {
  lpmmi->ptMinTrackSize.x = 100;
  lpmmi->ptMinTrackSize.y = 100;

  return FALSE;
 }

// --------------------------------------------------------------------------

BOOL MMALogbookDlgProc_LButtonDown(HWND hwnd, WPARAM fwKeys, WORD xPos, WORD yPos)
 {
  CMMALogbookDlg *pcLogbookDlg = (CMMALogbookDlg *)GetWindowLong(hwnd, GWL_USERDATA);

  if (!pcLogbookDlg->m_bNoMove)
   PostMessage(hwnd, WM_SYSCOMMAND, SC_MOVE + 2, 0);

  return FALSE;
 }

// --------------------------------------------------------------------------

BOOL MMALogbookDlgProc_MeasureItem(HWND hwnd, UINT idCtl, LPMEASUREITEMSTRUCT lpmis)
 {
  CMMALogbookDlg *pcLogbookDlg = (CMMALogbookDlg *)GetWindowLong(hwnd, GWL_USERDATA);

  if (idCtl == 1000)
   {
    MMALogListBoxWndProc_MeasureItem(lpmis);
    return TRUE;
   }

  return FALSE;
 }

// --------------------------------------------------------------------------

BOOL MMALogbookDlgProc_NCHitTest(HWND hwnd, WORD xPos, WORD yPos, LRESULT *pResult)
 {
  CMMALogbookDlg *pcLogbookDlg = (CMMALogbookDlg *)GetWindowLong(hwnd, GWL_USERDATA);

  //if (!pcLogbookDlg->m_bNoMove && pcLogbookDlg->HasCaption())
  //PostMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(xPos,yPos));
  
  return FALSE;
 }

// --------------------------------------------------------------------------

BOOL MMALogbookDlgProc_Size(HWND hwnd, WPARAM fwSizeType, WORD nWidth, WORD nHeight)
 {
  CMMALogbookDlg *pcLogbookDlg = (CMMALogbookDlg *)GetWindowLong(hwnd, GWL_USERDATA);

  if (!pcLogbookDlg->m_hListBox) return FALSE;

  return SetWindowPos(pcLogbookDlg->m_hListBox,
                      NULL,
                      0,
                      0,
                      nWidth - (MMALOGBOOKDLG_LEFTMARGIN + MMALOGBOOKDLG_RIGHTMARGIN),
                      nHeight - (MMALOGBOOKDLG_TOPMARGIN + MMALOGBOOKDLG_BOTTOMMARGIN),
                      SWP_NOZORDER | SWP_NOMOVE);
 }

// --------------------------------------------------------------------------

BOOL MMALogbookDlgProc_SysCommand(HWND hwnd, WPARAM uCmdType, WORD xPos, WORD yPos)
 {
  if ((uCmdType & 0xFFF0) == SC_CLOSE)
   {
    EndDialog(hwnd, IDCANCEL);
    return TRUE;
   }

  CMMALogbookDlg *pcLogbookDlg = (CMMALogbookDlg *)GetWindowLong(hwnd, GWL_USERDATA);

  if (uCmdType == 10000 && pcLogbookDlg) // Printer Setup
   {
    pcLogbookDlg->m_cMMALogListBox.PrinterSetup(hwnd);
   }

//   else if (uCmdType == 10001 && pcLogbookDlg) // Printer and Page Setup
//    {
//     pcLogbookDlg->m_cMMALogListBox.PrinterAndPageSetup(hwnd);
//    }

  else if (uCmdType == 10002 && pcLogbookDlg) // Print
   {
    pcLogbookDlg->m_cMMALogListBox.Print(hwnd, TRUE, "logbook.txt");
   }

  return FALSE;
 }

// --------------------------------------------------------------------------

BOOL CALLBACK MMALogbookDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 {
  LRESULT lResult;

  if (message == WM_DESTROY && MMALogbookDlgProc_Destroy(hwnd)) return TRUE;

  else if (message == WM_INITDIALOG && MMALogbookDlgProc_InitDialog(hwnd, (HWND)wParam, lParam)) return TRUE;

  else if (message == WM_DRAWITEM && MMALogbookDlgProc_DrawItem(hwnd, (UINT)wParam, (LPDRAWITEMSTRUCT)lParam)) return TRUE;

  else if (message == WM_GETMINMAXINFO && MMALogbookDlgProc_GetMinMaxInfo(hwnd, (LPMINMAXINFO)lParam)) return TRUE;

  else if (message == WM_LBUTTONDOWN && MMALogbookDlgProc_LButtonDown(hwnd, wParam, LOWORD(lParam), HIWORD(lParam))) return TRUE;

  else if (message == WM_MEASUREITEM && MMALogbookDlgProc_MeasureItem(hwnd, (UINT)wParam, (LPMEASUREITEMSTRUCT)lParam)) return TRUE;

  else if (message == WM_NCHITTEST && MMALogbookDlgProc_NCHitTest(hwnd, LOWORD(lParam), HIWORD(lParam), &lResult)) return lResult;

  else if (message == WM_SIZE && MMALogbookDlgProc_Size(hwnd, wParam, LOWORD(lParam), HIWORD(lParam))) return TRUE;

  else if (message == WM_SYSCOMMAND && MMALogbookDlgProc_SysCommand(hwnd, wParam, LOWORD(lParam), HIWORD(lParam))) return TRUE;

  return FALSE;
 }

/////////////////////////////////////////////////////////////////////////////
// class CMMALogListBoxItemMemory

CMMALogListBoxItemMemory::CMMALogListBoxItemMemory()
 {
  m_bNew  = FALSE;
  m_lType = 0;
  m_hFont = NULL;

  memset(m_szText       , 0, sizeof(m_szText      ));
  memset(&m_stSystemTime, 0, sizeof(m_stSystemTime));
  memset(&m_stLogFont   , 0, sizeof(m_stLogFont   ));

  memset(&m_stTimeColors, 0, sizeof(m_stTimeColors));
  memset(&m_stTypeColors, 0, sizeof(m_stTypeColors));
  memset(&m_stTextColors, 0, sizeof(m_stTextColors));
 }

// --------------------------------------------------------------------------

CMMALogListBoxItemMemory::~CMMALogListBoxItemMemory()
 {
 }

/////////////////////////////////////////////////////////////////////////////
// class CMMALogListBox

CMMALogListBox::CMMALogListBox()
 {
  memset(m_szPersonal, 0, sizeof(m_szPersonal));

  m_hListBox     = NULL;
  m_hFile        = -1;
  m_bInitialized = FALSE;
  m_lBias        = 0;
  m_lNbrLines    = 0;
  m_hPrintDC     = NULL;

  TIME_ZONE_INFORMATION stTZI;

  if (GetTimeZoneInformation(&stTZI) != TIME_ZONE_ID_INVALID)
   {
    m_lBias = ((stTZI.Bias + stTZI.DaylightBias) / 60) * -1;
   }

  for (int I=0; I<4; I++)
   {
    m_clrDebugText[I] = GetSysColor(COLOR_WINDOWTEXT);
    m_clrDebugBk[I]   = GetSysColor(COLOR_WINDOW);
   }

  memset(m_szFileName, 0, sizeof(m_szFileName));
 }

// --------------------------------------------------------------------------

CMMALogListBox::~CMMALogListBox()
 {
  Detach();
 }

// --------------------------------------------------------------------------
// PROTECTED STATIC MEMBERS
// --------------------------------------------------------------------------

BOOL CMMALogListBox::DeleteListBoxString(HWND hListBox, int iIndex)
 {
  if (hListBox == NULL) return FALSE;

  LINEDATA_MEMORY *pstLDM = (LINEDATA_MEMORY *)SendMessage(hListBox, LB_GETITEMDATA, (WPARAM)iIndex, 0L);

  if ((LRESULT)pstLDM != LB_ERR)
   {
    if (pstLDM->hFont) DeleteObject(pstLDM->hFont);

    delete pstLDM;
   }

  if (SendMessage(hListBox, LB_DELETESTRING, (WPARAM)iIndex, 0L) == LB_ERR) return FALSE;

  return TRUE;
 }

// --------------------------------------------------------------------------

long CMMALogListBox::GetExtentForEntireControl(HWND hListBox)
 {
  HFONT hFont, hOldFont;
  HDC   hDC = GetDC(hListBox);

  TEXTMETRIC stTM;
  SIZE       stSize;
  char       szText[1024];
  long       lMaxCX = 0;

  for (int I=0; I<SendMessage(hListBox, LB_GETCOUNT, 0L, 0L); I++)
   {
    LINEDATA_MEMORY *pstLDM = GetItemData(hListBox,I);

    if (!pstLDM) continue;
    
    hFont = pstLDM->hFont;

    if (!hFont) hFont = (HFONT)SendMessage(hListBox, WM_GETFONT, 0L, 0L);

    if (!hFont) continue;

    hOldFont = (HFONT)SelectObject(hDC, hFont);

    GetTextMetrics(hDC, &stTM);

    strcpy(szText, pstLDM->stLDF.szText);

    GetTextExtentPoint32(hDC, szText, strlen(szText), &stSize);

    stSize.cx += stTM.tmAveCharWidth;

    if (lMaxCX <= stSize.cx) lMaxCX = stSize.cx;

    SelectObject(hDC, hOldFont);
   }

  SelectObject(hDC, hOldFont);

  ReleaseDC(hListBox, hDC);

  return lMaxCX;
 }

// --------------------------------------------------------------------------

long CMMALogListBox::GetExtentForString(HWND hListBox, HFONT hFont, LPCTSTR lpszItem)
 {
  HDC   hDC;
  HFONT hOldFont;

  hDC = GetDC(hListBox);

  if (!hFont) hFont = (HFONT)SendMessage(hListBox, WM_GETFONT, 0L, 0L);

  if (hFont)
   {
    hOldFont = (HFONT)SelectObject(hDC, hFont);

    TEXTMETRIC stTM;
    SIZE       stSize;

    GetTextMetrics(hDC, &stTM);

    GetTextExtentPoint32(hDC, lpszItem, strlen(lpszItem), &stSize);

    stSize.cx += stTM.tmAveCharWidth;

    SelectObject(hDC, hOldFont);
    
    ReleaseDC(hListBox, hDC);

    return (long)stSize.cx;
   }

  ReleaseDC(hListBox, hDC);

  return 0L;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -