zoukankan      html  css  js  c++  java
  • VC学习笔记:对话框

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

    }

    }

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

  • 相关阅读:
    【HTML5 绘图与动画】使用canvas
    【H5新增元素和文档结构】新的全局属性 1. contentEditable 可编辑内容 2. contextmenu 快捷菜单 3. data 自定义属性 4. draggable 可拖动 5. dropzone 拖动数据 6. hidden 隐藏 7. spellcheck 语法检查 8. translate 可翻译
    【H5新增元素和文档结构】完善旧元素 1. a 超链接 2. ol 有序列表 3. dl 定义列表 4. cite 引用文本 5. small 小号字体 6. iframe 浮动框架 7. script 脚本
    【H5新增元素和文档结构】新的语义信息 1. address 2. time 3. figure 跟 figcaption 4. details 和 summary 5. mark 6. progress 7. meter 8. dialog 9.bdi 10. wbr 11. ruby、rt、rp 12. command
    【H5新增元素跟文档结构】新的文档结构 1. article 文章块 2. section 区块 3. nav 导航条 4. aside 辅助栏 5. main 主要区域 6. header 标题栏 7. hgroup 标题组 8. footer 页脚栏
    5_PHP数组_3_数组处理函数及其应用_9_数组集合运算函数
    【华为云技术分享】鲲鹏弹性云服务器GCC交叉编译环境搭建指南
    【华为云技术分享】7 分钟全面了解位运算
    【华为云技术分享】Linux内核编程环境 (1)
    【华为云技术分享】华为云MySQL 8.0正式商用,全新增强版开源利器强势来袭
  • 原文地址:https://www.cnblogs.com/zhaodahai/p/6825077.html
Copyright © 2011-2022 走看看