?? gpsguiview.cpp
字號(hào):
#include "stdafx.h"
#include <gps.h>
#include "resource.h"
#include "GPSGuiDoc.h"
#include "GPSGuiView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_DYNCREATE(CGPSGuiView, CListView)
BEGIN_MESSAGE_MAP(CGPSGuiView, CListView)
ON_WM_CONTEXTMENU()
//{{AFX_MSG_MAP(CGPSGuiView)
ON_COMMAND(ID_FILE_PROPERTIES, OnFileProperties)
ON_UPDATE_COMMAND_UI(ID_FILE_PROPERTIES, OnUpdateFileProperties)
ON_COMMAND(ID_FILE_RENAME, OnFileRename)
ON_UPDATE_COMMAND_UI(ID_FILE_RENAME, OnUpdateFileRename)
ON_COMMAND(ID_VIEW_GPS_DETAILS, OnViewDetails)
ON_UPDATE_COMMAND_UI(ID_VIEW_GPS_DETAILS, OnUpdateViewDetails)
ON_COMMAND(ID_VIEW_GPS_LARGEICONS, OnViewLargeicons)
ON_UPDATE_COMMAND_UI(ID_VIEW_GPS_LARGEICONS, OnUpdateViewLargeicons)
ON_COMMAND(ID_VIEW_GPS_LIST, OnViewList)
ON_UPDATE_COMMAND_UI(ID_VIEW_GPS_LIST, OnUpdateViewList)
ON_COMMAND(ID_VIEW_GPS_SMALLLICONS, OnViewSmalllicons)
ON_UPDATE_COMMAND_UI(ID_VIEW_GPS_SMALLLICONS, OnUpdateViewSmalllicons)
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
ON_UPDATE_COMMAND_UI(ID_FILE_OPEN, OnUpdateFileOpen)
ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblclk)
ON_COMMAND(ID_FILE_DELETE, OnFileDelete)
ON_UPDATE_COMMAND_UI(ID_FILE_DELETE, OnUpdateFileDelete)
ON_NOTIFY_REFLECT(LVN_BEGINLABELEDIT, OnBeginlabeledit)
ON_NOTIFY_REFLECT(LVN_ENDLABELEDIT, OnEndlabeledit)
ON_COMMAND(ID_EDIT_INVERTSELECTION, OnEditInvertselection)
ON_COMMAND(ID_EDIT_SELECTALL, OnEditSelectAll)
ON_COMMAND(ID_POPUP_SETASDEFAULT, OnPopupSetasdefault)
ON_UPDATE_COMMAND_UI(ID_POPUP_SETASDEFAULT, OnUpdatePopupSetasdefault)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
CGPSGuiView::CGPSGuiView()
{
m_SmallImageList.Create(IDB_SMALL_IMAGELIST, 16, 1, RGB(255, 0, 255));
m_BigImageList.Create(IDB_BIG_IMAGELIST, 32, 1, RGB(255, 0, 255));
}
CGPSGuiView::~CGPSGuiView()
{
}
BOOL CGPSGuiView::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style |= LVS_EDITLABELS;
return CListView::PreCreateWindow(cs);
}
void CGPSGuiView::OnDraw(CDC* /*pDC*/)
{
CGPSGuiDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
}
#ifdef _DEBUG
void CGPSGuiView::AssertValid() const
{
CListView::AssertValid();
}
void CGPSGuiView::Dump(CDumpContext& dc) const
{
CListView::Dump(dc);
}
CGPSGuiDoc* CGPSGuiView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGPSGuiDoc)));
return (CGPSGuiDoc*)m_pDocument;
}
#endif //_DEBUG
void CGPSGuiView::OnFileProperties()
{
int nCurSel = GetCurSel();
GpsPropertiesDlg(GetSafeHwnd(), GetListCtrl().GetItemText(nCurSel, 0));
}
void CGPSGuiView::OnUpdateFileProperties(CCmdUI* pCmdUI)
{
pCmdUI->Enable(!IsWizardSelected() && GetSelectedCount() == 1);
}
void CGPSGuiView::OnFileRename()
{
GetListCtrl().EditLabel(GetCurSel());
}
void CGPSGuiView::OnUpdateFileRename(CCmdUI* pCmdUI)
{
pCmdUI->Enable(!IsWizardSelected() && GetSelectedCount() == 1);
}
void CGPSGuiView::OnBeginlabeledit(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
if (pDispInfo->item.iItem == 0)
*pResult = TRUE;
else
*pResult = FALSE;
}
void CGPSGuiView::OnEndlabeledit(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
if (pDispInfo->item.pszText)
{
if (GpsDeviceNameAlreadyExists(pDispInfo->item.pszText))
{
CString sMsg;
AfxFormatString1(sMsg, IDS_NON_UNIQUE_NAME, GetListCtrl().GetItemText(pDispInfo->item.iItem, 0));
AfxMessageBox(sMsg);
SendMessage(WM_COMMAND, ID_FILE_RENAME);
*pResult = FALSE;
}
else
{
GpsRenameEntry(GetListCtrl().GetItemText(pDispInfo->item.iItem, 0), pDispInfo->item.pszText);
RefreshDeviceList();
*pResult = TRUE;
}
}
*pResult = 0;
}
void CGPSGuiView::OnViewDetails()
{
ModifyStyle(LVS_TYPEMASK, LVS_REPORT);
}
void CGPSGuiView::OnUpdateViewDetails(CCmdUI* pCmdUI)
{
LONG nStyle = GetWindowLong(GetSafeHwnd(), GWL_STYLE);
pCmdUI->SetCheck((nStyle & LVS_TYPEMASK) == LVS_REPORT);
}
void CGPSGuiView::OnViewLargeicons()
{
ModifyStyle(LVS_TYPEMASK, LVS_ICON);
}
void CGPSGuiView::OnUpdateViewLargeicons(CCmdUI* pCmdUI)
{
LONG nStyle = GetWindowLong(GetSafeHwnd(), GWL_STYLE);
pCmdUI->SetCheck((nStyle & LVS_TYPEMASK) == LVS_ICON);
}
void CGPSGuiView::OnViewList()
{
ModifyStyle(LVS_TYPEMASK, LVS_LIST);
}
void CGPSGuiView::OnUpdateViewList(CCmdUI* pCmdUI)
{
LONG nStyle = GetWindowLong(GetSafeHwnd(), GWL_STYLE);
pCmdUI->SetCheck((nStyle & LVS_TYPEMASK) == LVS_LIST);
}
void CGPSGuiView::OnViewSmalllicons()
{
ModifyStyle(LVS_TYPEMASK, LVS_SMALLICON);
}
void CGPSGuiView::OnUpdateViewSmalllicons(CCmdUI* pCmdUI)
{
LONG nStyle = GetWindowLong(GetSafeHwnd(), GWL_STYLE);
pCmdUI->SetCheck((nStyle & LVS_TYPEMASK) == LVS_SMALLICON);
}
BOOL CGPSGuiView::IsSelected(int nIndex)
{
LV_ITEM lvi;
ZeroMemory(&lvi, sizeof(LV_ITEM));
lvi.mask = LVIF_STATE;
lvi.iItem = nIndex;
lvi.stateMask = LVIS_SELECTED;
GetListCtrl().GetItem(&lvi);
return ((lvi.state & LVIS_SELECTED) == LVIS_SELECTED);
}
int CGPSGuiView::GetCurSel()
{
int nIndex = LB_ERR;
for (int i=0; i<GetListCtrl().GetItemCount(); i++)
{
if (IsSelected(i))
{
nIndex = i;
break;
}
}
return nIndex;
}
BOOL CGPSGuiView::IsWizardSelected()
{
return IsSelected(0);
}
int CGPSGuiView::GetSelectedCount()
{
int nCount = 0;
for (int i=0; i<GetListCtrl().GetItemCount(); i++)
{
if (IsSelected(i))
++nCount;
}
return nCount;
}
void CGPSGuiView::RefreshDeviceList()
{
// enumate all the installed GPS devices
DWORD dwDevices = GpsGetNumDevices();
GPSDEVINFO* pGpsDevInfo = new GPSDEVINFO[dwDevices];
dwDevices = GpsEnumDevices(pGpsDevInfo, dwDevices);
//remove all the current items
GetListCtrl().DeleteAllItems();
//attach the image lists
GetListCtrl().SetImageList(&m_SmallImageList, LVSIL_SMALL);
GetListCtrl().SetImageList(&m_BigImageList, LVSIL_NORMAL);
//create the 1 and only column for report mode
CString sText;
sText.LoadString(IDS_COLUMN1_CAPTION);
GetListCtrl().InsertColumn(0, sText, LVCFMT_LEFT, 200);
//show the wizard
sText.LoadString(IDS_WIZARD_CAPTION);
GetListCtrl().InsertItem(GetListCtrl().GetItemCount(), sText, 1);
//show the installed receivers
for (DWORD i=0; i<dwDevices; i++)
GetListCtrl().InsertItem(GetListCtrl().GetItemCount(), pGpsDevInfo[i].szDeviceName, 0);
delete [] pGpsDevInfo;
}
void CGPSGuiView::OnInitialUpdate()
{
CListView::OnInitialUpdate();
RefreshDeviceList();
}
void CGPSGuiView::OnFileOpen()
{
if (GpsCreateEntry(GetSafeHwnd()))
RefreshDeviceList();
}
void CGPSGuiView::OnUpdateFileOpen(CCmdUI* pCmdUI)
{
pCmdUI->Enable(IsWizardSelected() && GetSelectedCount() == 1);
}
void CGPSGuiView::OnContextMenu(CWnd*, CPoint point)
{
if (point.x == -1 && point.y == -1)
{ //keystroke invocation CRect rect; GetClientRect(rect); ClientToScreen(rect); point = rect.TopLeft(); point.Offset(5, 5); } CMenu menu;
if (GetSelectedCount() == 1)
VERIFY(menu.LoadMenu(IDR_POPUP_VIEW_OBJECT));
else
VERIFY(menu.LoadMenu(IDR_POPUP_VIEW_NOOBJECT));
CMenu* pPopup = menu.GetSubMenu(0); ASSERT(pPopup != NULL);
if (IsWizardSelected())
SetMenuDefaultItem(pPopup->m_hMenu, ID_FILE_OPEN, FALSE);
else
SetMenuDefaultItem(pPopup->m_hMenu, ID_FILE_PROPERTIES, FALSE);
CWnd* pWndPopupOwner = this; while (pWndPopupOwner->GetStyle() & WS_CHILD) pWndPopupOwner = pWndPopupOwner->GetParent(); pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, pWndPopupOwner);}
void CGPSGuiView::OnDblclk(NMHDR* /*pNMHDR*/, LRESULT* pResult)
{
if (GetSelectedCount() == 1)
{
if (IsWizardSelected())
SendMessage(WM_COMMAND, ID_FILE_OPEN);
else
SendMessage(WM_COMMAND, ID_FILE_PROPERTIES);
}
*pResult = 0;
}
void CGPSGuiView::OnFileDelete()
{
int nCount = GetSelectedCount();
if (nCount == 1)
{
CString sMsg;
AfxFormatString1(sMsg, IDS_DELETE_PROMPT_SINGLE, GetListCtrl().GetItemText(GetCurSel(), 0));
if (AfxMessageBox(sMsg, MB_YESNO) != IDYES)
return;
}
else
{
CString sMsg;
CString sNum;
sNum.Format(_T("%d"), nCount);
AfxFormatString1(sMsg, IDS_DELETE_PROMPT_MULTI, sNum);
if (AfxMessageBox(sMsg, MB_YESNO) != IDYES)
return;
}
for (int i=0; i<GetListCtrl().GetItemCount(); i++)
{
if (IsSelected(i))
GpsDeleteEntry(GetListCtrl().GetItemText(i, 0));
}
RefreshDeviceList();
}
void CGPSGuiView::OnUpdateFileDelete(CCmdUI* pCmdUI)
{
pCmdUI->Enable((GetSelectedCount() >= 1) && !IsWizardSelected());
}
void CGPSGuiView::SelectItem(int nIndex)
{
LV_ITEM lvi;
ZeroMemory(&lvi, sizeof(LV_ITEM));
lvi.mask = LVIF_STATE;
lvi.iItem = nIndex;
lvi.stateMask = LVIS_SELECTED;
lvi.state = LVIS_SELECTED;
GetListCtrl().SetItem(&lvi);
}
void CGPSGuiView::UnselectItem(int nIndex)
{
LV_ITEM lvi;
ZeroMemory(&lvi, sizeof(LV_ITEM));
lvi.mask = LVIF_STATE;
lvi.iItem = nIndex;
lvi.stateMask = LVIS_SELECTED;
lvi.state = 0;
GetListCtrl().SetItem(&lvi);
}
void CGPSGuiView::OnEditInvertselection()
{
for (int i=0; i<GetListCtrl().GetItemCount(); i++)
{
if (IsSelected(i))
UnselectItem(i);
else
SelectItem(i);
}
}
void CGPSGuiView::OnEditSelectAll()
{
for (int i=0; i<GetListCtrl().GetItemCount(); i++)
SelectItem(i);
}
void CGPSGuiView::OnPopupSetasdefault()
{
CString sText = GetListCtrl().GetItemText(GetCurSel(), 0);
GPSDEVINFO DevInfo;
if (GpsGetDevice(sText, &DevInfo))
{
DevInfo.bDefaultReceiver = TRUE;
if (!GpsSetDevice(sText, &DevInfo))
TRACE(_T("Failed in call to GpsSetDevice\n"));
}
else
TRACE(_T("Failed in call to GpsGetDevice\n"));
}
void CGPSGuiView::OnUpdatePopupSetasdefault(CCmdUI* pCmdUI)
{
BOOL bEnable = ((GetSelectedCount() >= 1) && !IsWizardSelected());
pCmdUI->Enable(bEnable);
if (bEnable)
{
CString sText = GetListCtrl().GetItemText(GetCurSel(), 0);
GPSDEVINFO DevInfo;
pCmdUI->SetCheck(GpsGetDevice(sText, &DevInfo) && DevInfo.bDefaultReceiver);
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -