Chinaunix首页 | 论坛 | 博客
  • 博客访问: 69342
  • 博文数量: 29
  • 博客积分: 1500
  • 博客等级: 上尉
  • 技术积分: 270
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-12 14:09
文章分类

全部博文(29)

文章存档

2017年(1)

2012年(1)

2011年(5)

2010年(2)

2009年(20)

我的朋友
最近访客

分类:

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增加虚函数,onwizardnext,如果用户点击下一步时,不想让他进入下一步,刚返回-1         !

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.oncreate中 m_progress.create(ws_child | ws_visible,// | pbs_vertical,

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::onlbuttonup(uint nflags, cpoint point)中加入如下代码

//cgraph graph(m_ndrawtype,m_ptorigin,point);//不能用局部变量

//m_ptrarray.add(&graph);//加入这种指针数组中

/* onpreparedc(&dc);//这个函数中可以重新设置窗口原点,对于滚动条中,保存数据前要调用此函数

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;

   在ondraw中重画时调出数据

for(int i=0;i

3.在cview::onpaint()调用了ondraw(),但在void cgraphicview::onpaint()中mfc的wizard没有调用ondraw(),要注意这个区别。如果你此时想调用,必须手动添加代码。 ondraw(&dc);

4.让窗口具有滚动条的功能。

   第1.将cgraphicview的头文件中的cview全部替换成csrollview

   第2.添加如下的代码

void cgraphicview::oninitialupdate()

{

cscrollview::oninitialupdate();         bitblt(0,0,rect.width(),rect.height(),&m_dccompatible,0,0,srccopy);

将兼容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.文档-视类结构简介

   onnewdocument在程序启动时被调用,此时可设置文档标题,也可以在string table的idr_mainframe的第二个"\"后改变文档的标题。须了解的7个字符串的用途,见ppt。

   在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.然后在ondraw中重绘。

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);

阅读(1189) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~