一个典型的例子解决常见的高级Windows程序设计问题

类别:VC语言 点击:0 评论:0 推荐:


//#######################################################################################
// Copyright(c) Vision Technologies 2002 All Rights Reserved.
//
// Project Name:  FileInspector RT
// Software Version 1.0
//
// ----------------------------------------------------------
//
// File Name:   FileInspector.h
// Function:   Define of Classes
// Created Time:  28th Dec, 2002
//  Author:    HighTech Young
//
// ----------------------------------------------------------
//
//  Revidion Time:  
//  Revision By:  
// Revision Contents: 
//
//#######################################################################################

#include "resource.h"
#include "stdafx.h"
#include "afxmt.h"

//---------------------------------------------------------------------------------------
//
// COMMENTS: Define of applacation class 
//
//---------------------------------------------------------------------------------------

class CMyApp : public CWinApp
{
public:
    virtual BOOL InitInstance ();
};

//---------------------------------------------------------------------------------------
//
// COMMENTS: Define of mainwindow class
//
//---------------------------------------------------------------------------------------

class CMainWindow : public CWnd
{
 //
 // Declare all objects of interface
 //
private:
 CStatic    m_FiTip;
 CButton    m_GroupBoxFI;
 CEdit    m_ObjectPath;
 CButton    m_Browse;

 CButton    m_GroupBoxFS;
 CStatic    m_FsTip;
 CEdit    m_ObjectSize;
 CButton    m_GB;
 CButton    m_MB;
 CButton    m_KB;
 CButton    m_Byte;

 CButton    m_OK;
 CButton    m_Cancel;
 CButton    m_Exit;

public:
    CMainWindow ();

 BOOL boolWndHadShow; // Window display indicator

protected:
 CEvent m_eventStopWatch;// CEvent object for synchonize thread

 virtual void PostNcDestroy();

 //
 // Message handler declare
 //
 afx_msg int OnCreate(LPCREATESTRUCT lpcs);
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);

    afx_msg LRESULT OnMyIconNotify(WPARAM wParam, LPARAM lParam);
 afx_msg LRESULT OnShowAppIconic(WPARAM wParam, LPARAM lParam);
 afx_msg void OnClose();

 afx_msg void OnBrowseButonClicked();
 afx_msg void OnObjectPathChanged();
 afx_msg void OnOkButtonClicked();
 afx_msg void OnCancelButtonClicked();
 afx_msg void OnExitButtonClicked();

 afx_msg LONG OnFileChanged(WPARAM wParam, LPARAM lParam);
    DECLARE_MESSAGE_MAP ()
};

//##################################### End of File #######################################

 

//#######################################################################################
// Copyright(c) Vision Technologies 2002 All Rights Reserved.
//
// Project Name:  FileInspector RT
// Software Version 1.0
//
// ----------------------------------------------------------
//
// File Name:   FileInspector.cpp
// Function:   Implementation of the class
// Created Time:  28th Dec, 2002
//  Created by:   HighTech Young
//
// ----------------------------------------------------------
//
//  Revidion Time:  
//  Revision By:  
// Revision Contents: 
//
//#######################################################################################

#include "FileInspector.h"

//---------------------------------------------------------------------------------------
//
// COMMENTS:  GLOBE DEFINATION AREA
//
//---------------------------------------------------------------------------------------

//
// User defined message for callback function
//

#define USER_WM_NOTIFYICON    WM_USER + 0x001

//
// User defined message for display icon on statue bar of windows
//

#define USER_WM_SHOWAPPICONIC   WM_USER + 0x002 

//
// User defined message for file change notification
//

#define WM_USER_THREAD_FILE_CHANGED  WM_USER + 0x003

//
// The structure was defined for the input of thread function parameters
//

typedef struct tagTHREADPARAM
{
 HWND hWnd;
 CEvent *pEvent;
}THREADPARAM;

//
// Worker thread function declare
//

UINT ThreadFunction(LPVOID pParam);

//---------------------------------------------------------------------------------------
//
// COMMENTS: MESSAGE MAP of CMainWindow class
//
//---------------------------------------------------------------------------------------

