天天看点

项目里的PDA程序

今天终于把pda版本重新做好,最近好多东西要烦,烦这烦那,没时间做这个东西,今天总算弄好了,可以安心开始看书了!

这个pda版本把早段时间做的跨平台socket库用上,所以基本上底层网络基本不用怎么做,直接用就好了,然后再加上原来那些上层代码复用,所以功能很快就实现,主要可能是一些Pocket pc不兼容的函数或者控件需要考虑,记录一下:

1)如果忘记定义析构函数,有可能导致程序在pocket pc上会无端端退出。

2)代码记录:

添加菜单代码:

void CPDACtrlDlg::initMenu()

{

 hwndCB = CommandBar_Create(::AfxGetInstanceHandle(),this->GetSafeHwnd(),1);

 CommandBar_InsertMenubar (hwndCB,::AfxGetInstanceHandle(), IDR_MAIN_MENU, 0);

 CommandBar_AddAdornments (hwndCB, WM_HELP , 0);

}

全屏设置代码:

void CPDACtrlDlg::initGUI()

{

 RECT rc;

 GetWindowRect(&rc);

 rc.top-=26;

 MoveWindow(rc.left,rc.top,rc.right,rc.bottom,FALSE); //上移26像素

 SHFullScreen(this->m_hWnd,SHFS_HIDETASKBAR); //隐藏任务栏

 initMenu();

}

菜单check项修改:

HMENU hmenu = ::CommandBar_GetMenu(hwndCB,0);

 UINT state = ::GetMenuState(hmenu,ID_PUSHPLAY,MF_BYCOMMAND);

 ASSERT(state != 0xFFFFFFFF);

 if (state & MF_CHECKED)

 {

  pBaseServer->unloadService(pCallPlayResp->getRespType());

  CheckMenuItem(hmenu,ID_PUSHPLAY, MF_UNCHECKED | MF_BYCOMMAND);

 } 

 else

 {

  pBaseServer->loadService(pCallPlayResp);

  CheckMenuItem(hmenu,ID_PUSHPLAY, MF_CHECKED | MF_BYCOMMAND);

 }

3)wince选择一个或多个文件,利用CFileDialog试过不行,所以干脆自己做了个简单的,利用CTreeCtrl

和CListCtrl一起,做了一个像wince中的资源管理器的东西,代码通过递归所有文件夹目录,在CListCtrl中

显示当前目录下的文件(非文件夹),可以从CListCtrl中选择多个文件,记录文件路径

代码:

DirDlg头文件

#pragma once

// CDirDialog 对话框

#include<string>

#include<vector>

#include "afx.h"

using namespace std;

class CDirDialog : public CDialog

{

DECLARE_DYNAMIC(CDirDialog)

public:

CDirDialog(int MAXFILENUM = 500,CWnd* pParent = NULL); // 标准构造函数

virtual ~CDirDialog();

// 对话框数据

enum { IDD = IDD_LISTDLG };

private:

void initImageList();

void clrImageList();

void initDirTree();

void clrFileList(CListCtrl *pList);

void clrTreeItem(CTreeCtrl *pTree,HTREEITEM item);

void initGUI();

void clrGUI();

vector<WIN32_FIND_DATA> findFile(string dir);

void getDirFile(CListCtrl *pList,CTreeCtrl *pTree,HTREEITEM root);

string getPath(CTreeCtrl *pTree,HTREEITEM item);

void recurDir(string dir,CTreeCtrl *pTree,HTREEITEM root);

public:

vector<string> getSelFile(); //返回路径

private:

CListCtrl *pFileList;

CTreeCtrl *pDirTree;

CImageList *pImageList;

vector<string>vecSelPath;

vector<string>vecTmp;

HWND hwndCB;

int iMaxFileNum; //最大存储显示文件数目

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持

DECLARE_MESSAGE_MAP()

public:

virtual BOOL OnInitDialog();

public:

afx_msg void OnTvnSelchangedDir(NMHDR *pNMHDR, LRESULT *pResult);

public:

afx_msg void OnClose();

public:

afx_msg void OnBnClickedOk();

public:

afx_msg void OnBnClickedCancel();

public:

afx_msg void OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized);

