VC,MAPX 的打印,鹰眼
1.看了网上的一些资料,打印的时候 使用 PrintMap 函数的,他的第一次参数是 HDC 的,这个dc怎么获取的啊,书上也是一带而过的,打印设备上下文的,不知道这个dc是怎么获取的啊?
2. vc+mapx 的鹰眼是怎么做的啊,有工程文件吗,网上找到的一些函数很多变量都不知道是那里申明的...
[解决办法]
看来你的VC水平不怎么样..
找个VC用得多点的人指导一下吧
遗憾的是 我VC也不咋的且多年不练了
[解决办法]
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "global.h"
#include "GStar.h"
#include "MainFrm.h"
#include "NavigationBar.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
//
BEGIN_MESSAGE_MAP(CNavigationBar, CBCGSizingControlBar)
//{{AFX_MSG_MAP(CNavigationBar)
ON_WM_CREATE()
ON_WM_SIZE()
ON_WM_CONTEXTMENU()
ON_WM_WINDOWPOSCHANGED()
ON_WM_KEYDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BEGIN_EVENTSINK_MAP(CNavigationBar, CBCGSizingControlBar)
//{{AFX_EVENTSINK_MAP(CMy01Dlg)
ON_EVENT(CNavigationBar, IDC_NAVIGATION, 4 /* AfterTrackingLayerDraw */, OnAfterTrackingLayerDrawMap2, VTS_I4)
ON_EVENT(CNavigationBar, IDC_NAVIGATION, -605 /* MouseDown */, OnMouseDownMap2, VTS_I2 VTS_I2 VTS_I4 VTS_I4)
ON_EVENT(CNavigationBar, IDC_NAVIGATION, -607 /* MouseUp */, OnMouseUpMap2, VTS_I2 VTS_I2 VTS_I4 VTS_I4)
ON_EVENT(CNavigationBar, IDC_NAVIGATION, -606 /* MouseMove */, OnMouseMoveMap2, VTS_I2 VTS_I2 VTS_I4 VTS_I4)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CNavigationBar::CNavigationBar()
{
m_pViewMap=NULL;
}
CNavigationBar::~CNavigationBar()
{
}
int CNavigationBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CBCGSizingControlBar::OnCreate(lpCreateStruct) == -1)
return -1;
CRect rectDummy;
rectDummy.SetRectEmpty ();
// Create tabs window:
if (!m_wndTab.Create (CBCGTabWnd::STYLE_3D, rectDummy, this, 1))
{
TRACE0("Failed to create workspace tab window\n");
return -1; // fail to create
}
m_wndTab.SetImageList (IDB_WORKSPACE, 16, RGB (255, 0, 0));
if(!m_map.Create("Navigator",WS_VISIBLE
[解决办法]
WS_CHILD
[解决办法]
WS_BORDER
[解决办法]
WS_THICKFRAME,CRect(0,0,100,100),this,IDC_NAVIGATION))//&m_wndTab
return -1;
m_wndTab.AddTab(&m_map, _T("导航"), 2);
return 0;
}
void CNavigationBar::OnSize(UINT nType, int cx, int cy)
{
CBCGSizingControlBar::OnSize(nType, cx, cy);
//Resize(m_map,cx,cy,1);
// Tab control should cover a whole client area:
m_wndTab.SetWindowPos (NULL, -1, -1, cx, cy,
SWP_NOMOVE
[解决办法]
SWP_NOACTIVATE
[解决办法]
SWP_NOZORDER);
}
void CNavigationBar::OnContextMenu(CWnd* pWnd, CPoint point)
{
}
BOOL CNavigationBar::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN &&
pMsg->wParam == VK_ESCAPE)
{
CMainFrame* pMainFrame = (CMainFrame*) AfxGetMainWnd ();
ASSERT_VALID (pMainFrame);
if (pMainFrame->GetActivePopup () == NULL)
{
pMainFrame->SetFocus ();
return TRUE;
}
}
return CBCGSizingControlBar::PreTranslateMessage(pMsg);
}
void CNavigationBar::OnWindowPosChanged(WINDOWPOS FAR* lpwndpos)
{
CBCGSizingControlBar::OnWindowPosChanged(lpwndpos);
}
void CNavigationBar::RefreshLyrs()
{
CMoLayers lyrs(m_map.GetLayers());
CMoMapLayer lyr;
lyrs.Clear();
CMoLayers viewlyrs(m_pViewMap->GetLayers());
int iCount=viewlyrs.GetCount();
for(int i=0; i<iCount; i++)
{
lyrs.Add(viewlyrs.Item(COleVariant(long(i))));
}
//m_map.Refresh();
}
void CNavigationBar::SetMap(CMap1 *pMap)
{
m_pViewMap=pMap;
}
void CNavigationBar::OnAfterTrackingLayerDrawMap2(long hDC)
{
// TODO: Add your control notification handler code here
if(m_pViewMap==NULL) return;
CMoLayers lyrs(m_map.GetLayers());
if(lyrs.GetCount()==0)
return;
CMoSymbol sym;
sym.CreateDispatch("MapObjects2.Symbol");
if(sym.m_lpDispatch != NULL)
{
sym.SetSymbolType(moFillSymbol);
sym.SetOutlineColor(moRed);
sym.SetStyle(moTransparentFill);
m_map.DrawShape(m_pViewMap->GetExtent(),sym);
}
if(m_rect.m_lpDispatch != NULL)
{
sym.SetOutlineColor(moBlue);
m_map.DrawShape(m_rect,sym);
}
}
void CNavigationBar::OnMouseDownMap2(short Button, short Shift, long X, long Y)
{
if(m_pViewMap==NULL) return;
CMoLayers lyrs(m_map.GetLayers());
if(lyrs.GetCount()==0)
return;
CMoPointpt(m_map.ToMapPoint(X,Y));
if(m_pViewMap->GetExtent().IsPointIn(pt))
{
::SetCapture(m_map.m_hWnd );
if(m_rect.m_lpDispatch != NULL)
m_rect.ReleaseDispatch();
m_rect.CreateDispatch("MapObjects2.Rectangle");
if(m_rect.m_lpDispatch != NULL)
{
m_rect = m_pViewMap->GetExtent();
m_point = m_map.ToMapPoint(X,Y);
}
}
}
void CNavigationBar::OnMouseUpMap2(short Button, short Shift, long X, long Y)
{
// TODO: Add your control notification handler code here
if(m_pViewMap==NULL) return;
CMoLayers lyrs(m_map.GetLayers());
if(lyrs.GetCount()==0)
return;
if(m_rect.m_lpDispatch != NULL)
{
m_pViewMap->SetExtent(m_rect);
::ReleaseCapture();
m_rect.ReleaseDispatch();
RefreshTrackingLayer();
}
}
void CNavigationBar::OnMouseMoveMap2(short Button, short Shift, long X, long Y)
{
// TODO: Add your control notification handler code here
if(m_pViewMap==NULL) return;
CMoLayers lyrs(m_map.GetLayers());
if(lyrs.GetCount()==0)
return;
if(m_rect.m_lpDispatch != NULL)
{
CMoPoint pt(m_map.ToMapPoint(X,Y));
m_rect.Offset(pt.GetX() - m_point.GetX(),pt.GetY()-m_point.GetY());
m_point = pt;
RefreshTrackingLayer();
}
}
void CNavigationBar::Refresh()
{
RefreshTrackingLayer();
//m_map.Refresh();
}
void CNavigationBar::Clear()
{
CMoLayers lyrs(m_map.GetLayers());
int iCount=lyrs.GetCount();
for(int i=iCount-1; i>=0; i--)
lyrs.Remove(i);
m_map.Refresh();
}
void CNavigationBar::RefreshTrackingLayer()
{
VARIANT va;
VariantInit(&va);
va.vt = VT_DISPATCH;
CMoRectangle mrt(m_map.GetExtent());
va.pdispVal = mrt.m_lpDispatch;
CMoTrackingLayer tLayer(m_map.GetTrackingLayer());
tLayer.Refresh(true, va);
}
void CNavigationBar::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if(nChar=='\n')
{
CMoLayers lyrs(m_map.GetLayers());
CMoMapLayer lyr;
int iCount=lyrs.GetCount();
for(int i=0; i<iCount; i++)
{
lyr=lyrs.Item(COleVariant(long(i)));
lyr.SetVisible(TRUE);
}
}
CBCGSizingControlBar::OnKeyDown(nChar, nRepCnt, nFlags);
}
这是鹰眼的实现,参考一下