分类:
2009-11-13 11:18:32
VC++深入详解学习笔记 2
动态添加button 访问对话框上的子窗口: 获取对话框上的项目指针:getdlgitem() 获取窗口信息:getwindowtext() 更改窗口信息:setwindowtext() 直接取得对指定话框上项目的信息:getdlgitemtext() 想当于getdlgitem()和getwindowtext()合用。 当然,有setdlgitemtext() 相当于getdlgitem()和setitemtext() 合用。 getdlgitemint(),setdlgitemint()等等,s/getdlgitemint()可以处理有符号的整数。 字符到数组的转换:atoi() 转换一个类型到指定类型时,用 类型的第一个字母 to 指定类型的一个字母。 在doexchange函数里,放置以ddx_为前缀的函数,来关联一个控件和变量,ddv_为前缀的函数,用来校验一个控件内容。 ddx_(对话框数据交换) ddv_(对话框数据校验) 注意,在用数据变量关联控件的方式时,千万注意要使用updatedata()! 也可以用一个控件变量关联一个控件,用它的成员函数,来对控件进行操作,例如:cedit.getwindowtext() sendmessage()的用法,比较好用,注意,发送消息,是控件向系统发送,由系统处理。 senddlgitemmessage()。 g/setwindowtext()。 2, g/setdlgitemtext()。 3, g/setdlgitemint。 4, 将一个控件和一个整型变量相关联。 5, 将一个控件和一个控件变量相关联,用成员函数getwindowtext()和setwindowtext()去访问控件。 6, sendmessage(),可以用平台sdk,也可以用cwnd成员函数。 7, senddlgitemmessage()。 两个好用的消息:em_getsel,em_setsel:取得与设置选择内容的位置。 改变窗口的大小wnd::setwindowpos()对话框从父类继承来的函数。 看一下用控件变量关联控件时,那些成员,例如button的default。 消息:wm_initdialog,在一个对话框和其上的控件建立完成之后,由对话框发送,当时,对话框还没显示。 sent to a dialog box before the dialog box is displayed。 伸缩对话框: 判断一个矩形是否为空:isrectempty(),isrectnull()。前者是判断矩形面积是否为空,后者是判断矩形的四个坐标值是否为0,不关心是否能 做为一个矩形。 ·····setwindowpos()改变窗口的大小和z次序的排列。 ····· 焦点的问题: setwindowlong~~~~~~~~ 超强的函数。 ::getnextwindow() ::getwindow() ::getnextdlgtabitem() cwnd::getwindow() cwnd::getnextwindow cwnd::getnextdlgtabitem() 缺省ok按钮的id为idok
dialog 2.当选择classwizard菜单时,系统提示是否为创建新的类,我们将其从cpropertypage派生!这样可以为 方便为其增加消息响应函数。 3.**新的从cpropertysheet派生的类,在类中增加3个cpropertypage的实例。 4.在view中增加菜单项,当点击时显示属性表单,出现中文乱码,修改cpropertypage属性为中文,另外将 其字体设为宋体。 5.在cpropertypage中设置setwizardbuttons可将其属性改为上一步、完成! 6.为idc_radio1关联成员变量,需要先设置group属性才行。另外别忘记调用updatedata(). 7.为cpropertypage增加虚函数,on 8.将用户的选择输出到屏幕上,此时可以在view中增加几个成员变量,用来接收用户选择的数据。 4.memset()的用法! memset(m_blike,0,sizeof(m_blike));
1.修改外观和图标可以在mainfrm中进行,而修改背景和光标只能在view中进行。为什么?因为view的显示挡在了mainframe的前面。 a.在mainframe中 precreatewindow()中,在窗口创建之前,用重新注册窗口类的方法,比较麻烦。在precreatewindow resource-三个图标, b.在cmainframe中增加图标句柄数组,m_hicons[3] m_hicons[0]=loadicon(afxgetinstancehandle(),makeintresource (idi_icon1));//makeintresource是一个宏,它将整数转化为win32的资源类型,简单的说它是一个类型转换 #define makeintresourcea(i) (lpstr)((dword)((word)(i))) m_hicons[1]=loadicon(theapp.m_hinstance,makeintresource(idi_icon2));//此处需要用到 setcheck(m_newtoolbar.iswindowvisible()); 5.状态栏编程 a.indicator[]数组中有状态栏的信息 如果要增加,可以在string table中加入一个ids_timer,然后将其加入到[]中。 b.在时间栏显示时间,代码略,比较简单 6.进度栏 a.增加成员变量,cprogressctrl m_progress b.on rect,&m_wndstatusbar,123); m_progress.setpos(50);*/ **
bitblt(rect.left,rect.top,rect.width(), rect.height(),&dccompatible,0,0,srccopy);
1.创建4个菜单,为其添加消息响应,用成员变量保存绘画类型。添加lbuttondown和up消息。 2.当窗口重绘时,如果想再显示原先画的数据,则需要保存数据。为此创建一个新类来记录绘画类型和两个点。 class cgraph { public: cpoint m_ptorigin;//起点 cpoint m_ptend;//终点 uint m_ndrawtype;//绘画类型 cgraph(); cgraph(uint m_ndrawtype,cpoint m_ptorigin,cpoint m_ptend);//此为构造函数。 virtual ~cgraph(); }; 然后在void cgraphicview::on //cgraph graph(m_ndrawtype,m_ptorigin,point);//不能用局部变量 //m_ptrarray.add(&graph);//加入这种指针数组中 /* on dc.dptolp(&m_ptorigin);//将设备坐标转换为逻辑坐标 dc.dptolp(&point);// cgraph *pgraph=new cgraph(m_ndrawtype,m_ptorigin,point);//在堆中创建新的对象 m_ptrarray.add(pgraph);*///加入到指针数组中 在graphicview.h中有如下代码 cptrarray m_ptrarray; 在on for(int i=0;i 3.在cview::on 4.让窗口具有滚动条的功能。 第1.将cgraphicview的头文件中的cview全部替换成csrollview 第2.添加如下的代码 void cgraphicview::on { cscrollview::on 将兼容dc的图拷贝到屏幕dc上去。 此处不再详细介绍这两种方法,因为介绍多了容易搞晕。呵呵 1.常量指针与指针常量的区分 char ch[5]="lisi"; const char *pstr=ch;//const在*之前,表明指针指向的内容为常量,即为常量指针 char * const pstr=ch;//const在*之后,表明指针的地址不能改变,即为指针常量 明白? 2.对文件读写的三种方法 1.c中 file *pfile=fopen("1.txt","w"); fwrite(" "); ar<
2.文档-视类结构简介 on 在winapp的initinstance()中完成doc,view,mainframe的归一。 当点击系统的打开和新建菜单时,有一系列的步骤,孙鑫老师给我们跟踪了代码的调用过程,此段跟踪我们略过。但我们要牢记住:cwinapp负责管理文档管理器,文档管理器有一个指针链表,且来保存文档模板的指针,文档模板指针管理三个类doc,view,mainframe,使其为某文件对象服务。 3.利用carchive来保存一个类的对象,此类必须支持串行化,需要5个步骤。 a.让类从cobject派生; b.覆盖serialize()函数,在其中完成保存和读取功能; c.在.h中加入 declare_serial(cgraph); d.在。cpp中加入implement_serial(cgraph, cobject, 1 ); e.定义一个不带参数的构造函数。 保存绘画数据到文件的简单过程 a.在cgraph中增加一个画图的成员函数,其实不增加也行。可以在view中完成相应功能。 b.增加四个画图菜单,菜单可以从11课的代码中拷贝。 c.在view中增加lbuttondown和up的响应,在up中画图,在down中保存点 d.利用cobarray集合类来保存绘画数据 e.在cgraphicdoc::serialize()中保存和读取数据 f.然后在on 4.新建和打开文档时,要注意销毁原来的数据。在doc的deletecontents虚函数中是好时机。代码如下 int ncount; ncount=m_obarray.getsize(); /*for(int i=0;i { delete m_obarray.getat(i);//释放指针指向的内存空间 //m_obarray.removeat(i);//移除链表中的元素。嘿嘿,别搞错了。但在此处不能这样用,会导致非法操作。要用下面的方法沙 } m_obarray.removeall();*/ while(ncount--) { delete m_obarray.getat(ncount); m_obarray.removeat(ncount); |