MFC(五)——对话框编程

模态与非模态对话框的创建

  • 模态
    CTestNew dlg1;
    dlg1.DoModal();
  • 非模态
    CTestNew *pDlg1 = new CTestNew();
    pDlg1->Create(IDD_DIALOG1,this);
    pDlg1->ShowWindow(SW_SHOW);

对话框数据获取和显示(计算器为例)

  • 方法一
    GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10);
    GetDlgItem(IDC_EDIT2)->GetWindowText(ch2,10);
    num1 = atoi(ch1);
    num2 = atoi(ch2);
    num3 = num1 + num2;
    itoa(num3,ch3,10);
    GetDlgItem(IDC_EDIT3)->SetWindowText(ch3);
  • 方法二
    GetDlgItemText(IDC_EDIT1,ch1,10);
    GetDlgItemText(IDC_EDIT2,ch2,10);
    num1 = atoi(ch1);
    num2 = atoi(ch2);
    num3 = num1 + num2;
    itoa(num3,ch3,10);
    SetDlgItemText(IDC_EDIT3,ch3);
  • 方法三
    num1 = GetDlgItemInt(IDC_EDIT1);
    num2 = GetDlgItemInt(IDC_EDIT2);
    num3 = num1 + num2;
    SetDlgItemInt(IDC_EDIT3);
  • 方法四
    UpdateData();
    m_num3 = m_num1 + m_num2;
    UpdateDate(FALSE);
  • 方法五
    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,10);
  • 方法六
    ::SendMessage(GetDlgItem(IDC_EDIT1)->m_hwnd,WM_GETTEXT,10,(LPARAM)ch1);

窗口的扩展和收缩

  • Z-order
    窗口的z次序表明了重叠窗口堆中窗口的位置,这个窗口堆是按一个假象的轴定位的,这个轴就是从屏幕向外伸展的Z轴。Z次序最上面的窗口覆盖所有其它的窗口,Z次序最底层的窗口被所有其它的窗口覆盖。应用程序设置窗口在Z次序中的位置是通过把它放在一个给定窗口的后面,或是放在窗口堆的顶部或底部。
    Windows系统管理三个独立的Z次序——一个用于顶层窗口、一个用于兄弟窗口,还有一个是用于最顶层窗口。最顶层窗口覆盖所有其它非最顶层窗口,而不管它是不是活动窗口或是前台窗口。应用程序通过设置WS_WX_TOPMOST风格创建最顶层窗口。
  • 兄弟窗口
    共享同一个父窗口的多个子窗口叫兄弟窗口。
  • 前台窗口和后台窗口
    在Windows系统中,每一个进程可运行多个线程,每个线程都能创建窗口。
    创建正在使用窗口的线程称为前台线程,这个窗口就称之为前台窗口。所有其它的线程都是后台线程,由后台线程所创建的窗口叫后台窗口。

代码实现

    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 = rectSparator.bottom;
    }
    if("收缩<<" == str)
    {
        SetWindowPos(NULL,0,0,rectSmall.Width(),rectSmall.Weight(),
            SWP_NOMOVE|SWP_NOZORDER);
    }
    else
    {
        SetWindowPos(NULL,0,0,rectLarge.Width(),rectLarge.Weight(),
            SWP_NOMOVE|SWP_NOZORDER);
    }   
  • 实现按回车焦点转移
    WNDPROC prewProc;
    LRESULT CALLBACK FlamingProc( //WndProc名称可自由定义
        HWND hwnd,
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam
    )
    {
        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 prewProc(hwnd,uMsg,wParam,mParam);
        }
    }

    BOOL CTestDlg::OnInitDialog()
    {
        preProc = (WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)
            ->m_hWnd,GWL_WNDPROC,(LONG)FlamingProc);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值