VC++深入详解之对话框笔记

此文乃作者的笔记,对您无任何作用,请忽略。当然了,如果你硬要看,我也没有办法,但是我已经提醒过了,那我就没有责任了。

创建Modalless对话框: CTestDlg *pDlg = new CTestDlg; pDlg -> Create( IDD_DIALOG1, this ); pDlg-> ShowWindow( SW_SHOW ); 对于模态对话框,关闭以后就自动销毁,而对于非模态对话框,则是将其隐藏,因此对于非模态对黄狂来说,如果有一个ID值为IDOK的按钮,就必须重写基类的OnOK这个虚函数,并在重写的函数中调用DestroyWindow函数,以完成销毁对话框饿工作,同时注意不要再调用基类的OnOK函数。IDCANCEL同理。 判断是个按钮是否存在,最简单的方法就是判断它的句柄: if( ! m_btn.m_hWnd ) { m_btn.Create(_T("New") , BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD, CRect( 0, 0, 100, 50) , this, 123); } else { m_btn.DestroyWindow(); } 静态标签添加消息: 修改ID,添加响应消息,修改属性Notify为true。 修改控件(包括静态控件)的文字: 方法一: CString str; GetDlgItem( IDC_NUMBER1) -> GetWindowText( str ); if( str = "Number1:" ) { GetDlgItem( IDC_NUMBER1) -> SetWindowText( _T("数值1:")); } else { GetDlgItem(IDC_NUMBER1) -> SetWindowText( _T("Number1:")); } 方法二: GetDlgItemText( IDC_EDIT1, ch1, 10); SetDlgItemText( IDC_EDIT2, ch3); 将控件与成员变量关联时,会用到DoDataExchange函数。该函数完成数据的关联,然而在程序代码中从来不直接调用这个额函数,而是通过CWnd类的另一个成员函数UpDateData来调用。 BOOL UpdateData( BOOL bSaveAndValidate = TRUE ); 如果其之为TRUE,则说明该函数正在获取对话框的数据,如果其值为FALSE,则说明该函数正在初始化对话框控件,即拷贝变量值到控件去显示。 在函数DoDataExchange中会用到DDX_***和DDV_***其中DDV_***用以验证数据有效性,需出现在其对应的DDX_***之后。 也可以定义控件类型的成员变量,用以代表其本身,使用的时候就不许哟啊GetDlgItem( IDC_EDIT1)这么麻烦了。 声明:CEdit m_edit1; 数据交换:DDX_Control( pDX, IDC_EDIT1, m_edit1); 使用:m_edit1.SetWindowText( ch1); 基于消息(WM_GETTEXT,WM_SETTEXT)的控件数据传递方式: int num1, num2, num3; char ch1[10], ch2[10], ch3[10]; SendDlgItemMessage( IDC_EDIT1, WM_GETTEXT, 10, (LPARAM)ch1); SendDlgItemMessage( IDC_EDIT2, WM_GETTEXT, 10, (LPARAM)ch2); num1 = atoi( ch1); num2 = atoi(ch2); num3 = num2 + num1; itoa( num3, ch3, 10); SendDlgItemMessage(IDC_EDIT3, WM_SETTEXT, 0, (LPARAM)ch3); 访问对话框控件的其中方式: ①GetDlgItem()->Get(Set)WindowText() ②GetDlgItemInt/SetDlgItemText() ③GetDlgItemInt()/SetDlgItemInt() ④将控件和整形变量相关联 ⑤将控件和控件变量相关联 ⑥SendMessage() ⑦SendDlgItemMessage() 对话框收缩功能的实现: void CTestDlg::OnBnClickedButton1() { CString str; GetDlgItem( IDC_BUTTON1 ) ->GetWindowText(str); if( str ==_T( "收缩<<")) { GetDlgItem(IDC_BUTTON1) ->SetWindowText(_T("扩展>>")); } else { GetDlgItem(IDC_BUTTON1) -> SetWindowText(_T("收缩<<")); } static CRect rectLarge; static CRect rectSmall; if( rectLarge.IsRectNull())//检查是否已赋值 { CRect rectSeparator; GetWindowRect( &rectLarge); GetDlgItem(IDC_SEPERATOR)->GetWindowRect( &rectSeparator); rectSmall.left = rectLarge.left; rectSmall.top = rectLarge.top; rectSmall.right = rectLarge.right; rectSmall.bottom = rectSeparator.bottom; } if( str == _T("收缩<<")) { 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); } } 输入焦点的传递: LONG SetWindowLong( HWND hWnd, int nIndex, LONG dwNewLong); 该函数的作用是改变制定窗口的属性。 在程序运行时,对话框及其子控件穿件完成,将要显示之前会发送一个消息:WM_INITDIALOG vs2008中没有WM_INITDIALOG,不过在CDialog类中已经对此消息响应了,所以我们喜欢响应此消息的时候,只需要改写OnInitDialog()虚函数即可。 逃跑按钮的实现: 添加两个相似的按钮 自定义一个从CButton派生的类CNewButton用以响应MOUSEMOVE函数 在对话框类中添加对应的CNewButton成员变量 在CNewButton中添加一个CNewButton*的指针,用以指向下一个要隐藏的按钮 在对话框类的OnInitDialog为CNewButton*指针赋值 并设置除第一次需要显示的按钮意外的其他按钮为隐藏 响应MouseMove消息: void CNewButton::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your messoage handler code here and/or call default ShowWindow(SW_HIDE); m_pBtn->ShowWindow (SW_SHOWNORMAL); CButton::OnMouseMove(nFlags, point); } 属性页和属性表单: 属性表单的属性: Style:Child(普通对话框:Popup) Border:Thin(普通对话框:Doalog Frame) System menu:为选中(普通对话框:未选中) 首先添加资源:在对话框下面的IDD_PROPPAGE_LARGE 然后绘制属性页 再生成相应的类,生成类的时候基类需为CPropertyPage 可以生成多个属性页,最后定义一个属性表单 属性表单的基类应当为CPropertySheet 再定义相应的成员变量,成员变量的类型就是对应的属性页 然后在属性表单类的构造函数中调用AddPage() 最后就是使用属性表单,只需要在要用的地方定义一个属性表单,调用其DoModal函数即可(类似于对话框的调用) 如果要创建向导,只需要在调用DoModal之前,设置propSheet.SetWizardMode()即可。 在第一页,也会有上一步按钮,所以需要重写OnSetActive()虚函数: BOOL CProp1::OnSetActive() { ((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_NEXT); return CPropertyPage::OnSetActive(); } 为了判断使用者是否选择了Radio中的一个,将第一个Radio的Group属性设置为true, 然后添加一个于控件对应的成员变量,当使用者单击下一步的时候,程序将调用OnWizardNext这个虚函数,为了判断使用者是否选择,应当重写此虚函数: LRESULT CProp1::OnWizardNext() { // TODO: Add your specialized code here and/or call the base class UpdateData(); if( m_occupation == -1 ) { AfxMessageBox(_T("请选择你的职业")); return -1; } if ( m_wordAddr == _T("")) { AfxMessageBox(_T("请选择你的工作地点")); return -1; } return CPropertyPage::OnWizardNext(); } 初始化CListBox: BOOL CProp1::OnInitDialog() { CPropertyPage::OnInitDialog(); ((CListBox*)GetDlgItem(IDC_LIST1))->AddString(_T("北京")); ((CListBox*)GetDlgItem(IDC_LIST1))->AddString(_T("上海")); ((CListBox*)GetDlgItem(IDC_LIST1))->AddString(_T("天津")); // TODO: Add extra initialization here return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } 初始化CComboBox: BOOL CProp3::OnInitDialog() { CPropertyPage::OnInitDialog(); // TODO: Add extra initialization here ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(_T("1000元以下")); ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(_T("1000-2000元")); ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(_T("2000-3000元")); ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(_T("3000元以上")); ((CComboBox*)GetDlgItem(IDC_COMBO1))->SetCurSel(0); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } 一般情况下,CPropertySheet类的DoModal函数的返回值是IDOK或IDCANCEL。但是如果属性表单已经被创建为向导了,那么该函数的返回值将是ID_WIZFINISH或IDCANCEL。 设置字体: CFont font; font.CreatePointFont( 300, "华文行楷"); CFont *pOldFont; pOldFont = pDC->SelectObject( &font); //控制绘图位置: TEXTMETRIC tm; pDC->GetTextMetrics( &tm); pDC->TextOut( 0, tm.tmHeight, strTemp );
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值