再谈用MFC实现文件拖放到编辑框
---- 黃向明同學分別講解了基于CFormView和dialog的實現(xiàn),下面我簡單介紹一下基于cview的實現(xiàn),以及基于dialog的另一種實現(xiàn),為了便于演示程序運行結(jié)果,程序中沒使用編輯框,而是listbox來接受被拖動的文件名,這樣也便于演示多個文件的拖動。
---- 一、文件拖放到cview中的listbox
---- 1、用MFC Appwizard創(chuàng)建一個基于SDI的新工程,命名為Drag,除第一步選擇第一項以外,其余全用默認設置。
---- 2、DragView.h文件
CListBox m_View_List; ---- 3、DragView.cpp文件---- 用classwizard添加WM_CREATE消息響應,然后在OnCreate函數(shù)中添加如下代碼:
DragAcceptFiles();//向file manager注冊自己, 使自己能接受droped file(s) CRectrect(0,0,100,80);m_View_List.Create (WS_VISIBLE|WS_VSCROLL,rect,this, IDC_VIEW_LIST);//創(chuàng)建listbox ---- 4、Resource.h---- 修改Resource.h文件,為listbox的ID(IDC_VIEW_LIST)分配一個值
---- 例如:#define IDC_VIEW_LIST 1000
---- 5、DragView.cpp文件
---- 用classwizard添加WM_SIZE消息響應,然后在OnSize函數(shù)中添加如下代碼:
---- m_View_List.MoveWindow(0,0,cx,cy);//使listbox所占區(qū)域始終保持與客戶區(qū)一樣大
---- 6、DragView.cpp文件
---- 用classwizard添加WM_DROPFILES消息響應,然后在OnDropFiles函數(shù)中添加如下代碼:
void CDragView::OnDropFiles(HDROP hDropInfo) { int DropCount=DragQueryFile(hDropInfo,-1,NULL,0); //取得被拖動文件的數(shù)目for(int i=0;i< DropCount;i++){ int NameSize=DragQueryFile(hDropInfo,i,NULL,0); //取得第i個拖動文件名所占字節(jié)數(shù)HANDLE hHeap=GetProcessHeap();char *pName=(LPSTR)HeapAlloc (hHeap,HEAP_ZERO_MEMORY, NameSize++);//根據(jù)字節(jié)數(shù)分配緩沖區(qū)if (pName==NULL) {MessageBox("給文件名分配暫存空間時出錯!", "錯誤信息",MB_ICONERROR);return;}DragQueryFile(hDropInfo,i,pName,NameSize); //把文件名拷貝到緩沖區(qū)m_View_List.AddString(pName); //文件名加入listbox中顯示HeapFree(hHeap,HEAP_ZERO_MEMORY,pName); //釋放緩沖區(qū)} CView::OnDropFiles(hDropInfo);} ---- 到此就完成了文件拖放到view中的listbox,你可以編譯、運行了。---- 二、文件拖放到對話框中的listbox
---- 1、在上邊生成的Drag工程成添加一個對話框,ID為IDD_DRAG_DIALOG,并生成一個新類CDragDialog,在Extend Style中選中Accept File 選項。
---- 2、在對話框中添加一個listbox控件,ID為IDC_DIALOG_LIST,去掉sort style。
---- 3、手工添加WM_DROPFILES消息響應,這與自定義消息差不多,但更簡單,因為這里不需要
---- 你定義WM_DROPFILES;
---- (1)在DragDialog.h文件聲明消息處理函數(shù):
afx_msg void OnDropFiles(HDROP hDropInfo); ---- (2)其次在DragDialog.cpp的消息映射中指出消息處理入口: ON_MESSAGE(WM_DROPFILES,OnDropFiles) (也可以為宏ON_WM_DROPFILES()); ---- (3)最后定義消息處理函數(shù),這與在cview中第6步差不多: void CDragDialog::OnDropFiles(HDROP hDropInfo) {int DropCount=DragQueryFile(hDropInfo,-1,NULL,0); //取得被拖動文件的數(shù)目for(int i=0;i< DropCount;i++){int NameSize=DragQueryFile(hDropInfo,i,NULL,0); //取得第i個拖動文件名所占字節(jié)數(shù)HANDLE hHeap=GetProcessHeap();char *pName=(LPSTR)HeapAlloc(hHeap,HEAP_ZERO_MEMORY, NameSize++);//根據(jù)字節(jié)數(shù)分配緩沖區(qū)if (pName==NULL) {MessageBox("給文件名分配暫存空間時出錯!", "錯誤信息",MB_ICONERROR);return;}DragQueryFile(hDropInfo,i,pName,NameSize); //把文件名拷貝到緩沖區(qū)m_Dialog_List.AddString(pName); //文件名加入listbox中顯示HeapFree(hHeap,HEAP_ZERO_MEMORY,pName); //釋放緩沖區(qū)}CDialog::OnDropFiles(hDropInfo);} ---- 4、從資源中修改menu,添加一個菜單“測試”,以彈出我們剛才添加的對話框,菜單ID為ID_DRAG_TEST;---- 5、在MainFrm.cpp中加入對話框頭文件,并用classwizard添加ID_DRAG_TEST的響應函數(shù);
#include "DragDialog.h"......void CMainFrame::OnDragTest() {CDragDialog dlg;dlg.DoModal();}總結(jié)
以上是生活随笔為你收集整理的再谈用MFC实现文件拖放到编辑框的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 台湾大学林轩田机器学习基石课程学习笔记1
- 下一篇: 给程序员的二十条人生建议
