pDC

  Invalidate();//更新视图**************************

 pDC->TextOut(15,50, "单击鼠标左键输入数据!");

LineTo

MoveTo

  pDC->SelectObject(pbrushOldBrush);  //恢复旧画刷

   pDC->Ellipse(rectSymbol);

  CBrush brushNewBrush(RGB(0, 0, 0));
  CBrush *pbrushOldBrush = pDC->SelectObject(&brushNewBrush);//用新画刷同时返回旧画刷

IsModified()

SetTitle(strTitle + strDirtyFlag);

 UpdateFrameCounts();

 UpdateAllViews(NULL);

 

OnPrepareDC

如果该函数被用于屏幕显示调用,那么默认情况下是没有任何功能可以实现显示功能的,然而,这种功能是在衍生类,如CscrollView,可以调整设备上下文的属性覆盖,因此,应该在重写基类前对该函数进行实现。 如果函数被调用进行打印,默认执行检查页面的信息存储在pInfo参数。如果文件的长度并没有被指定,如果后一页面已被打印出来,OnPrepareDC承担的文件成为一页长循环并停止打印。该函数将停止通过设置成员的结构m_bContinuePrinting打印循环

 CClientDC dc(this);
 OnPrepareDC(&dc);
 dc.DPtoLP(&point);         //屏幕坐标转换为逻辑坐标

 

在VC滚动视图SCrollView中进行画图,或者移动线条的时候,会出现无法选中的问题
这是因为当滚动条滚动之后,使用鼠标点击线条时,出现的是设备坐标,比如出现的是(10,10)(设备坐标)
然而由于滚动条滚动了,真实的坐标应该是(310,510)(逻辑坐标),这样当然就无法用原来的坐标进行判断了。
解决办法就是将设备坐标转为逻辑坐标就可以了。
即添加下面三句话就OK!
CClientDC dc(this);
OnPrepareDC(&dc);
dc.DPtoLP(&point);
 
 
     设备坐标(Device   Coordinate)又称为物理坐标(Physical   Coordinate),是指输出设备上的坐标。通常将屏幕上的设备坐标称为屏幕坐标。设备坐标用对象距离窗口左上角的水平距离和垂直距离来指定对象的位置,是以像素为单位来表示的,设备坐标的X轴向右为正,Y轴向下为正,坐标原点位于窗口的左上角。
   
    逻辑坐标(Logical   Coordinate)是系统用作记录的坐标。在缺省的模式(MM_TEXT)下,逻辑坐标的方向和单位与设备坐标的方向和单位相同,也是以像素为单位来表示的,X轴向右为正,Y轴向下为正,坐标原点位于窗口的左上角。
 
  brush.CreateSolidBrush(RGB(128,0,0));//红色画刷
  oldbrush=pDC->SelectObject(&brush);//载入画刷
  pDC->Rectangle(100,100,400,400);
  pDC->SelectObject(oldbrush);//恢复画刷
  brush.DeleteObject();
 
 CSize size;
 size=sizetemp;
 SetScrollSizes(MM_TEXT, size);//设置滚动窗口区域
 CScrollView::OnUpdate(pSender,lHint, pHint); 
 

void CFormViewDemoView::OnInitialUpdate()

{  CFormView::OnInitialUpdate();  

GetParentFrame()->RecalcLayout();

 ResizeParentToFit();

}

ResizeParentToFit是C语言的一种函数,作用是令视图大小控制其框架窗口的大小。
GetParentFrame()返回指向父框架窗口的指针。
IsFrameWnd()是虚函数,当对象是框架窗口时返回TRUE,否则返回FALSE.
可能是你的窗口不是框架窗口才出错。
GetParentFrame()一般用在View中,返回包围View的框架窗口的指针。
例如:
void CEx5View::OnRButtonDown(UINT nFlags, CPoint point)
{
// CView::OnRButtonDown(nFlags, point);
CWnd *pWnd = GetParentFrame() ;
ASSERT(pWnd!=NULL) ;
pWnd->SetWindowText("Main!!!!!") ;
}

  CDC*pDC=GetDC();
 TEXTMETRIC tm;
 pDC->GetTextMetrics(&tm);
GetTextMetrics,该函数把程序当前的字体信息,存放到 TEXTMETRIC(即MSDN原文中的specified buffer)中。
 
 //设置列表控件为“报表”风格,第一列按字母顺序,并让控件总是显示选定内容
 GetListCtrl().ModifyStyle(0,LVS_REPORT|LVS_SHOWSELALWAYS|LVS_SORTASCENDING);
 //在列表上画线,分隔列表的行和列;第二种风格允许用户选中整行。
 GetListCtrl().SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE,0,LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);
 
 CBrush Brush (m_rgbBack); // 创建一个新的刷子
 CBrush* pOldBrush = pDC->SelectObject (&Brush); // 把刷子选入设备环境
 //获得需要檫除背景的区域
 CRect reClip;
 GetClientRect(&reClip);
 //重绘该区域
 pDC->PatBlt(reClip.left , reClip.top , reClip.Width () , reClip.Height() , PATCOPY);
 //释放刷子
 pDC->SelectObject (pOldBrush);
 
 

 CMultiDocTemplate* pDocTemplate;

 pDocTemplate = new CMultiDocTemplate(   

IDR_FACECOTYPE,   

RUNTIME_CLASS(CFaceControl2Doc),   

RUNTIME_CLASS(CChildFrame), // custom MDI child frame   

RUNTIME_CLASS(CFaceControl2View));  