BEGIN_MESSAGE_MAP (CMainWindow, CWnd)
 ON_WM_CREATE()
 ON_MESSAGE(USER_WM_NOTIFYICON,OnMyIconNotify)
 ON_MESSAGE(USER_WM_SHOWAPPICONIC,OnShowAppIconic)
 ON_WM_SYSCOMMAND()
 ON_WM_CLOSE()

 ON_BN_CLICKED(IDC_BROWSE,OnBrowseButonClicked)
 ON_EN_CHANGE(IDE_OBJ_PATH,OnObjectPathChanged)
 
 ON_BN_CLICKED(IDC_OK,OnOkButtonClicked)
 ON_BN_CLICKED(IDE_OBJ_PATH,OnObjectPathChanged)
 ON_BN_CLICKED(IDC_EXIT_FI,OnExitButtonClicked)

 ON_MESSAGE(WM_USER_THREAD_FILE_CHANGED,OnFileChanged)
END_MESSAGE_MAP ()

//
// defination of application object
//

CMyApp myApp;

//---------------------------------------------------------------------------------------
//
// FUNCTION: BOOL CMyApp::InitInstance ()
// PURPOSE:  CMyApp member functions
// COMMENTS:
//
//---------------------------------------------------------------------------------------

BOOL CMyApp::InitInstance ()
{
    m_pMainWnd = new CMainWindow;

   m_pMainWnd->ShowWindow (m_nCmdShow);
    m_pMainWnd->UpdateWindow ();

 //
 // Send MYWM_SHOWAPPICONIC so that the window can be
 // hide after programe runed and the icon should be
 // displayed on the statue area of task bar
 //

 m_pMainWnd -> PostMessage( USER_WM_SHOWAPPICONIC );
    return TRUE;
}

//---------------------------------------------------------------------------------------
//
// FUNCTION: CMainWindow::CMainWindow ()
// PURPOSE:  The constructor of the CMainWindow class
// COMMENTS:
//
//---------------------------------------------------------------------------------------

CMainWindow::CMainWindow ():
 m_eventStopWatch(FALSE,TRUE)
{
 //
 // Register a WNDCLASS.
 //

 CString strWndClass = AfxRegisterWndClass (
        CS_DBLCLKS,          // Class style
        AfxGetApp ()->LoadStandardCursor (IDC_ARROW),   // Class cursor
        (HBRUSH) (COLOR_3DFACE + 1),     // Background brush
  AfxGetApp ()->LoadIcon( IDR_FILE_INSPECTOR)  // Class icon
    );

 //
 // Create a window.
 //

 CreateEx (0, strWndClass, _T ("File/Folder Supervisor"),
        WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION | WS_MINIMIZEBOX,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
        NULL, NULL);

 //
 // Size the window.
 //
  
 CRect rect (80,70, 452, 400);
    CalcWindowRect (&rect);

    SetWindowPos (NULL, 0, 0, rect.Width (), rect.Height (),
        SWP_NOZORDER | SWP_NOMOVE | SWP_NOREDRAW);

}

//---------------------------------------------------------------------------------------
//
// FUNCTION: int CMainWindow::OnCreate(LPCREATESTRUCT lpcs)
// PURPOSE:  Create GUI of Programe
// COMMENTS:
//
//---------------------------------------------------------------------------------------