public:

afx_msg void OnSettingChange(UINT uFlags, LPCTSTR lpszSection);

};

DirDlg实现文件

// DirDialog.cpp : 实现文件

//

#include "../stdafx.h"

#include "../DlgSrc/PDACtrl.h"

#include "DirDialog.h"

// CDirDialog 对话框

IMPLEMENT_DYNAMIC(CDirDialog, CDialog)

CDirDialog::CDirDialog(int MAXFILENUM,CWnd* pParent /*=NULL*/)

: CDialog(CDirDialog::IDD, pParent)

{

this->iMaxFileNum = MAXFILENUM;

}

CDirDialog::~CDirDialog()

{

}

void CDirDialog::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

}

BEGIN_MESSAGE_MAP(CDirDialog, CDialog)

ON_WM_CREATE()

ON_NOTIFY(TVN_SELCHANGED, IDC_DIR, &CDirDialog::OnTvnSelchangedDir)

ON_WM_CLOSE()

ON_BN_CLICKED(IDC_OK, &CDirDialog::OnBnClickedOk)

ON_BN_CLICKED(IDC_CANCEL, &CDirDialog::OnBnClickedCancel)

ON_WM_ACTIVATE()

ON_WM_SETTINGCHANGE()

END_MESSAGE_MAP()

// CDirDialog 消息处理程序

void CDirDialog::initGUI()

{

RECT rc;

GetWindowRect(&rc);

rc.top-=26;

MoveWindow(rc.left,rc.top,rc.right,rc.bottom,FALSE); //上移26像素

SHFullScreen(this->m_hWnd,SHFS_HIDETASKBAR); //隐藏任务栏

hwndCB = CommandBar_Create(::AfxGetInstanceHandle(),this->GetSafeHwnd(),1);

CommandBar_AddAdornments (hwndCB, WM_HELP, 0);

}

void CDirDialog::clrGUI()

{

::CommandBar_Destroy(hwndCB);

}

void CDirDialog::initDirTree()

{

pFileList = (CListCtrl*)this->GetDlgItem(IDC_FILELIST);

pDirTree = (CTreeCtrl*)this->GetDlgItem(IDC_DIR);

pFileList->SetImageList(pImageList,LVSIL_SMALL);

pDirTree->SetImageList(pImageList,TVSIL_NORMAL);

int iIndex = 0;

HTREEITEM root = pDirTree->InsertItem(L".",1,1);

recurDir(".",pDirTree,root);

}

void CDirDialog::initImageList()

{

pImageList = new CImageList();

pImageList->Create(16,16,ILC_COLOR,2,6);

CBitmap *pBmp = new CBitmap();

pBmp->LoadBitmapW(IDB_FILEBMP);

pImageList->Add(pBmp,(CBitmap*)NULL);

delete pBmp;

pBmp = new CBitmap();

pBmp->LoadBitmapW(IDB_FOLDERBMP);

pImageList->Add(pBmp,(CBitmap*)NULL);

delete pBmp;

}

void CDirDialog::clrImageList()

{

delete pImageList;

}

BOOL CDirDialog::OnInitDialog()

{

CDialog::OnInitDialog();

// TODO: 在此添加额外的初始化

initImageList();

initDirTree();

return TRUE; // return TRUE unless you set the focus to a control

// 异常: OCX 属性页应返回 FALSE

}

vector<WIN32_FIND_DATA> CDirDialog::findFile(string dir)

{

vector<WIN32_FIND_DATA>vecRet;

WIN32_FIND_DATA ffd;

HANDLE hFind;

USES_CONVERSION;

hFind = FindFirstFile(A2W(dir.c_str()), &ffd);

if (hFind == INVALID_HANDLE_VALUE)

{

//no file found

}

else

{

do{

vecRet.push_back(ffd);

}while(FindNextFile(hFind, &ffd));

}

FindClose(hFind);

return vecRet;

}

void CDirDialog::recurDir(string dir,CTreeCtrl *pTree,HTREEITEM root)

