孙鑫老师教学视频学习笔记——对话框

创建并销毁一个模态对话框和非模态对话框:
    //创建一个模态对话框
    CTestDlg dlg;        
    dlg.DoModal();     
    //创建一个非模态对话框,不能创建局部的
    //一个变量,无法显示,故只能定义一个指针
    CTestDlg *pDLg=new CTestDlg();
    dlg->Create(IDD_DLALOG1,this);   
    dlg->ShowWindow(SW_SHOW);     //非模态对话框需要调用显示函数 
销毁时调用DestroyWindow(),而不是EndDialog,因为它是隐藏一个窗口,而不是销毁。
动态添加一个按钮:
    首先在对话框中拖放一个Button,添加该按钮的消息事件(通告消息)。
    static BOOL bIsCreate=FALSE;
    if(bIsCreate==FALSE)   //防止重复创建导致出错
    {
         m_btn.Create("飞雪",BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD, 
                 CRect(0,0,100,100),this,221);
         bIsCreate=TRUE;
    }
    else
    { 
         m_btn.DestryWindow();
         bIsCreate=FASLE;
    }
或者if(!m_btn.m_hWnd)
    {
         m_btn.Create("飞雪",BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD, 
                 CRect(0,0,100,100),this,221);
    }
    else
    {
         m_btn.DestroyWindow();
    }
静态文本框的创建和更改:
更改静态文本的ID后才能在ClassWizard里面看到,添加单击消息响应。注意将文本框属性内
的Notify的选项选中,才能接受通告消息。
    Cstring str;
    //获取文本内容,并判断是否为Number1
    if(GetDlgItem(IDC_NUMBER1)->GetWindowText(str),str=="Number1:")
    {
         //设置新的文本内容
         GetDlgItem(IDC_NUMBER1)->SetWindowText("数值1:");
    }
    else
    {
         GetDlgItem(IDC_NUMBER1)->SetWindowText("Number1:");    
    }
   
7种访问对话框控件的方法:
    GetDlgItem()->Get(Set)WindowText()
    GetDlgItemText()/SetDlgItemText()
    GetDlgItemInt()/SetDlgItemInt()
    ***将控件和整型变量相关联
    ***将控件和控件变量相关联
    SendMessage()
    SendDlgItemMessage()   //可用来设置复选内容
数字和字符串的相互转换:
    int atoi(const char *string);  //字符串转化为整数
    char *itoa(int value, char *string, int radix);  //整数转化为字符串
对话框的收缩与扩展功能:
首先实现按钮文本的改变,为该按钮添加一个鼠标单击相应函数。
    CString str;
    if(GetDlgItemText(IDC_BUTTON2,str),str=="收缩<<")
    {
         SetDlgItemText(IDC_BUTTON2,"扩展>>");
    }
    else
    {
         SetDlgItemText(IDC_BUTTON2,"收缩<<");
    }
其次实现界面的改变,在对话框上添加一个图像控件,将其拉成一条线,充当切割线,可设置
其为不可见模式。
    static CRect rectLarge;
    static CRect rectSmall;
    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);   
    }
    else
    {
         SetWindowPos(NULL,0,0,rectLarge.Width(),rectLarge.Height(),
                       SWP_NOMOVE | SWP_NOZORDER); 
    }
输入焦点的自动转移:
一般都把OK按钮设置为缺省按钮,所以在子类中覆盖基类的OnOK函数。添加一个
OnInitDialog()消息响应函数,完成编辑框的窗口句柄。
    LRESULT CALLBACK WindowProc(
      HWND hwnd,      // handle to window
      UINT uMsg,      // message identifier
      WPARAM wParam,  // first message parameter
      LPARAM lParam   // second message parameter
    )
    {
         if(uMsg==WM_CHAR && wParam==0x0d)
         {
              //注意设置编辑框的多行选中
              //::SetFocus(GetNextWindow(hwnd,GW_HWNDNEXT));
              //SetFocus(::GetWindow(hwnd,GW_HWNDNEXT));
              SetFocus::GetNextDlgTabItem(::GetParent(hwnd),hwnd,FALSE);          
 
              return 1;
         }
         else
         {
              return prevProc(hwnd,uMsg,wParam,lParam);
         }
    }
    WNDPROC prevProc;
    BOOL CTestDlg::OnInitDialog()
    {
         CDialog::OnInitDialog();
         prevPro=(WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd,
                         GWL_WNDPROC,(LONG)WinSunProc);
         return TRUE;
    }
//上述只可实现一个编辑框的光标转移,以下可实现,在OnOK()中实现。取消设置编辑框的多行
选中
    void CTestDlg::OnOK()
    {
         //GetFocus()->GetNextWindow()->SetFocus();
         //GetFocus()->GetWindow(GW_HWNDNEXT)->SetFocus();
         //以上方法当没有下一个窗口是为空,再调用SetFocus()会出错
         GetNextDlgTabItem(GetFocus())->SetFocus();
    }