int CMainWindow::OnCreate(LPCREATESTRUCT lpcs)
{
 if(CWnd::OnCreate(lpcs) == -1)
  return -1;

 //
 // Object selected groupe box
 //

 m_GroupBoxFI.Create (_T (" Supervised Target:"),
      WS_CHILD|BS_GROUPBOX| WS_VISIBLE,
      CRect(10,10,360,115),
      this,
      IDC_GROUPBOX_FI);
 m_FiTip.Create(_T("Please select the file or folder which you want to ask the File/Folder Supervisor supervise."),
       WS_CHILD|WS_VISIBLE,
       CRect(25,35,350,75),
       this,
       IDS_FI_TIP);
 m_ObjectPath.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|ES_AUTOHSCROLL,
      CRect(25,80,260,100),
      this,
      IDE_OBJ_PATH);
 m_Browse.Create(_T("Browse.."),
     WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
     CRect(265,80,350,100),
     this,
     IDC_BROWSE);
 //
 // File size limitation config box
 //

 m_GroupBoxFS.Create (_T ("File Size Limitation:"),
      WS_CHILD |BS_GROUPBOX| WS_VISIBLE,
      CRect(10,120,360,280),
      this,
      IDC_GROUPBOX_FS);
 m_FsTip.Create( _T("The Folder or File size must be less than:"),
     WS_CHILD|WS_VISIBLE,
       CRect(25,145,350,165),
       this,
       IDS_FS_TIP);
 m_ObjectSize.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|ES_AUTOHSCROLL,
      CRect(30,170,100,190),
      this,
      IDE_OBJ_SIZE);

 m_GB.Create (_T("GB"),
    WS_CHILD|WS_GROUP|WS_VISIBLE|BS_AUTORADIOBUTTON,
    CRect(110,170,150,190),
    this,
    IDC_GB);
 m_MB.Create (_T("MB"),
   WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,
   CRect(155,170,195,190),
   this,
   IDC_MB);
 m_KB.Create (_T("KB"),
   WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,
   CRect(200,170,240,190),
   this,
   IDC_GB);
 m_Byte.Create (_T("Byte"),
   WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,
   CRect(245,170,325,190),
   this,
   IDC_BYTE);
 m_KB.SetCheck (BST_CHECKED);

 //
 // Buttons
 //

 m_OK.Create(_T("Start"),
  WS_CHILD|WS_GROUP|BS_DEFPUSHBUTTON| WS_VISIBLE,
  CRect(50,290,150,315),
  this,
  IDC_OK);
 m_Cancel.Create(_T("Cancel"),
  WS_CHILD|BS_PUSHBUTTON| WS_VISIBLE,
  CRect(155,290,255,315),
  this,
  IDC_CANCEL);
 
 m_Cancel.EnableWindow(FALSE);

 m_Exit.Create(_T("Stop"),
  WS_CHILD|BS_PUSHBUTTON| WS_VISIBLE,
  CRect(260,290,360,315),
  this,
  IDC_EXIT_FI);

 return 0;
}

//---------------------------------------------------------------------------------------
//
// FUNCTION: void CMainWindow::PostNcDestroy()
// PURPOSE:  PostNcDestroy will be used for delete the window
// COMMENTS:
//
//---------------------------------------------------------------------------------------

void CMainWindow::PostNcDestroy()
{
 delete this;
}

//---------------------------------------------------------------------------------------
//
// FUNCTION: BOOL MyTaskBarAddIcon(HWND hwnd,UINT uID, HICON hicon, LPSTR lpszTip)
// PURPOSE:  Add icon in the statu area on the task bar
// COMMENTS:
//
//---------------------------------------------------------------------------------------

BOOL MyTaskBarAddIcon(HWND hwnd,UINT uID, HICON hicon, LPSTR lpszTip)
{
    BOOL bResult;
 
 NOTIFYICONDATA tnid;
  tnid.cbSize = sizeof(NOTIFYICONDATA);
  tnid.hWnd = hwnd;
  tnid.uID = uID;    
  tnid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
  tnid.uCallbackMessage = USER_WM_NOTIFYICON;  // Callback message
  tnid.hIcon = hicon;        // Icon used
   
 if (lpszTip)
  lstrcpyn(tnid.szTip, lpszTip, sizeof(tnid.szTip));
    else        
  tnid.szTip[0] = '\0'; 

 //
 // Send NIM_ADD to create icon
 //

 bResult = Shell_NotifyIcon(NIM_ADD, &tnid);
 
 if (hicon) DestroyIcon(hicon);

 return bResult;
}

//---------------------------------------------------------------------------------------
//
// FUNCTION: BOOL MyTaskBarDeleteIcon(HWND hwnd, UINT uID)
// PURPOSE:  DELETE icon in the statu area on the task bar
// COMMENTS:
//
//---------------------------------------------------------------------------------------

