VC学习笔记:对话框

SkySeraph NOV.11st 2009 HQU

Email-zgzhaobo@gmail.com  QQ-452728574

Latest Modified Date:Oct.31th 2010 HQU 重新翻阅整理

//说明:孙鑫视频学习笔记 SkySeraph NOV.11st 2009 HQU

/*【对话框专题知识】*/

//知识点:创建对话框;显示对话框;

//新建Single Document程序

void CMyBoleView::OnDialog() //对话框的响应函数

{

//首先创建一个新的对话框资源,并增加一个相关的类[CTestDlg]用来操作该资源。再增加一个菜单项(view类)用来显示该对话框。【每增加一个新对话框都需增加一个相关类来做相关处理】

//▲注意:要在view类头文件里包含testdlg.h,才能在菜单项的消息响应函数使用该类。

/*■1.<<创建、显示、关闭模态对话框>>*/

CTestDlg dlg; //此处是局部变量,但不要紧,因为程序会暂时停下来等模态对话框关闭后再运行;

dlg.DoModal();//创建并显示模态对话框

/*■2.<<创建、显示、销毁非模态对话框>>*/

//>>错误写法:CTestDlg dlg;

//▲不能定义成局部变量。局部变量两种处理方法:[1]定义成view类的成员变量;[2]定义成指针,在堆栈上分配内存,因为堆栈上的内存和程序的整个生命期是一致的(前提是程序不能主动销毁)

CTestDlg *pDlg=new CTestDlg;

//▲>>指针变量是一个局部变量,生命周期结束后其保存的内存地址就丢失了,程序无法再引用了,解决方法:

//[1]定义为视类的成员变量,再在其析构函数里用delete函数释放内存;

//[2]在CTestDlg类中重载PostNcDestroy虚函数,释放this指针指向的内存。

pDlg->Create(IDD_DIALOG1,this); //第一个参数可以是对话框资源ID或对话框模板名称;第二个参数指定父窗口,为NULL时即为主应用程序窗口

pDlg->ShowWindow(SW_SHOW);

//▲>>非模态与模态的区别:[1]显示 [2]局部变量的使用 [3]按下ok键后,模态的会调用OnOK虚函数,其又会调用EndDialog函数,从而终止模态对话框而非模态的并不销毁对话框,仅使其不可见,故要重写基类的OnOK虚函数(或OnCancel虚函数),在重写函数中调用DestroyWindow函数

pDlg->DestroyWindow();//销毁非模态对话框

delete pDlg;//释放指针

/*■3.1<<动态创建模态对话框>>*/

CTestDlg dlg;//局部变量不要紧,因为程序会暂时停下来等模态对话框关闭后再运行

dlg.DoModal();//创建并显示模态对话框

}

/*■3.<<动态创建模态对话框>>*/

//功能:单击对话框中某个按钮时(在对方框),就在对话框中动态创建一个新按钮

void CTestDlg::OnBtnAdd() //按钮Add的响应函数

{

//>>先创建模态对话框(view类Ondialog中,见上3.1),再在对话框IDD_DIALOG1添加一按钮Add并对其添加消息处理函数(CTestDlg类,也即此函数)

//>>再在CTestDlg类中添加CButton型的私有成员变量m_bt。为m_bt对象是否已经与窗口关联,避免重复关联而出错,有如下三种实现方法:

//▲法一:BOOL型私有成员变量m_bIsCreated(在其构造函数中初始化为FALSE),用来标识是否已经创建过按钮窗口了

if(m_bIsCreated==FALSE) //确保m_bt没有与某窗口绑定了

{

m_bt.Create("New",BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE,CRect(0,0,100,200),this,123); //CButton类的Create用来创建按钮。若无WS_VISIBLE,则要加ShowWindow

m_bIsCreated=TRUE;

}

else

{

m_bt.DestroyWindow();

m_bIsCreated=FALSE;

}

//▲法二:若不用成员变量m_bISCreated,也可以用下方法

static BOOL bIsCreated=FALSE;//注意:必须是static,否则每次调用OnBtAdd函数时都会被重新定义,实现不了所需功能;而对于static,第一次加载时,就会为其分配内存空间并初始化为FALSE,以后再进入OnBtnAdd时,就不会再为这个静态分配内存空间并初始化了!

//关于static更详细说明 可参考http://www.cnblogs.com/skyseraph/archive/2010/10/11/1848115.html

if(bIsCreated==FALSE) //确保m_bt没有与某窗口绑定了

{

m_bt.Create("New",BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE,CRect(0,0,100,200),this,123);//若无WS_VISIBLE,则要加ShowWindow

bIsCreated=TRUE;

}

else

{

m_bt.DestroyWindow();

bIsCreated=FALSE;

}*/

//▲法三:由于CWnd类有一个成员变量m_hWnd用来保存与窗口对象相关联的窗口句柄,如果窗口句柄没有任一窗口相关联,则句柄为NULL

if(!m_bt.m_hWnd)

{

m_bt.Create("New",BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE,CRect(0,0,100,200),this,123);

}

else

{

m_bt.DestroyWindow();

}

}

  • /*■4.<<静态文本控件的访问>>*/

