您的位置:首页 > 其它

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

2003-03-06 09:10 696 查看
//#######################################################################################
// 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 #######################################
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