BOOL MyTaskBarDeleteIcon(HWND hwnd, UINT uID)

 BOOL bResult;
    NOTIFYICONDATA tnid;
  tnid.cbSize = sizeof(NOTIFYICONDATA);
  tnid.hWnd = hwnd;
  tnid.uID = uID;

 //
 //Send NIM_DELETE to create icon
 //

 bResult = Shell_NotifyIcon(NIM_DELETE, &tnid);

 return bResult;
}

//---------------------------------------------------------------------------------------
//
// FUNCTION: LRESULT CMainWindow::OnMyIconNotify( WPARAM wParam, LPARAM lParam )
// PURPOSE:  Call back function of message MYWM_NOTIFYICON
// COMMENTS:
//
//---------------------------------------------------------------------------------------

LRESULT CMainWindow::OnMyIconNotify( WPARAM wParam, LPARAM lParam )
{
    UINT nID;
 UINT uMouseMsg;
 nID = (UINT)wParam;
    uMouseMsg = (UINT) lParam;
 
 //
 // Show or hide window
 //
 
 if (uMouseMsg == WM_LBUTTONDOWN) // Click on icon
 {
  if ( boolWndHadShow )
   ShowWindow( SW_HIDE );
  else
   ShowWindow( SW_SHOWNORMAL );
  
  boolWndHadShow = ~boolWndHadShow;
 }
 return TRUE;
}

//---------------------------------------------------------------------------------------
//
// FUNCTION:
//   LRESULT CMainWindow::OnShowAppIconic( WPARAM wParam, LPARAM lParam )
// PURPOSE:
//   Message handler of show icon on statu bar
//   and hide the window when programe run
// COMMENTS:
//   Call back function of message MYWM_SHOWAPPICONIC
//
//---------------------------------------------------------------------------------------

LRESULT CMainWindow::OnShowAppIconic( WPARAM wParam, LPARAM lParam )
{
 HICON theIcon = LoadIcon(AfxGetInstanceHandle(),
       MAKEINTRESOURCE(IDR_FILE_INSPECTOR) );
 MyTaskBarAddIcon(GetSafeHwnd(),
      100,
      theIcon,
      _T("File/Folder Supervisor"));
 ShowWindow( SW_HIDE );
 boolWndHadShow = FALSE;
 return 1;
}

//---------------------------------------------------------------------------------------
//
// FUNCTION: void CMainWindow::OnClose()
// PURPOSE:
//   When you want to close programe, the icon should
//   be delete from statue area on task bar,
//   We can use WM_CLOSE message and message handler to do this
// COMMENTS:
//
//---------------------------------------------------------------------------------------

void CMainWindow::OnClose()
{
 //
 // Add your message handler code here and/or call default
 //
 
 MyTaskBarDeleteIcon( GetSafeHwnd(), 100 );
 CWnd::OnClose();
}

//---------------------------------------------------------------------------------------
//
// FUNCTION:
//  void CMainWindow::OnSysCommand( UINT nID, LPARAM lParam )
// PURPOSE:
//  When window were minimumized, the window should be hide,
//  we use ON_SYSCOMMAND message and message handle to do this
// COMMENTS:
//
//---------------------------------------------------------------------------------------
void CMainWindow::OnSysCommand( UINT nID, LPARAM lParam )
{
 if ( nID==SC_MINIMIZE  )
 {
  ShowWindow( SW_HIDE );
  boolWndHadShow = FALSE;
 }
 else
  CWnd::OnSysCommand( nID, lParam );
}