//功能:单击一个静态文本(Number1:)时,把文本变成“数值1:”

void CTestDlg::OnNumber1() //静态文本Number1的响应函数

{

//先添加一个对话框及类,并添加菜单来显示(同前)

//再添加静态文本Number1:,改变其ID(由于静态文本一般只其标签的作用,其ID默认都相同,特殊情况下需要操作它时需改变它)

//注意:静态文本控件默认是不发送通告消息的。需要勾上Notify选项

CString str;

if(GetDlgItem(IDC_NUMBER1)->GetWindowText(str), str == "Number1:") //if语句的一种使用方法

//控件实际上也是窗口,要获取静态文本控件上显示的文本,可以利用CWnd类GetWindowText来实现,之前需由GetDlgItem来获取静态文本框件对象

//HWND GetDlgItem( HWND hDlg,int nIDDlgItem);   //virtual CWnd* GetDlgItem(int nID) const;

{

GetDlgItem(IDC_NUMBER1)->SetWindowText("数值1:");

}

else

{

GetDlgItem(IDC_NUMBER1)->SetWindowText("Number1:");

}

}

  • /*■5.<<编辑框控件>>*/

//功能:在前两个编辑框中分别输入数字,然后单击Add按钮,把其和显示在第三个编辑框

void CTestDlg::OnBtnAdd()

{

//▲法一:GetDlgItem->GetWindowText

int num1, num2, num3;

char ch1[10], ch2[10], ch3[10];

GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10);

GetDlgItem(IDC_EDIT2)->GetWindowText(ch2,10);

num1 = atoi(ch1);//atoi将数字组成的字符串转换成数值

//int atoi(const char *str);  Convert a string to integer

num2 = atoi(ch2);

num3 = num1 + num2;

itoa(num3,ch3,10);//以十进制的形式把数值转换成文本

//char *_itoa(int value,char *str,int radix);

GetDlgItem(IDC_EDIT3)->SetWindowText(ch3);

//法二:GetDlgItemText

int num1, num2, num3;

char ch1[10], ch2[10], ch3[10];

GetDlgItemText(IDC_EDIT1,ch1,10);//GetDlgItem和GetWindowText的组合

GetDlgItemText(IDC_EDIT2,ch2,10);

//virtual int GetDlgItemText(int nID,LPTSTR lpStr,int nMaxCount) const;

num1 = atoi(ch1);

num2 = atoi(ch2);

num3 = num1 + num2;

itoa(num3,ch3,10);

SetDlgItemText(IDC_EDIT3,ch3);

//法三:GetDlgItemInt

int num1, num2, num3;

num1 = GetDlgItemInt(IDC_EDIT1);//返回指定控件的文本,并将其转换为一个整型数值。可以实现负值的操作

// virtual UINT GetDlgItemInt(int nID,BOOL* lpTrans=NULL,BOOL bSigned=TRUE) const;

num2 = GetDlgItemInt(IDC_EDIT2);

num3 = num1 + num2;

SetDlgItemInt(IDC_EDIT3,num3);

