正文

第九课:对话框(二)2007-09-24 12:16:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/lym51/29631.html

分享到:

第九课:对话框()

建立一个基于对话框的应用程序,可以看到在CXxxAppInitInstance()函数中:

    CDlgaDlg dlg;

    m_pMainWnd = &dlg;

应用程序启动时,必须对CXxxApp的成员变量m_pMainWnd进行赋值,否则无法运行。在单文档的工程中,我们看不到这种赋值操作,它是在

   if (!ProcessShellCommand(cmdInfo))

       return FALSE;

ProcessShellCommand函数中对m_pMainWnd赋了值。

一、return falsereturn ture的区别:

1.  CXxxAppInitInstance()函数中:

return false:退出应用程序,不进入消息循环。

return ture:应用程序进入消息循环。

2.  在对话框类中的OnInitDialog()中:

return false:如果在OnInitDialog()函数中设置了某控件得到焦点,如:

      GetDlgItem(IDC_EDIT1))->SetFocus();

      应return false,否则上一句代码不会生效。

return ture:在OnInitDialog()函数中没有设置了某控件得到焦点,应return ture

说明:要使对话框上的某个控件在一显示对话框,就具有焦点,还可以将该控件的

      Table Order设为1

二、在对话框中响应回车键:

在对话框中回车,会执行缺省按钮(Default Button)的函数,默认的缺省按钮是IDOK。如果没有缺省按钮,会执行对话框中的OnOK()函数。所以,在一个对话框中要控制回车键,可以采用下面的方法:

1.  OnOK()函数中添加代码:

在对话框中添加四个文本框,我们想用户按回车键时,四个文本框依次循环得到焦点:

if(GetFocus()==GetDlgItem(IDC_EDIT4))    //如果第四个文本框得到焦点

        GetDlgItem(IDC_EDIT1)->SetFocus();   //使第一个文本框得到焦点

else if (GetFocus()->GetDlgCtrlID()==IDOK)   //如果“确定”按钮得到焦点

        CDialog::OnOK();            //对话框返回

else

        GetFocus()->GetNextWindow()->SetFocus(); 

//使当前具有焦点窗口的下一个(按照Table Order顺序)窗口得到焦点    

2.  添加按钮,将其设置为缺省按钮,Visible属性设为false,为它添加响应函数,在其中编程(代码类似1)。

3.  更换回调函数:

我们更换第一个文本框的回调函数,让它不响应回车键。

i.                     定义一个全局变量WNDPROC  oldProc; 用于保存原来的回调函数的指针。

ii.                   在对话框类中的OnInitDialog()中用SetWindowLong函数更换第一个文本框的回调函数为newProc

oldProc=(WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd,GWL_WNDPROC,(long) newProc);

iii.                  定义newProc函数:

  LRESULT CALLBACK newProc (

  HWND hwnd,UINT uMsg,  WPARAM wParam, LPARAM lParam)

{

       if(uMsg==WM_CHAR)     //如果是字符消息

       {

              if(0xd==wParam)   //如果是回车键

                     return 1;     //不处理就返回,即不响应回车键

       }

       return oldProc (hwnd,uMsg,wParam,lParam);

              //其它消息仍由原来的回调函数处理

}

说明:此种方法要文本设置文本框的MultiLine Want return属性设为有效。

三、制作一个可以响应WM_MOUSEMOVE消息的按钮:

1.  新建一个类CHide ,从CButton派生,增加成员对象CHide m_btnFriend,在类中响应WM_MOUSEMOVE消息,在OnMouseMove中添加代码:

    ShowWindow(SW_HIDE);

    m_pmyFriend->ShowWindow(SW_NORMAL);

2.  在对话框的头文件中加入#include “hide.h”

3.  为对话框上的“确定”和“取消”按钮添加捆绑变量

i.                     静态绑定:

a.       ClassWizard为对话框上的“确定”和“取消”按钮添加捆绑变量,

      CHide             m_btnOK;

       CHide             m_btnCancel;

并将其中一个按钮的Visible属性设为false

b.       此种方法会在对话框的DoDataExchange函数中添加

       DDX_Control(pDX, IDCANCEL, m_btnCancel);

       DDX_Control(pDX, IDOK, m_btnOK);

c.       在对话框类中的OnInitDialog()中添加代码:

     m_btnOK.m_pmyFriend=&m_btnCancel;

       m_btnCancel.m_pmyFriend=&m_btnOK;

ii.                   动态绑定:

a.       定义两个成员变量:

     CHide             m_btnOK;

       CHide             m_btnCancel;

b.       在对话框类中的OnInitDialog()中添加代码:

     m_btnOK.m_pmyFriend=&m_btnCancel;

m_btnCancel.m_pmyFriend=&m_btnOK;

m_btnOK.SubclassDlgItem(IDOK,this);

m_btnCancel.SubclassDlgItem(IDCANCEL,this);

四、用代码改变窗口的大小:

1.  在对话框类中定义两个成员变量:

       CRect m_rectLarge;   //用于保存大窗口的大小

       CRect m_rectSmall;   //用于保存小窗口的大小

2.  在对话框中添加一个Picture 控件,用于分隔大小窗口,将其IDIDC_LAND

3.  OnInitDialog()中为其赋值:

       GetWindowRect(&m_rectLarge);  //得到大窗口的大小

       m_rectSmall=m_rectLarge;       //将小窗口先赋为大窗口

       CRect rect;

       GetDlgItem(IDC_LAND)->GetWindowRect(rect);// 得到分隔条的矩形,

       m_rectSmall.bottom=rect.bottom; //为小窗口进行赋值

4.  添加成员函数EnableVisibleChildren(),将不属于当前窗口的控件设为失效。

  CRect rectVisible,rectCtrl,rectTemp;

       GetWindowRect(&rectVisible);

       CWnd *pWnd=GetWindow(GW_CHILD);

       while(pWnd)

       {

              pWnd->GetWindowRect(&rectCtrl);

              if(rectTemp.IntersectRect(&rectVisible,&rectCtrl))

                     pWnd->EnableWindow(true);

              else

                     pWnd->EnableWindow(false);

              pWnd=pWnd->GetNextWindow();

       }

5.  增加一个按钮,并为其添加响应函数,在其中改变窗口的大小:

       CString str;

       if(GetDlgItemText(IDC_BUTTON3,str),str=="<<collapse")

       {

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

SWP_NOMOVE|SWP_NOZORDER);

              SetDlgItemText(IDC_BUTTON3,"expand>>");

       }

       else

       {           

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

SWP_NOMOVE|SWP_NOZORDER);

              SetDlgItemText(IDC_BUTTON3,"<<collapse");

       }

       EnableVisibleChildren();

五、隐藏对话框:

1.  可以在OnPaint()

ShowWindow(SW_HIDE);

2.  可以用定时器:

OnInitDialog()

 SetTimer(1,1000,NULL);

添加WM_TIMER的消息响应函数OnTimer,在其中添加:

   ShowWindow(SW_HIDE);  

3.  也可以在OnInitDialog()中发送消息

a.       OnInitDialog()加入 

         PostMessage(WM_USER+1);      

b.       在消息响应表中添加消息映射:

ON_MESSAGE(WM_USER+1,OnHideDlg)

c.       添加成员函数OnHideDlg

LRESULT CDlgaDlg::OnHideDlg(WPARAM wParam, LPARAM lParam)

{

       ShowWindow(SW_HIDE);

       return 1;

}

阅读(4918) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册