Windows程序设计总结

2017-01-07 08:39:04来源:CSDN作者:believe__dream人点击

     经过一个学期的学习,通过windows这门课学到了很多新的知识,同时也学到了一些新的思想。首先说一下学习这门课的状态:课上听的少,课下费时多。上课除了前几周有听了一些,后边基本是玩了过来的,这种态度很不对,先不说学习的知识是前边的简单后边的难,只说这样会浪费多少的时间,因为课上如果听了老师讲的,遇到问题在很短的时间内就可以解决了,因为课上没有听老师讲,课下写作业的时候遇到了一个简单的问题都可以卡一整天,浪费了太多的时间,使得作业都要赶到deadline。不管如何,还是发一下希望——希望下学期可以专心听所有的课,多学一点知识,毕竟就要出来实习了。     接下来就说一下我在这门课里边学习到的内容。
  • 首先说一下在几次试验中应用到的技术。基本的绘图、双缓冲绘图(CDC),应用基本的控件ListCtrl、TreeCtrl、ComboBox,视图与Document之间的数据交换,还有多文档中停靠(CDockablePane)的使用,以及在窗体之间传递消息——自定义消息机制或变量标志。
  1. 双缓冲的应用。使用双缓冲主要是为了解决图形绘制过程中出现的画面闪烁的状况。双缓冲就是应用一个新的缓冲区(CDC)把绘制的数据存储下来,等到所有的数据都在这个缓冲区中绘制完之后,再绘制到视图区。
这里是创建一个新的CDC——bc_memDC (定义的public变量),这个CDC用来绘制缓存图形void CGraphic::GetMemCDC(CDC* pDC){      int scWidth, scHeight;      scWidth = GetScWidth(pDC);      scHeight = GetScHeight(pDC);      //承载内存中临时的位图      CBitmap bitmap;      //依附窗口DC创建兼容内存DC      bc_memDC.CreateCompatibleDC(pDC);      //创建兼容位图(必须用pDC创建,否则画出的图形变成黑色)      bitmap.CreateCompatibleBitmap(pDC, scWidth, scHeight);      //将位图选择进内存DC      bc_memDC.SelectObject(&bitmap);      //按原来背景填充客户区,不然会是黑色      bc_memDC.FillSolidRect(bc_rect.left, bc_rect.left, scWidth, scHeight, pDC->GetBkColor());      bitmap.DeleteObject(); //删除位图}这里是通过缓存CDC来绘制图形,最后通过视图的CDC指针把图形绘制到屏幕上void CColumnchart::Draw(CDC* pDC){     //....省略绘图相关事宜      pDC->BitBlt(0, 0, scWidth, scHeight, &bc_memDC, 0, 0, SRCCOPY);//将内存DC上的图象拷贝到前台}2.ListCtrl、TreeCtrl、ComboBox的应用。这几个都是属于控件,大体上使用方法比较相同,都是通过变量对控件进行绑定,然后对控件添加响应事件,以及获取控件中的值。以下直说一下CEdit控件取值的方法,例如CListCtrl和CTreeCtrl的操作在网上有说的非常详细的。绑定控件的方法以及值获取方法//--->变量获取//First——在DoExchange中绑定变量DDX_Control(pDX, ID, variableedit);//Second直接获取控件CEdit* edit;edit = (CEdit*)GetDlgItem(ID)//--->值获取//通过绑定的变量获取CString value;edit->GetWindowText(value);//直接获取GetDlgItem(ID, value);3.视图和Document之间进行数据交换。首先要确定一个文档只可以和一个视图进行绑定,其次,多文档视图中所有的视图都是用的同一个文档中的数据。4.停靠的使用,以及自定义消息的传递。                                                              
图1:停靠在本次实验中我应用了一个CFormView的停靠,其中CFormPane需要继承自CDockablePane,同时要重写两个函数//在这个类的构造函数中写CFormPane::CFormPane(){      //创建AddDataForm      m_addDataForm = (CAddDataForm*)(RUNTIME_CLASS(CAddDataForm)->CreateObject());}
void CFormPane::OnSize(UINT nType, int cx, int cy){      CDockablePane::OnSize(nType, cx, cy);      // TODO:  在此处添加消息处理程序代码      if (GetSafeHwnd() == NULL)      {            return;      }      if (m_addDataForm->GetSafeHwnd() != NULL)      {            CRect rect;            GetClientRect(rect);            m_addDataForm->SetWindowPos(NULL, rect.left, rect.top, rect.Width(), rect.Height(), SWP_NOACTIVATE | SWP_NOZORDER);      }}
int CFormPane::OnCreate(LPCREATESTRUCT lpCreateStruct){      if (CDockablePane::OnCreate(lpCreateStruct) == -1)            return -1;      // TODO:  在此添加您专用的创建代码      RECT rect;      GetClientRect(&rect);      m_addDataForm->Create(NULL, NULL, WS_CHILD | WS_VISIBLE, rect, this, 0, NULL);      return 0;}在CFormPane这个派生类里边写完之后还要在CMainFrame中加入代码,因为停靠时窗体上边的东西,肯定要在窗体的勒种进行添加//这段代码要加在CMainFrame的OnCreate函数中,加在最后就可以了//m_formPane是CFomrPane的变量//把CFormPane加入到主框架中m_formPane.Create(_T("AddData"), this, CRect(0, 0, 300, 300), TRUE, IDD_ADDDATAFORM,             WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI);m_formPane.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockPane(&m_formPane);
图2:自定义消息响应自定义消息响应首先要在发送消息的类里边通过宏定义定义一个响应事件,然后在接收消息的类里边添加ON_MESSAGE响应,最后在发消息的类中通过::SendMessage(m_graphic->hwnd_dataForm, WM_SendChangeItem, (WPARAM)this->GetSafeHwnd(), (LPARAM)&str);发送消息就可以了,其中第一个参数是接收窗口的窗口指针,第二个是宏定义的响应ID,第三个是发送消息窗口的窗口指针,第四个是发送的消息。       到这里这学期通过学习,并且主要应用到的技术差不多说完了,其实还有很多是没有掌握好的,多线程、odbc数据库等等,有机会还要再学习一下。
  • 最后就是说一下思想或者说想法上边的改变了。
          对封装想的更多。我这次做的是一个画图软件,对图像数据做了一件蠢事——我把图像数据拿出了一个备份放在了其他的类里边,这种做法明明是没有理解好封装,把图像的属性方法都封装到图像类里边,在其他的地方调用就可以了。这种做法可以减少数据的混乱,更容易维护。          其次,在开始一个项目之情一定要归还好整体的架构,设计好主题框架,及时后期需要修改也是小部分的修改,不可以随便开始,随便修改,这样花费的时间多,而且效率低。github代码:https://github.com/neverLhope/MFCWindows



最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台