//▲法四:将控件与整型变量关联

//将三个编辑框分别与对话框类的三个成员变量相关联,然后再通过这些成员变量来检索和设置编辑框的文本

//说明:关联变量成员时,变量类别为value,类型为int[视实际需求而定],可以浏览头文件和源文件查看发生了哪些变化?

//[共三处:头文件中注视宏中添加定义,源文件的构造函数中初始化、DoDataExchange中实现对话框控件与类成员变量的关联,如DDX_Text(pDX,IDC_EDIT1,m_num1) ...] //DDX_为前缀的函数用于不同控件的数据交换

//注意:在程序中从来都不直接调用DoDateExchange函数,而是通过CWnd的另外一个成员函数UpdataData()来调用

UpdateData();//获取数据

//BOOL UpdateData(BOOL bSaveAndValidate = TRUE); 参数为TRUE说明该函数正在获取对话框的数据,为FALSE说明该函数正在初始化对话框控件

//对于模态对话框,它创建时,自动以参数FALSE来调用UpdateData函数来初始化控件

m_num3 = m_num1 + m_num2;

UpdateData(FALSE);//初始化对话框

//还可以通过ClassWizard中的成员变量选项卡中,选择IDC_EDIT1控件,在对话框底部编辑框中的min..何max..分别输入0、100即可设定编辑框输入范围

//此时在DoDataExchange中增加了DDV_MinMaxInt(pDXp,n_num1,0,100);

//DDX:Dialog Data Exchange对话框数据交换      DDV:Dialog Data Validation对话框数据校验

//▲法五:将控件与控件变量关联

//编辑框与控件变量关联,这些控件变量就是控件本身 ,即变量类别选control,类型为CEdit/派生于CWnd

int num1, num2, num3;

char ch1[10], ch2[10], ch3[10];

m_edit1.GetWindowText(ch1,10);

m_edit2.GetWindowText(ch2,10);

num1 = atoi(ch1);

num2 = atoi(ch2);

num3 = num1 + num2;

itoa(num3,ch3,10);

m_edit3.SetWindowText(ch3);

//法六:SendMessage

//机理:windows程序都是基于消息的,故要获取或设置窗口的文本,只要知道获取或设置窗口文本的消息,就可以通过sendmessage来发送,从而获取或设置窗口的文本。windows中,获取窗口文本的消息是WM_GETTEXT,发送该消息后,系统把指定的窗口文本复制到调用者提供的一个缓存中。这个消息的两个参数中,wParam指定将复制的字节数,lParam就是调用者提供的用来保存窗口文本的缓存地址。而设置窗口文本消息是WM_SETTEXT,此消息wParam消息没有被使用,lParam消息用来指定设置窗口文本的字符串地址。

int num1, num2, num3;

char ch1[10], ch2[10], ch3[10];

::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd, WM_GETTEXT, 10,(LPARAM)ch1);

//Platform SDK和CWnd类都提供SendMessage函数,加上::调用Platform SDK的函数

::SendMessage(m_edit2.m_hWnd, WM_GETTEXT, 10,(LPARAM)ch2);

num1 = atoi(ch1);

num2 = atoi(ch2);

num3 = num1 + num2;

itoa(num3,ch3,10);

m_edit3.SendMessage(WM_SETTEXT, 0, (LPARAM)ch3);

//法七:SendDlgItemMessage 直接给对话框的子控件发送消息

int num1, num2, num3;

char ch1[10], ch2[10], ch3[10];

SendDlgItemMessage(IDC_EDIT1, WM_GETTEXT, 10,(LPARAM)ch1);//相当于组合了GetDlgItem和SendMessage,无需先获得子控件对象再发送消息,因为其本身就是对对话框中给它的子控件发送消息用的

SendDlgItemMessage(IDC_EDIT2, WM_GETTEXT, 10,(LPARAM)ch2);

//LRESULT SendDlgItemMessage(HWND hDlg, int nIDDlgItem, UINT Msg,WPARAM wParam,LPARAM lParam);

num1 = atoi(ch1);

num2 = atoi(ch2);

num3 = num1 + num2;

