CHƯƠNG 0. ÔN TẬP LÝ THUYẾT C/C++ 2
0.1 Ôn tập C . 2
0.1.1 Kiểu dữ liệu, biến và chuyển đổi kiểu . 2
0.2 Hàm và lời gọi hàm . 2
0.2.1 Phát biểu điều khiển . 2
0.2.2 Array. 2
0.2.3 Pointer. 2
0.2.4 File. 2
0.2.5 Debug – bẫy lỗi. 2
0.3 Ôn tập C++. 2
0.3.1 Class . 2
0.3.2 Cấu trúc thừa kế. 2
0.3.3 Tầm vực truy xuất. 2
0.3.4 Object . 2
CHƯƠNG 1. CÁC VẤN ĐỀ CƠ BẢN CỦA ỨNG DỤNG
WINDOWS VÀ MFC 3
1.1 GIỚI THIỆU KHUNG ỨNG DỤNG WINDOWS (WINDOWS APPLICATION) VÀ XÂY DỰNG
CHƯƠNG TRÌNH MẪU VỚI MFC APP FRAMEWORK. 3
1.1.1 Lập trình Windows . 3
1.1.2 Mô hình lập trình Windows. 3
1.1.3 Lập trình Windows với MFC. 5
1.1.4 Môi trường lập trình MS Visual C++ . 5
1.1.4.1 Miền làm việc. 5
1.1.4.2 Cửa sổ xuất (output pane) . 6
1.1.4.3 Vùng soạn thảo. 6
1.1.4.4 Thanh thực đơn (menu). 7
1.1.4.5 Thanh công cụ. 7
1.1.5 Các thành phần của ứng dụng phát triển với MS Visual C++ . 8
1.1.5.1 Đối tượng ứng dụng (Application). 9
1.1.5.2 Đối tượng Khung Cửa sổ (Frame Window). 10
1.1.5.3 Quá trình làm việc của các ánh xạ thông báo (Message Map) . 10
1.1.5.4 Windows, Character Sets, và _T Macro. 11
1.1.5.5 Hàm UpdateData. 11
1.1.6 Tạo ứng dụng với MS Visual C++ . 12
1.2 XỬ LÝ VẼ HÌNH TRONG ỨNG DỤNG WINDOWS. 16
1.2.1 Vấn đề quan tâm. 16
1.2.2 Giới thiệu. 16
1.2.3 Truy xuất ngữ cảnh thiết bị. 17
1.2.3.1 Xác định chế độ đo lường . 17
1.2.4 Thao tác vẽ với bút vẽ. 18
1.2.5 Thao tác tô màu với cọ vẽ. 21
1.2.6 Hiển thị văn bản trong môi trường đồ hoạ. 21
1.2.7 GDI Fonts và lớp CFont . 22
1.2.8 Ví dụ tổng hợp. 23
1.2.8.1 Chương trình 1 . 23
1.2.8.2 Chương trình 2 . 29
1.3 XỬ LÝ BÀN PHÍM/CHUỘT TRONG ỨNG DỤNG WINDOWS. 30
1.3.1 Vấn đề quan tâm. 30
1.3.2 Các sự kiện của chuột. 31
1.3.3 Các sự kiện của bàn phím. 32
1.4 CÁC LỚP MFC COLLECTION: ARRAY, LIST, MAP*, TYPE POINTER MAP*. 34
1.4.1 Vấn đề quan tâm. 34
1.4.2 Array collection . 34
1.4.3 List collection . 35
1.4.4 Map. 36
1.4.5 Type pointer map. 36
1.5 TRUY XUẤT FILE (I/O) VÀ SERIALIZATION. 37Lập trình Windows với VC/MFC
Trang 270
1.5.1 Vấn đề quan tâm .37
1.5.2 Lớp CFile.37
1.5.3 Chuỗi hoá và CArchive.38
1.6 CÁC LỚP MFC CỦA CÁC ĐIỀU KHIỂN WINDOWS. .42
1.6.1 Vấn đề quan tâm .42
1.6.2 Các loại điều khiển.42
1.6.3 Loại CButton.43
1.7 DIALOG BOX, COMMON DIALOG VÀ PROPERTY SHEET.43
1.7.1 Vấn đề quan tâm .43
1.7.2 Hộp thoại (dialog).43
1.7.3 Các hộp thoại thông dụng (Common Dialog Classes) .45
1.7.4 Property Sheet/Property Page .46
1.8 Một số điểu khiển trong Windows 9.x*.58
1.8.1 Các loại điểu khiển.58
1.8.2 Ví dụ tổng hợp: .59
1.8.2.1 Chương trình 1: .59
1.8.2.2 Chương trình 2: .66
CHƯƠNG 2. CẤU TRÚC DOCUMENT-VIEW CỦA MFC
WINDOWS APP 74
2.1 GIỚI THIỆU DOCUMENT-VIEW VÀ SDI (SINGLE DOCUMENT INTERFACE) .74
2.1.1 Vấn đề quan tâm .74
2.1.2 Giới thiệu .74
2.1.3 Cấu trúc Document/View .75
2.1.4 Sự tương tác giữa phần Document và phần View.76
2.2 CÁC KIỂU VIEW .76
2.2.1 Vấn đề quan tâm .76
2.2.2 Giới thiệu .77
2.2.3 Lớp CScrollView và ứng dụng .77
2.2.4 Lớp CHtmlView và ứng dụng.83
2.2.5 Lớp CTreeView và ứng dụng .87
2.2.6 Lớp CListView và ứng dụng.96
2.3 MULTI-DOCUMENT, MULTI-VIEW VÀ MDI (MULTIPLE DOCUMENT INTERFACE) .106
2.3.1 Vấn đề quan tâm .106
2.3.2 Các hoạt động trong dạng MDI.106
2.3.3 Dạng splitter.121
2.3.3.1 Tạo vùng phân chia động: .121
2.3.3.2 Tạo vùng phân chia tĩnh: .121
2.3.4 Ví dụ tổng hợp .122
2.3.4.1 Chương trình 1: .122
2.3.4.2 Chương trình 2: .135
2.4 TOOLBAR VÀ STATUSBAR .157
2.4.1 Vấn đề quan tâm .157
2.4.2 ToolBar .158
2.4.3 StatusBar.160
CHƯƠNG 3. XỬ LÝ HỆ THỐNG 177
3.1 TIMER/IDLE.177
3.1.1 Vấn đề quan tâm .177
3.1.2 Timer.177
3.1.3 Idles.178
3.2 THREADS.187
3.2.1 Vấn đề quan tâm .187
3.2.2 Giới thiệu .187
3.2.3 Threads .187
3.2.4 Đồng bộ các threads(Thread Synchronization).196
CHƯƠNG 4. LẬP TRÌNH CƠ SỞ DỮ LIỆU VỚI MFC 214
4.1 TRUY XUẤT VỚI ODBC/DAO .214
4.1.1 Vấn đề quan tâm .214Lập trình Windows với VC/MFC
Trang 271
4.1.2 Giới thiệu. 214
4.1.3 Ví dụ tổng hợp. 218
4.1.3.1 Chương trình 1: . 218
4.1.3.2 Chương trình 2: . 221
4.2 TRUY XUẤT VỚI OLEDB. 225
4.2.1 Vấn đề quan tâm. 225
4.2.2 Giới thiệu OLEDB. 225
4.2.3 Thực hiện tác vụ truy xuất dữ liệu với OLEDB: . 225
4.3 TRUY XUẤT VỚI ADO . 229
4.3.1 Vấn đề quan tâm. 229
4.3.2 Giới thiệu ADO . 229
4.3.3 Thực hiện truy xuất cơ sở dữ liệu với ADO: . 229
CHƯƠNG 5. MFC VÀ ACTIVE X 243
5.1 COMPONENT OBJECT MODEL (COM). 243
5.1.1 Vấn đề quan tâm. 243
5.1.2 Giới thiệu mô hình 3-lớp và n-lớp . 243
5.1.3 Giới thiệu COM. 243
5.1.4 Cấu trúc COM . 243
5.1.5 COM server . 246
5.1.6 MFC và COM. 247
5.2 ACTIVE X CONTROL. 250
CHƯƠNG 6. BÀI THỰC HÀNH 263
6.1 Bài thực hành 1. 263
6.2 Bài thực hành 2. 263
6.3 Bài thực hành 3. 263
6.4 Bài thực hành 4. 264
6.5 Bài thực hành 5. 265
6.6 Bài thực hành 6. 265
6.7 Bài thực hành 7. 266
6.8 Bài thực hành 8. 266
6.9 Bài thực hành 9. 266
6.10 Bài thực hành 10. 266
CHƯƠNG 7. BÀI TẬP TỔNG HỢP 267
7.1 Bài 1 . 267
7.2 Bài 2 . 267
7.3 Bài 3 . 267
7.4 Bài 4 . 268
7.5 Bài 5 . 268
7.6 Bài 6 . 268
7.7 Bài 7 . 268
272 trang |
Chia sẻ: trungkhoi17 | Lượt xem: 478 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Giáo trình Lập trình Windows với VC/MFC, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
pDoc->GetLine (i)->Draw (pDC);
}
}
void CSketchView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
SetScrollSizes(MM_LOENGLISH, CSize (1600, 1200));
}
///////////////////////////////////////////////////////////////////////////
// CSketchView diagnostics
#ifdef _DEBUG
void CSketchView::AssertValid() const
{
CScrollView::AssertValid();
}
void CSketchView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CSketchDoc* CSketchView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSketchDoc)));
return (CSketchDoc*)m_pDocument;
}
#endif //_DEBUG
///////////////////////////////////////////////////////////////////////////
// CSketchView message handlers
BOOL CSketchView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
::SetCursor (m_hCursor);
return TRUE;
}
void CSketchView::OnLButtonDown(UINT nFlags, CPoint point)
{
CScrollView::OnLButtonDown(nFlags, point);
CPoint pos = point;
CClientDC dc (this);
OnPrepareDC (&dc);
dc.DPtoLP (&pos);
if (GetDocument ()->IsGridVisible ()) {
pos.x = ((pos.x + 12) / 25) * 25;
pos.y = ((pos.y - 12) / 25) * 25;
}
m_ptFrom = pos;
m_ptTo = pos;
Lập trình Windows với VC/MFC
Trang 134
SetCapture ();
}
void CSketchView::OnMouseMove(UINT nFlags, CPoint point)
{
CScrollView::OnMouseMove(nFlags, point);
if (GetCapture () == this) {
CPoint pos = point;
CClientDC dc (this);
OnPrepareDC (&dc);
dc.DPtoLP (&pos);
if (GetDocument ()->IsGridVisible ()) {
pos.x = ((pos.x + 12) / 25) * 25;
pos.y = ((pos.y - 12) / 25) * 25;
}
if (m_ptTo != pos) {
InvertLine (&dc, m_ptFrom, m_ptTo);
InvertLine (&dc, m_ptFrom, pos);
m_ptTo = pos;
}
}
}
void CSketchView::OnLButtonUp(UINT nFlags, CPoint point)
{
CScrollView::OnLButtonUp(nFlags, point);
if (GetCapture () == this) {
::ReleaseCapture ();
CPoint pos = point;
CClientDC dc (this);
OnPrepareDC (&dc);
dc.DPtoLP (&pos);
if (GetDocument ()->IsGridVisible ()) {
pos.x = ((pos.x + 12) / 25) * 25;
pos.y = ((pos.y - 12) / 25) * 25;
}
InvertLine (&dc, m_ptFrom, m_ptTo);
CSketchDoc* pDoc = GetDocument ();
CLine* pLine = pDoc->AddLine (m_ptFrom, m_ptTo);
}
}
void CSketchView::InvertLine(CDC *pDC, POINT from, POINT to)
{
int nOldMode = pDC->SetROP2 (R2_NOT);
pDC->MoveTo (from);
pDC->LineTo (to);
pDC->SetROP2 (nOldMode);
}
void CSketchView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
Lập trình Windows với VC/MFC
Trang 135
{
if (lHint == 0x7C) {
CLine* pLine = (CLine*) pHint;
ASSERT (pLine->IsKindOf (RUNTIME_CLASS (CLine)));
CClientDC dc (this);
OnPrepareDC (&dc);
pLine->Draw (&dc);
return;
}
CScrollView::OnUpdate (pSender, lHint, pHint);
}
Màn hình kết quả như sau:
2.3.4.2 Chương trình 2:
Wanderer.h
// Wanderer.h : main header file for the WANDERER application
//
#if !defined(AFX_WANDERER_H__AE0A6FFA_9B0F_11D2_8E53_006008A82731__INCLUDED_)
#define AFX_WANDERER_H__AE0A6FFA_9B0F_11D2_8E53_006008A82731__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#ifndef __AFXWIN_H__
#error include `stdafx.h' before including this file for PCH
#endif
#include "resource.h" // main symbols
///////////////////////////////////////////////////////////////////////////
// CWandererApp:
// See Wanderer.cpp for the implementation of this class
//
class CWandererApp : public CWinApp
{
public:
CWandererApp();
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CWandererApp)
public:
Lập trình Windows với VC/MFC
Trang 136
virtual BOOL InitInstance();
//}}AFX_VIRTUAL
// Implementation
//{{AFX_MSG(CWandererApp)
afx_msg void OnAppAbout();
// NOTE - the ClassWizard will add and remove member functions here.
// DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
///////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately
// before the previous line.
#endif
// !defined(
// AFX_WANDERER_H__AE0A6FFA_9B0F_11D2_8E53_006008A82731__INCLUDED_)
Wanderer.cpp
// Wanderer.cpp : Defines the class behaviors for the application.
//
#include "stdafx.h"
#include "Wanderer.h"
#include "MainFrm.h"
#include "WandererDoc.h"
#include "DriveView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
///////////////////////////////////////////////////////////////////////////
// CWandererApp
BEGIN_MESSAGE_MAP(CWandererApp, CWinApp)
//{{AFX_MSG_MAP(CWandererApp)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
// Standard file based document commands
ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
END_MESSAGE_MAP()
///////////////////////////////////////////////////////////////////////////
// CWandererApp construction
CWandererApp::CWandererApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}
///////////////////////////////////////////////////////////////////////////
// The one and only CWandererApp object
CWandererApp theApp;
///////////////////////////////////////////////////////////////////////////
Lập trình Windows với VC/MFC
Trang 137
// CWandererApp initialization
BOOL CWandererApp::InitInstance()
{
// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.
// Change the registry key under which our settings are stored.
// TODO: You should modify this string to be something appropriate
// such as the name of your company or organization.
SetRegistryKey(_T("Local AppWizard-Generated Applications"));
LoadStdProfileSettings(); // Load standard INI file
// options (including MRU)
// Register the application's document templates. Document templates
// serve as the connection between documents, frame windows and views.
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CWandererDoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window
RUNTIME_CLASS(CDriveView));
AddDocTemplate(pDocTemplate);
// Parse command line for standard shell commands, DDE, file open
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// Dispatch commands specified on the command line
if (!ProcessShellCommand(cmdInfo))
return FALSE;
// The one and only window has been initialized, so show and update it.
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return TRUE;
}
///////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
Lập trình Windows với VC/MFC
Trang 138
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
// No message handlers
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
// App command to run the dialog
void CWandererApp::OnAppAbout()
{
CAboutDlg aboutDlg;
aboutDlg.DoModal();
}
///////////////////////////////////////////////////////////////////////////
// CWandererApp message handlers
MainFrm.h
// MainFrm.h : interface of the CMainFrame class
//
///////////////////////////////////////////////////////////////////////////
//
#if !defined(AFX_MAINFRM_H__AE0A6FFE_9B0F_11D2_8E53_006008A82731__INCLUDED_)
#define AFX_MAINFRM_H__AE0A6FFE_9B0F_11D2_8E53_006008A82731__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CMainFrame : public CFrameWnd
{
protected: // create from serialization only
CMainFrame();
DECLARE_DYNCREATE(CMainFrame)
// Attributes
public:
// Operations
Lập trình Windows với VC/MFC
Trang 139
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMainFrame)
public:
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
virtual BOOL OnCmdMsg(UINT nID, int nCode, void* pExtra,
AFX_CMDHANDLERINFO* pHandlerInfo);
protected:
virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs,
CCreateContext* pContext);
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CMainFrame();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
// Generated message map functions
protected:
CSplitterWnd m_wndSplitter;
//{{AFX_MSG(CMainFrame)
// NOTE - the ClassWizard will add and remove member functions here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
///////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately
// before the previous line.
#endif
// !defined(AFX_MAINFRM_H__AE0A6FFE_9B0F_11D2_8E53_006008A82731__INCLUDED_)
MainFrm.cpp
// MainFrm.cpp : implementation of the CMainFrame class
//
#include "stdafx.h"
#include "Wanderer.h"
#include "WandererDoc.h"
#include "DriveView.h"
#include "FileView.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
///////////////////////////////////////////////////////////////////////////
// CMainFrame
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
Lập trình Windows với VC/MFC
Trang 140
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
///////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction
CMainFrame::CMainFrame()
{
}
CMainFrame::~CMainFrame()
{
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
cs.style &= ~FWS_ADDTOTITLE;
return TRUE;
}
///////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
CFrameWnd::AssertValid();
}
void CMainFrame::Dump(CDumpContext& dc) const
{
CFrameWnd::Dump(dc);
}
#endif //_DEBUG
///////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs,
CCreateContext* pContext)
{
//
// Note: Create the CFileView first so the CDriveView's OnInitialUpdate
// function can call OnUpdate on the CFileView.
//
if (!m_wndSplitter.CreateStatic (this, 1, 2) ||
!m_wndSplitter.CreateView (0, 1, RUNTIME_CLASS
(CFileView), CSize (0, 0), pContext) ||
!m_wndSplitter.CreateView (0, 0, RUNTIME_CLASS (CDriveView),
CSize (192, 0), pContext))
return FALSE;
return TRUE;
}
BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra,
Lập trình Windows với VC/MFC
Trang 141
AFX_CMDHANDLERINFO* pHandlerInfo)
{
//
// Route to standard command targets first.
//
if (CFrameWnd::OnCmdMsg (nID, nCode, pExtra, pHandlerInfo))
return TRUE;
//
// Route to inactive views second.
//
CWandererDoc* pDoc = (CWandererDoc*) GetActiveDocument ();
if (pDoc != NULL) { // Important!
return pDoc->RouteCmdToAllViews (GetActiveView (),
nID, nCode, pExtra, pHandlerInfo);
}
return FALSE;
}
WandererDoc.h
// WandererDoc.h : interface of the CWandererDoc class
//
///////////////////////////////////////////////////////////////////////////
//
#if !defined(AFX_WANDERERDOC_H__AE0A7000_9B0F_11D2_8E53_006008A82731__INCLUDED_)
#define AFX_WANDERERDOC_H__AE0A7000_9B0F_11D2_8E53_006008A82731__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CWandererDoc : public CDocument
{
protected: // create from serialization only
CWandererDoc();
DECLARE_DYNCREATE(CWandererDoc)
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CWandererDoc)
public:
virtual BOOL OnNewDocument();
virtual void Serialize(CArchive& ar);
//}}AFX_VIRTUAL
// Implementation
public:
BOOL RouteCmdToAllViews (CView* pView, UINT nID, int nCode,
void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo);
virtual ~CWandererDoc();
#ifdef _DEBUG
Lập trình Windows với VC/MFC
Trang 142
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// Generated message map functions
protected:
//{{AFX_MSG(CWandererDoc)
// NOTE - the ClassWizard will add and remove member functions here.
// DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately
// before the previous line.
#endif
// !defined(
// AFX_WANDERERDOC_H__AE0A7000_9B0F_11D2_8E53_006008A82731__INCLUDED_)
WandererDoc.cpp
// WandererDoc.cpp : implementation of the CWandererDoc class
//
#include "stdafx.h"
#include "Wanderer.h"
#include "WandererDoc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
///////////////////////////////////////////////////////////////////////////
// CWandererDoc
IMPLEMENT_DYNCREATE(CWandererDoc, CDocument)
BEGIN_MESSAGE_MAP(CWandererDoc, CDocument)
//{{AFX_MSG_MAP(CWandererDoc)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
///////////////////////////////////////////////////////////////////////////
// CWandererDoc construction/destruction
CWandererDoc::CWandererDoc()
{
}
CWandererDoc::~CWandererDoc()
{
}
BOOL CWandererDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
Lập trình Windows với VC/MFC
Trang 143
return FALSE;
return TRUE;
}
///////////////////////////////////////////////////////////////////////////
// CWandererDoc serialization
void CWandererDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
}
}
///////////////////////////////////////////////////////////////////////////
// CWandererDoc diagnostics
#ifdef _DEBUG
void CWandererDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CWandererDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
///////////////////////////////////////////////////////////////////////////
// CWandererDoc commands
BOOL CWandererDoc::RouteCmdToAllViews(CView *pView, UINT nID, int nCode,
void *pExtra, AFX_CMDHANDLERINFO *pHandlerInfo)
{
POSITION pos = GetFirstViewPosition ();
while (pos != NULL) {
CView* pNextView = GetNextView (pos);
if (pNextView != pView) {
if (pNextView->OnCmdMsg (nID, nCode, pExtra, pHandlerInfo))
return TRUE;
}
}
return FALSE;
}
DriveView.h
// DriveTreeView.h : interface of the CDriveView class
//
/////////////////////////////////////////////////////////////////////////////
#if !defined(AFX_DRIVETREEVIEW_H__090B382D_959D_11D2_8E53_006008A82731__INCLUDED_)
#define AFX_DRIVETREEVIEW_H__090B382D_959D_11D2_8E53_006008A82731__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CDriveView : public CTreeView
Lập trình Windows với VC/MFC
Trang 144
{
protected: // create from serialization only
CDriveView();
DECLARE_DYNCREATE(CDriveView)
// Attributes
public:
CWandererDoc* GetDocument();
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CDriveView)
public:
virtual void OnDraw(CDC* pDC); // overridden to draw this view
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
virtual void OnInitialUpdate(); // called first time after construct
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CDriveView();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// Generated message map functions
protected:
BOOL AddDriveItem (LPCTSTR pszDrive);
int AddDirectories (HTREEITEM hItem, LPCTSTR pszPath);
void DeleteAllChildren (HTREEITEM hItem);
void DeleteFirstChild (HTREEITEM hItem);
CString GetPathFromItem (HTREEITEM hItem);
BOOL SetButtonState (HTREEITEM hItem, LPCTSTR pszPath);
int AddDrives ();
CImageList m_ilDrives;
//{{AFX_MSG(CDriveView)
afx_msg void OnItemExpanding(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnSelectionChanged(NMHDR* pNMHDR, LRESULT* pResult);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
#ifndef _DEBUG // debug version in DriveTreeView.cpp
inline CWandererDoc* CDriveView::GetDocument()
{ return (CWandererDoc*)m_pDocument; }
#endif
///////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
Lập trình Windows với VC/MFC
Trang 145
// Microsoft Visual C++ will insert additional declarations immediately
// before the previous line.
#endif
// !defined(
// AFX_DRIVETREEVIEW_H__090B382D_959D_11D2_8E53_006008A82731__INCLUDED_)
DriveView.cpp
// DriveTreeView.cpp : implementation of the CDriveView class
//
#include "stdafx.h"
#include "Wanderer.h"
#include "WandererDoc.h"
#include "DriveView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// Image indexes
#define ILI_HARD_DISK 0
#define ILI_FLOPPY 1
#define ILI_CD_ROM 2
#define ILI_NET_DRIVE 3
#define ILI_CLOSED_FOLDER 4
#define ILI_OPEN_FOLDER 5
///////////////////////////////////////////////////////////////////////////
// CDriveView
IMPLEMENT_DYNCREATE(CDriveView, CTreeView)
BEGIN_MESSAGE_MAP(CDriveView, CTreeView)
//{{AFX_MSG_MAP(CDriveView)
ON_NOTIFY_REFLECT(TVN_ITEMEXPANDING, OnItemExpanding)
ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelectionChanged)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
///////////////////////////////////////////////////////////////////////////
// CDriveView construction/destruction
CDriveView::CDriveView()
{
}
CDriveView::~CDriveView()
{
}
BOOL CDriveView::PreCreateWindow(CREATESTRUCT& cs)
{
if (!CTreeView::PreCreateWindow (cs))
return FALSE;
cs.style |= TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS |
TVS_SHOWSELALWAYS;
return TRUE;
}
///////////////////////////////////////////////////////////////////////////
// CDriveView drawing
Lập trình Windows với VC/MFC
Trang 146
void CDriveView::OnDraw(CDC* pDC)
{
CWandererDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
}
void CDriveView::OnInitialUpdate()
{
CTreeView::OnInitialUpdate();
//
// Initialize the image list.
//
m_ilDrives.Create (IDB_DRIVEIMAGES, 16, 1, RGB (255, 0, 255));
GetTreeCtrl ().SetImageList (&m_ilDrives, TVSIL_NORMAL);
//
// Populate the tree view with drive items.
//
AddDrives ();
//
// Show the folders on the current drive.
//
TCHAR szPath[MAX_PATH];
::GetCurrentDirectory (sizeof (szPath) / sizeof (TCHAR), szPath);
CString strPath = szPath;
strPath = strPath.Left (3);
HTREEITEM hItem = GetTreeCtrl ().GetNextItem (NULL, TVGN_ROOT);
while (hItem != NULL) {
if (GetTreeCtrl ().GetItemText (hItem) == strPath)
break;
hItem = GetTreeCtrl ().GetNextSiblingItem (hItem);
}
if (hItem != NULL) {
GetTreeCtrl ().Expand (hItem, TVE_EXPAND);
GetTreeCtrl ().Select (hItem, TVGN_CARET);
}
//
// Initialize the list view.
//
strPath = GetPathFromItem (GetTreeCtrl ().GetSelectedItem ());
GetDocument ()->UpdateAllViews (this, 0x5A,
(CObject*) (LPCTSTR) strPath);
}
///////////////////////////////////////////////////////////////////////////
// CDriveView diagnostics
#ifdef _DEBUG
void CDriveView::AssertValid() const
{
CTreeView::AssertValid();
}
void CDriveView::Dump(CDumpContext& dc) const
{
CTreeView::Dump(dc);
}
CWandererDoc* CDriveView::GetDocument() // non-debug version is inline
{
Lập trình Windows với VC/MFC
Trang 147
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CWandererDoc)));
return (CWandererDoc*)m_pDocument;
}
#endif //_DEBUG
///////////////////////////////////////////////////////////////////////////
// CDriveView message handlers
int CDriveView::AddDrives()
{
int nPos = 0;
int nDrivesAdded = 0;
CString string = _T ("?:\\");
DWORD dwDriveList = ::GetLogicalDrives ();
while (dwDriveList) {
if (dwDriveList & 1) {
string.SetAt (0, _T (`A') + nPos);
if (AddDriveItem (string))
nDrivesAdded++;
}
dwDriveList >>= 1;
nPos++;
}
return nDrivesAdded;
}
BOOL CDriveView::AddDriveItem(LPCTSTR pszDrive)
{
CString string;
HTREEITEM hItem;
UINT nType = ::GetDriveType (pszDrive);
switch (nType) {
case DRIVE_REMOVABLE:
hItem = GetTreeCtrl ().InsertItem (pszDrive, ILI_FLOPPY,
ILI_FLOPPY);
GetTreeCtrl ().InsertItem (_T (""), ILI_CLOSED_FOLDER,
ILI_CLOSED_FOLDER, hItem);
break;
case DRIVE_FIXED:
case DRIVE_RAMDISK:
hItem = GetTreeCtrl ().InsertItem (pszDrive, ILI_HARD_DISK,
ILI_HARD_DISK);
SetButtonState (hItem, pszDrive);
break;
case DRIVE_REMOTE:
hItem = GetTreeCtrl ().InsertItem (pszDrive, ILI_NET_DRIVE,
ILI_NET_DRIVE);
SetButtonState (hItem, pszDrive);
break;
case DRIVE_CDROM:
hItem = GetTreeCtrl ().InsertItem (pszDrive, ILI_CD_ROM,
ILI_CD_ROM);
GetTreeCtrl ().InsertItem (_T (""), ILI_CLOSED_FOLDER,
ILI_CLOSED_FOLDER, hItem);
Lập trình Windows với VC/MFC
Trang 148
break;
default:
return FALSE;
}
return TRUE;
}
BOOL CDriveView::SetButtonState(HTREEITEM hItem, LPCTSTR pszPath)
{
HANDLE hFind;
WIN32_FIND_DATA fd;
BOOL bResult = FALSE;
CString strPath = pszPath;
if (strPath.Right (1) != _T ("\\"))
strPath += _T ("\\");
strPath += _T ("*.*");
if ((hFind = ::FindFirstFile (strPath, &fd)) == INVALID_HANDLE_VALUE)
return bResult;
do {
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
CString strComp = (LPCTSTR) &fd.cFileName;
if ((strComp != _T (".")) && (strComp != _T (".."))) {
GetTreeCtrl ().InsertItem (_T (""), ILI_CLOSED_FOLDER,
ILI_CLOSED_FOLDER, hItem);
bResult = TRUE;
break;
}
}
} while (::FindNextFile (hFind, &fd));
::FindClose (hFind);
return bResult;
}
void CDriveView::OnItemExpanding(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
HTREEITEM hItem = pNMTreeView->itemNew.hItem;
CString string = GetPathFromItem (hItem);
*pResult = FALSE;
if (pNMTreeView->action == TVE_EXPAND) {
DeleteFirstChild (hItem);
if (AddDirectories (hItem, string) == 0)
*pResult = TRUE;
}
else { // pNMTreeView->action == TVE_COLLAPSE
DeleteAllChildren (hItem);
if (GetTreeCtrl ().GetParentItem (hItem) == NULL)
GetTreeCtrl ().InsertItem (_T (""), ILI_CLOSED_FOLDER,
ILI_CLOSED_FOLDER, hItem);
else
SetButtonState (hItem, string);
Lập trình Windows với VC/MFC
Trang 149
}
}
CString CDriveView::GetPathFromItem(HTREEITEM hItem)
{
CString strResult = GetTreeCtrl ().GetItemText (hItem);
HTREEITEM hParent;
while ((hParent = GetTreeCtrl ().GetP
Các file đính kèm theo tài liệu này:
- giao_trinh_lap_trinh_windows_voi_vcmfc.pdf