AddDocTemplate(pDocTemplate);

 // create main MDI Frame window  

CMainFrame* pMainFrame = new CMainFrame;  

if (!pMainFrame->LoadFrame(IDR_MAINFRAME))  

 return FALSE;  

m_pMainWnd = pMainFrame;

 

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) {  // TODO: Add your specialized code here and/or call the base class  if(CMDIFrameWnd::OnCreateClient(lpcs, pContext))  {   m_wndMDIClient.SubclassWindow(m_hWndMDIClient);//字类化窗口   return true;  }  else  return false; }

BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) {  // TODO: Add your specialized code here and/or call the base class  if (m_wndMDIClient.OnCmdMsg(nID,nCode,pExtra,pHandlerInfo))//重定向消息   return TRUE;

 return CMDIFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo); }

 

 HICON hIcon=AfxGetApp() ->LoadIcon(IDI_ICON1);//加载图标资源
 ASSERT(hIcon);
 AfxGetMainWnd()->SendMessage(WM_SETICON ,TRUE,(LPARAM)hIcon);//向主框架发送消息更改图标 

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
 if( !CMDIFrameWnd::PreCreateWindow(cs) )
  return FALSE;
 // TODO: Modify the Window class or styles here by modifying
 //  the CREATESTRUCT cs
 cs.style &= ~WS_MAXIMIZEBOX;//去除最大化按钮
   // 设置主框架窗口的大小和位置
   cs.cy = ::GetSystemMetrics(SM_CYSCREEN) / 3;
   cs.cx = ::GetSystemMetrics(SM_CXSCREEN) / 3;
   cs.y = ((cs.cy * 3) - cs.cy) / 2;
   cs.x = ((cs.cx * 3) - cs.cx) / 2;
 return TRUE;
}

 

 cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;//不创建一个新文档

 

 CMenu* pTopMenu = GetSystemMenu(FALSE); //获取系统菜单
 pTopMenu -> RemoveMenu(4,MF_BYPOSITION); //去除最大、最小化功能
 pTopMenu -> RemoveMenu(2,MF_BYPOSITION); //去除改变尺寸功能
 pTopMenu -> RemoveMenu(1,MF_BYPOSITION); //去除移动功能

 

void CMainFrame::OnFullscreen() {  // TODO: Add your command handler code here  GetWindowPlacement(&m_OldWndPlacement);//获取窗口位置  CRect WindowRect;  GetWindowRect(&WindowRect);//获取窗口大小  CRect ClientRect;  RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery, &ClientRect);//获取控制条窗口的大小  ClientToScreen(&ClientRect);//转换为屏幕坐标  //获取屏幕的分辨率  int nFullWidth=GetSystemMetrics(SM_CXSCREEN);  int nFullHeight=GetSystemMetrics(SM_CYSCREEN);  //将除控制条外的客户区全屏显示到从(0,0)到(nFullWidth, nFullHeight)区域, 将(0,0)和(nFullWidth, nFullHeight)两个点外扩充原窗口和除控制条之外的客户区位置间的差值, 就得到全屏显示的窗口位置  m_FullScreenRect.left=WindowRect.left-ClientRect.left;  m_FullScreenRect.top=WindowRect.top-ClientRect.top;  m_FullScreenRect.right=WindowRect.right-ClientRect.right+nFullWidth;  m_FullScreenRect.bottom=WindowRect.bottom-ClientRect.bottom+nFullHeight;  m_bFullScreen=TRUE; //设置全屏显示标志为 TRUE  //进入全屏显示状态  WINDOWPLACEMENT wndpl;  wndpl.length=sizeof(WINDOWPLACEMENT);  wndpl.flags=0;  wndpl.showCmd=SW_SHOWNORMAL;  wndpl.rcNormalPosition=m_FullScreenRect;  SetWindowPlacement(&wndpl); }

void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) {  // TODO: Add your message handler code here and/or call default  if(m_bFullScreen)  {   //全屏显示的大小   lpMMI->ptMaxSize.x=m_FullScreenRect.Width();   lpMMI->ptMaxSize.y=m_FullScreenRect.Height();   //全屏显示的位置   lpMMI->ptMaxPosition.x=m_FullScreenRect.Width();   lpMMI->ptMaxPosition.y=m_FullScreenRect.Height();   //最大的Track尺寸也要改变   lpMMI->ptMaxTrackSize.x=m_FullScreenRect.Width();   lpMMI->ptMaxTrackSize.y=m_FullScreenRect.Height();  }  CFrameWnd::OnGetMinMaxInfo(lpMMI); }

void CMainFrame::EndFullScreen() {  if(m_bFullScreen)  {   //退出全屏显示, 恢复原窗口显示   ShowWindow(SW_HIDE);   SetWindowPlacement(&m_OldWndPlacement);  } }

 

 CenterWindow();
 AnimateWindow(GetSafeHwnd(),800,AW_CENTER);//动画方式打开窗口

 

 CBitmap bmp;
 bmp.LoadBitmap(IDB_BITMAP1); ///加载位图
    m_brushBackground.CreatePatternBrush(&bmp); ///创建位图画刷

 

 CRect rect;
 GetClientRect(&rect);//取得客户区域
 pDC->FillRect(&rect,&m_brushBackground);//设置背景色

 

 pDC->SetBkMode(TRANSPARENT);//设置背景颜色模式为透明色

 

转载于:https://www.cnblogs.com/dignitys/p/5861690.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值