itoa(num3,ch3,10);

SendDlgItemMessage(IDC_EDIT3, WM_SETTEXT, 0, (LPARAM)ch3);

SendDlgItemMessage(IDC_EDIT3, EM_SETSEL,1,3); //设置/获得[EM_GETSEL]编辑框复选的内容,wParam表示开始位置,lParam表示结束位置

//特殊情况:当wParam为0。lParam为-1时,那么编辑框中所有内容都将被复选,此特例是非常有用的

//EM_开头的消息是指编辑框控件消息(Edit Control Message)

m_edit3.SetFocus();//为实现复选,需将当前焦点[单击后,在按钮上]转移到编辑框上

}

  • /*■6.<<对话框伸缩功能的实现>>*/

为对话框添加一个按钮,属性设为“收缩<<”,并为其添加消息响应函数

void CTestDlg::OnButton1()

{

// TODO: Add your control notification handler code here

//①按钮文本变换功能

CString str;

if(GetDlgItemText(IDC_BUTTON1, str), str == "收缩<<")

{

SetDlgItemText(IDC_BUTTON1,"扩展>>");

}

else

{

SetDlgItemText(IDC_BUTTON1,"收缩<<");

}

//②切割的实现:先放置分隔条,用图片控件实现,ID为IDC_SEPERATOR,选用Sunken风格(下陷状态),去掉visibale,不可见

static CRect rectLarge;//第一次获得该变量后,以后不需要再次改变,故设为static

static CRect rectSmall;

//判断矩形为空:CRect有两个成员函数,IsRectNull和IsRectEmpty,两者不同,参考MSDN

if(rectLarge.IsRectNull())

{

CRect rectSeparator;

GetWindowRect(&rectLarge);//获取原始尺寸

GetDlgItem(IDC_SEPARATOR)->GetWindowRect(&rectSeparator);

rectSmall.left=rectLarge.left;

rectSmall.top=rectLarge.top;

rectSmall.right=rectLarge.right;

rectSmall.bottom=rectSeparator.bottom;

}

if(str=="收缩<<")

{

SetWindowPos(NULL,0,0,rectSmall.Width(),rectSmall.Height(),

SWP_NOMOVE | SWP_NOZORDER);

//virtual BOOL SetWindowPos(const CWnd* pWndInsertAfter,int x,int y,int cx,int cy,UINT nFlags);

//Sets the size, position, and Z order of the control site.

//窗口Z次序:表明重叠堆中窗口的位置

}

else

{

SetWindowPos(NULL,0,0,rectLarge.Width(),rectLarge.Height(),

SWP_NOMOVE | SWP_NOZORDER);

}

}

总结:①实现按钮变化功能  ②实现窗口分割

VC学习笔记:对话框的更多相关文章

  1. 孙鑫VC学习笔记:多线程编程

    孙鑫VC学习笔记:多线程编程 SkySeraph Dec 11st 2010  HQU Email:zgzhaobo@gmail.com    QQ:452728574 Latest Modified ...

  2. VC++ 学习笔记(序):神一样的语言

    总的来说,我觉得VC++是一门神一样的语言——它是公认最强大.最复杂的:它一切以效率为第一要务,却又不肯落伍,拼命兼容现在的新的语言设计特点.本来在别的语言很容与就避开的问题,在这里要用很高的技巧去设 ...

  3. 【VC++学习笔记一】MFC操作Excel

    最近在做一个读取Excel的功能,之前也做过相关的,但总是零零闪闪的,趁着正在劲头上,归纳一下: 利用Automation添加相关的类,在Excel2010中可以在安装文件夹下直接点击Excel.ex ...

  4. VC++ 学习笔记(三):摩登之路——C++/CLI简介

    在Windows上,除非我们必须得用C++来写界面,否则我会选择避免,避免学习和使用MFC.替代的方案是用C#来做界面,然后用C++/CLI来连接C#和Native C++.那么问题来了,C++/CL ...

  5. VC++ 学习笔记(二):VC++与C、VB和C#

    罗马不是一天建成的,VC++的也不是凭空产生的——它一直标榜自己的从C发展而来的.VB好像是专门为了羞辱VC++而创建的.C#呢,是微软类C语言的新秀——其实也不新了.乱吧?貌似挺乱的,其实这里有章可 ...

  6. VC++ 学习笔记(一):如何开始

    毫无疑问,学习C++是一件痛苦的事情. 我大概十年前接触C++.那是在学校里,准备考研究生,某学校要求考C++.我就开始一点一点学习,学习的过程还是比较舒服的.不得不说,就古典C++的理论,钱老讲的还 ...

  7. android学习笔记 对话框合集

    package com.zhangbz.dialog; import android.app.Activity; import android.app.AlertDialog; import andr ...

  8. VC学习笔记:状态栏

    原文链接: http://www.cnblogs.com/skyseraph/archive/2010/11/27/1889952.html 实例学习 1  新建对话框程序 2  为Dlg类添加成员变 ...

  9. VC++ 学习笔记3 获取编辑框字符串

    边界框添加字符串比较简单 可以直接在对话框的空间上面点击右键添加变量,变量类型为CString  在此取名为m_NUM 直接使用m_NUM就是编辑框的CString, 举例: 在messagebox显 ...