{

USES_CONVERSION;

vector<WIN32_FIND_DATA> vecFile;

dir += "//*";

vecFile = findFile(dir);

if(vecFile.size() == 0)

return;

else

{

int iIndex = 0;

string strPath = getPath(pTree,root);

for(int i = 0;i<vecFile.size();i++)

{

if(vecFile[i].dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)

{

HTREEITEM cItem = pDirTree->InsertItem(vecFile[i].cFileName,1,1,root);

string strCurDir = strPath + (string)W2A(vecFile[i].cFileName);

recurDir(strCurDir,pTree,cItem);

}

}

}

}

string CDirDialog::getPath(CTreeCtrl *pTree,HTREEITEM item)

{

USES_CONVERSION;

string strPath("");

string curDir = (string)W2A(pDirTree->GetItemText(item));

while((item = pDirTree->GetParentItem(item)) != NULL)

{

CString cs = pDirTree->GetItemText(item);

strPath = (string)W2A(cs) +"//" + strPath;

}

strPath = strPath + curDir + "//";

return strPath; // 返回 路径 + / eg ./root/test

}

void CDirDialog::clrFileList(CListCtrl *pList)

{

pList->DeleteAllItems();

}

void CDirDialog::clrTreeItem(CTreeCtrl *pTree,HTREEITEM hDelItem)

{

HTREEITEM hChildItem = pTree->GetChildItem(hDelItem);

while (hChildItem != NULL)

{

pTree->DeleteItem(hChildItem);

hChildItem = pTree->GetChildItem(hDelItem);

}

}

void CDirDialog::getDirFile(CListCtrl *pList,CTreeCtrl *pTree,HTREEITEM root)

{

clrFileList(pList);

vecTmp.clear();

vecTmp.reserve(iMaxFileNum);

USES_CONVERSION;

string strPath = getPath(pTree,root);

string dir = strPath + "//*";

vector<WIN32_FIND_DATA> vecFile;

vecFile = findFile(dir);

int iIndex = 0;

int jL(0);

for(int i = 0;i<vecFile.size();i++)

{

if(!(vecFile[i].dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))

{

string strFile = strPath + (string)W2A(vecFile[i].cFileName);

vecTmp.push_back(strFile);

pFileList->InsertItem(jL,vecFile[i].cFileName,0);

pFileList->SetItemData(jL,(DWORD)&vecTmp[jL]);

jL++;

}

}

}

void CDirDialog::OnTvnSelchangedDir(NMHDR *pNMHDR, LRESULT *pResult)

{

LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);

// TODO: 在此添加控件通知处理程序代码

HTREEITEM selItem = pDirTree->GetSelectedItem();

if(selItem == NULL)

return;

getDirFile(pFileList,pDirTree,selItem);

*pResult = 0;

}

void CDirDialog::OnClose()

{

// TODO: 在此添加消息处理程序代码和/或调用默认值

clrImageList();

CDialog::OnClose();

}

vector<string> CDirDialog::getSelFile()

{

return vecSelPath;

}

void CDirDialog::OnBnClickedOk()

{

// TODO: 在此添加控件通知处理程序代码

POSITION pos = pFileList->GetFirstSelectedItemPosition();

int index(0);

while(pos)

{

index = pFileList->GetNextSelectedItem(pos);

string strPath = (*(string*)pFileList->GetItemData(index));

vecSelPath.push_back(strPath);

}

EndDialog(IDOK);

}

void CDirDialog::OnBnClickedCancel()

{

// TODO: 在此添加控件通知处理程序代码

EndDialog(IDCANCEL);

}

void CDirDialog::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)

{

CWnd::OnActivate(nState, pWndOther, bMinimized);

SHFullScreen( this->m_hWnd, SHFS_HIDETASKBAR);

// TODO: 在此处添加消息处理程序代码

}

void CDirDialog::OnSettingChange(UINT uFlags, LPCTSTR lpszSection)

{

//CDialog::OnSettingChange(uFlags, lpszSection);

// TODO: 在此处添加消息处理程序代码

}

效果

项目里的PDA程序

4)程序运行效果图:

项目里的PDA程序
项目里的PDA程序
项目里的PDA程序
项目里的PDA程序