逃跑按钮的设计:
在对话框中拖出两个button,采用隐藏一个显示一个来实现按钮的逃跑,这是个技巧。由按钮
来捕获鼠标移动,增加一个新的类CWeixinBtn。在CTestDlg类中为两个按钮关联两个
CWeixinBtn类型的成员变量。然后为CWeixinBtn添加OnMouseMove()处理函数,然后添加一个
CWeixinBtn类的指针m_pBtn。
    在CTestDlg类的初始化函数中添加一下代码:
    m_btn1.m_pBtn=&m_btn2;
    m_btn2.m_pBtn=&m_btn1;
    然后在CWeixinBtn的OnMouseMove()中添加代码:
    ShowWindow(SW_HIDE);
    m_pBtn->ShowWindow(SW_SHOW);  
属性表单的创建:
插入新的属性页对话框,然后添加为一个新的类,基类为CPropertyPage。创建一个属性表单
类CPropSheet,其基类为CPropertySheet。
    AddPage(&m_prop1);  //在CPropertySheet的构造函数中添加
    AddPage(&m_prop2);  //将属性页对话框加入到属性表单中
    AddPage(&m_prop3);
创建属性表单菜单,然后在View类中显示属性表单
    CPropSheet propSheet("飞雪待剑属性表单");
    propSheet.DoModal();   //显示模态的属性表单
向导的创建:
和创建属性表单的过程一样,在View类中显示
    CPropSheet propSheet("飞雪待剑属性表单");
    propSheet.SetWizardMode();  //设置为向导
    propSheet.DoModal();   
在不同的属性页中添加OnSetActive消息响应函数,在该函数中设置各属性页的上一步,下一
步及完成按钮的使用。因为默认情况是包含上一步和下一步两个按钮。
    BOOL CProp1::OnSetActive()
    {
         //只显示下一步按钮
         ((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_NEXT);
         return CPropertyPage::OnSetActive();
    }
    BOOL CProp2::OnSetActive()
    {
         //显示上一步和下一步
         ((CPropertySheet*)GetParent())->SetWizardButtons                         
                                (PSWIZB_BACK | PSWIZB_NEXT);
         return CPropertyPage::OnSetActive();
    }
    BOOL CProp3::OnSetActive()
    {
         //显示上一步和下一步
         ((CPropertySheet*)GetParent())->SetWizardButtons                         
                                (PSWIZB_BACK | PSWIZB_FINISH);
         return CPropertyPage::OnSetActive();
    }
判断用户是否进行选择:
    在下一步按钮被点击时相应OnWizardNext()函数。在该函数可以设置只有在用户做了必要
的选择时,才能进入下一步,该按钮才会被应用。注意调用UpdateData()函数来从控件当中取
回值赋给成员变量,调用UpdateData(FALSE)来将成员变量的值赋给控件。
列表框中增加一些选项,在OnInitDialog()中完成
    ((CListBox*)GetDlgItem(IDC_LIST1))->AddString("北京");
    ((CListBox*)GetDlgItem(IDC_LIST2))->AddString("天津");
    ((CListBox*)GetDlgItem(IDC_LIST3))->AddString("上海");    
组合框中增加一些选项,在OnInitDialog()中完成
    ((CComboBox*)GetDlgItem(IDC_COMBO2))->AddString("1000元以下");
    ((CComboBox*)GetDlgItem(IDC_COMBO2))->AddString("1000-2000元");
    ((CComboBox*)GetDlgItem(IDC_COMBO2))->AddString("2000-3000元");
    //将选项中的第一个选项显示为缺省选项
    ((CComboBox*)GetDlgItem(IDC_COMBO2))->SetCurSel(0);
当用户点击完成时,存储用户选择。故添加OnWizardFinish()消息响应函数,添加代码
    int index;
    //取出用户选择的选项的索引号
    index=((CComboBox*)GetDlgItem(IDC_COMBO2))->GetCurSel();
    //将用户的选择存到m_strSalary中。
    ((CComboBox*)GetDlgItem(IDC_COMBO2))->GetLBText(index,m_strSalary);
 
在视类中显示用户的选择:
    if(IDWIZFINISH == propSheet.DoModal())
    {
         //将存储的数据调过来
         Invalidate();     //让窗口无效,引起重绘,在OnDraw()中输出选择
    }
补充:C语言中对数组的快速初始化
      void *memset(void *dest, int c, size_t count);
      ———dest为数组首地址———c为数组值———count为数组大小


本文转自jazka 51CTO博客,原文链接:http://blog.51cto.com/jazka/169870,如需转载请自行联系原作者
上一篇:LINUX 常用命令整理


下一篇:Spring Framework 2.5 Reference中文版正式发布