随机推荐

  1. char[] 转换string时的自动截断问题

    在char[] 转换string时可以直接转换,但当用char[]读取一个二进制文件之后,若char[] 中包含有'\0'时,在转换时会被string检测到并认为字符串末尾,后面内容会被截断,导致转换 ...

  2. 贪心算法之Dijkstra

    贪心算法的主要思想就是通过不断求解局部最优解,最后求出最优解或者最优解的近似值,不能保证一定为最优解. Dijistra算法,选取没有选择过的点到已经选择过得点组成的集合中最短的距离的点.然后更新已选 ...

  3. 动态代理以及对应Spring中AOP源码分析

    AOP(面向切面编程)在Spring中是被广泛应用的(例如日志,事务,权限等),而它的基本原理便是动态代理. 我们知道动态代理有两种:基于JDK的动态代理以及基于CGlib动态代理.以下是两种动态代理 ...

  4. php session存入redis

    php的会话默认以文件的形式存在,可以配知道NOSQL中,既可以提高访问速度又能好好的实现回话共享,在后期做负载均衡时实现多台服务器session 同步也是比较方便: 一:在php配置文件中改 修改p ...

  5. Appium安装教程

    一.适用操作系统Win7 旗舰版Sp1 64位操作系统 或 32位操作系统二.所需软件jdk-7u45-windows-i586.exenode-v0.10.28-x86.msi (32位)下载地址: ...

  6. 第六模块:WEB框架开发 第1章·Django框架开发88~128

    88-Ajax简介 89-Ajax的简单实现 90-基于Ajax的传递数据 91-基于Ajax的登录验证 92-基于Form表单的文件上传 93-请求头之contentType 94-Ajax传递js ...

  7. lintcode166 链表倒数第n个节点

    链表倒数第n个节点 找到单链表倒数第n个节点,保证链表中节点的最少数量为n. 思路:设置两个指针first,second指向head,first指针先向前走n,然后两个指针一起走,first指针走到末 ...

  8. 本地矩阵(Local Matrix)

    本地矩阵具有整型的行.列索引值和双精度浮点型的元素值,它存储在单机上.MLlib支持稠密矩阵DenseMatrix和稀疏矩阵Sparse Matrix两种本地矩阵,稠密矩阵将所有元素的值存储在一个列优 ...

  9. Memcache的客户端连接系列(三) C++

    关键词: Memcached   C++ 客户端 声明:本文并非原创,转自华为云帮助中心的分布式缓存服务(Memcached)的用户指南.客户端连接方法通用,故摘抄过来分享给大家. C++客户端示例 ...

  10. 一个五位数ABCDE乘以9,得到EDCBA,求此五位数

    此题是面试时某面试官突然抛出的,要求逻辑分析推导,不许编码,5分钟时间算出来最终结果,当然,最终没有完全推算出来 下面是编码实现 #一个五位数ABCDE*9=EDCBA,求此数 for a in ra ...