//---------------------------------------------------------------------------------------
//
// FUNCTION: void CMainWindow::OnBrowseButonClicked ()
// PURPOSE:  Message handler of OK button
// COMMENTS:
//
//---------------------------------------------------------------------------------------
void CMainWindow::OnBrowseButonClicked ()
{

 //
 //  Must call IMalloc::Free to free the memory by this pointer
 //
 
 LPMALLOC pMalloc;
 BROWSEINFO bi;
 char pszDirName[MAX_PATH];// Save the directory name
 LPITEMIDLIST pidl;

 //
 // If retrieve a handle to the Shell allocator's IMalloc interface sucessfuly
 //
 
 if (SUCCEEDED(SHGetMalloc(&pMalloc)))
 {
  ZeroMemory(&bi,sizeof(bi));
  bi.hwndOwner = GetSafeHwnd();
  bi.pidlRoot = NULL;
  bi.pszDisplayName = pszDirName;
  bi.lpszTitle = _T("Select the file or folder which will be Supervised:");
  bi.ulFlags = BIF_BROWSEINCLUDEFILES;
  bi.lpfn = NULL;
  bi.lParam = 0;
  if ((pidl = ::SHBrowseForFolder(&bi)) != NULL)
  {
   //
   // Get full path user selected
   //
   
   if (::SHGetPathFromIDList(pidl, pszDirName))
   m_ObjectPath.SetWindowText(pszDirName);
  }
  pMalloc->Free(pidl);
  pMalloc->Release();
 }
  
  //
  // Try to detect the inspect object is directory or file
  // Can also use:
  // DWORD GetFileAttributes(LPCTSTR lpFileName);
  //
  
  DWORD ObjectType;  
  ObjectType = GetFileAttributes(pszDirName);
  if(ObjectType & FILE_ATTRIBUTE_DIRECTORY)
  {
   m_GroupBoxFI.SetWindowText (_T("Folder Supervised:"));
   m_GroupBoxFS.SetWindowText (_T("Folder Size Limitation"));
  }
  else
  {
   m_GroupBoxFI.SetWindowText (_T("File Supervised:"));
   m_GroupBoxFS.SetWindowText (_T("File Size Limitation"));
  }
  
  //
  //Enable the Cancel button
  //
   m_Cancel.EnableWindow(TRUE);
}

//---------------------------------------------------------------------------------------
//
// FUNCTION: void CMainWindow::OnOkButtonClicked ()
// PURPOSE:  Message handler of OK button
// COMMENTS:
//  This function transfer a structure's pointer
//  as a LPVOID parameter to worker thread. this is the normal way
//  to handle the worker thread parameters. Besides, you can also
//  input a address of an object directly.
//
//---------------------------------------------------------------------------------------

void CMainWindow::OnOkButtonClicked ()
{
  m_Cancel.EnableWindow( FALSE );
  ShowWindow( SW_HIDE );
  boolWndHadShow = FALSE;
  
  //
  // Reset the manual event object before start worker thread
  //

  m_eventStopWatch.ResetEvent ();

  //
  // Prepare the parameter for worker thread
  // sometimes if you only need m_hWnd, you can also
  // input &m_hWnd directly there
  //

  THREADPARAM * pThreadParam=new THREADPARAM;
  pThreadParam->hWnd= m_hWnd;     // Message target
  pThreadParam->pEvent = &m_eventStopWatch; // Event to stop thread
  
  //
  // Start File Inspector thread.
  //
  
  AfxBeginThread(ThreadFunction, pThreadParam);
}

//---------------------------------------------------------------------------------------
//
// FUNCTION: void CMainWindow::OnCancelButtonClicked ()
// PURPOSE:  Message handler of Cancel button
// COMMENTS:
//
//---------------------------------------------------------------------------------------

void CMainWindow::OnCancelButtonClicked ()
{
  ShowWindow( SW_HIDE );
  boolWndHadShow = FALSE;
}

//---------------------------------------------------------------------------------------
//
// FUNCTION: void CMainWindow::OnExitButtonClicked ()
// PURPOSE:  Message handler of Exit button
// COMMENTS:
//
//---------------------------------------------------------------------------------------

void CMainWindow::OnExitButtonClicked ()
{
  ShowWindow( SW_HIDE );
  boolWndHadShow = FALSE;
  
  m_eventStopWatch.SetEvent();

  //
  // Close the window
  //
  
  PostMessage (WM_CLOSE,0,0);
}

//---------------------------------------------------------------------------------------
//
// FUNCTION: void CMainWindow::OnObjectPathChanged ()
// PURPOSE:  Message handler of Object Path changed
// COMMENTS:
//
//---------------------------------------------------------------------------------------

void CMainWindow::OnObjectPathChanged ()
{
 m_Cancel.EnableWindow(TRUE);
}

//---------------------------------------------------------------------------------------
//
// FUNCTION: UINT ThreadFunction(LPVOID pParam)
// PURPOSE:  Worker thread Function
// COMMENTS:
//
//---------------------------------------------------------------------------------------

UINT ThreadFunction(LPVOID pParam)
{
 //
 // Unbound the parameters
 //

 THREADPARAM *pThreadParam = (THREADPARAM * ) pParam;
 HWND  hWnd = pThreadParam -> hWnd;
 CEvent  *pEvent = pThreadParam -> pEvent;
 
 //delete pThreadParam;
 delete pThreadParam;

 DWORD dwWaitStatus;  
 HANDLE *dwChangeHandles=new HANDLE[3];

 //
 // Use this event handle to stop the thread
 //

 dwChangeHandles[2] = pEvent->m_hObject;

 //
 // Watch the C:\ directory for file creation and deletion.
 //
 
 dwChangeHandles[0] = FindFirstChangeNotification(
      "C:\\",       // directory to watch
      FALSE,       // do not watch the subtree
      FILE_NOTIFY_CHANGE_FILE_NAME); // watch file name changes

 //
 // Watch the D:\ subtree for directory creation and deletion.
 //
 
 dwChangeHandles[1] = FindFirstChangeNotification(
      "D:\\",                        // directory to watch
      TRUE,                          // watch the subtree
      FILE_NOTIFY_CHANGE_DIR_NAME);  // watch dir. name changes

 while (TRUE)
 {
 
 /*--------------------------------------------------------------------------
  Examples:
   Here is the examples if you want to use WaitForSingleObject
   to imply the function.
  
  //
  // Check if user want to Exit File Inspector.
  // Please make sure that the second parameter of
  // WaitForSingleObject is 0, and in this case the
  // first parameter must be manual event.
  // WaitForSingleObject will check the first parameter,
  // if it is signaled,the loop will break.
  //
  
  if(WaitForSingleObject(pEvent->m_hObject,0)==WAIT_OBJECT_0)
   return (UINT) -1;

  WaitForSingleObject(dwChangeHandles[1],INFINITE);
  PostMessage (hWnd,WM_USER_THREAD_FILE_CHANGED,0,0);
  FindNextChangeNotification(dwChangeHandles);
 ---------------------------------------------------------------------------*/
  
  //
  // Wait for notification.
  //
  
  dwWaitStatus = WaitForMultipleObjects(3, dwChangeHandles,
             FALSE, INFINITE);
  if (dwWaitStatus == WAIT_OBJECT_0 + 2) return (UINT) -1;          

  switch (dwWaitStatus)
   {
   case WAIT_OBJECT_0:
   
    //
    // A file was created or deleted in C:\WINDOWS.
    // Refresh this directory and restart the
    // change notification. RefreshDirectory is an
    // application-defined function.
    //
    
    PostMessage (hWnd,WM_USER_THREAD_FILE_CHANGED,0,0);
    FindNextChangeNotification(dwChangeHandles[0]);
    break;

   case WAIT_OBJECT_0 + 1:
   
    //
    // A directory was created or deleted in C:\.
    // Refresh the directory tree and restart the
    // change notification. RefreshTree is an
    // application-defined function.
    //

     PostMessage (hWnd,WM_USER_THREAD_FILE_CHANGED,0,0);
    FindNextChangeNotification( dwChangeHandles[1]);
    break;
   }
  }
 

 delete[] dwChangeHandles;
 return 0;
}

//---------------------------------------------------------------------------------------
//
// FUNCTION: LONG CMainWindow::OnFileChanged(WPARAM wParam, LPARAM lParam)
// PURPOSE:
// COMMENTS:
//---------------------------------------------------------------------------------------

LONG CMainWindow::OnFileChanged(WPARAM wParam, LPARAM lParam)
{
 //
 // Add process sentence if file changed here.
 //

 return 0;
}

//##################################### End of File #######################################

本文地址:http://com.8s8s.com/it/it1930.htm