mfc 对话框 孙鑫 第七章

第七章

1. 模态对话框

 1.1 创建  Domodal();

      内部调用ShowWindow(SW_SHOW);

      对话框类的对象声明为局部变量就可以,因为Domodal阻塞在这里。

 1.2 销毁,直接点“确定”、“取消”就可以了。CTestDlg::OnOK()和CTestDlg:: OnCancel ()调用CDialog::OnOK()和CDialog:: OnCancel (),后面两个调用EndDialog()。对于模态,EndDialog()销毁对话框。

2.非模态对话框

2.1  创建

// lpszTemplateName对话框模板名称

// pParentWnd 对话框的父窗口,一般用this(谁调用。this就是谁)

BOOL Create(LPCTSTR  lpszTemplateName, CWnd* pParentWnd = NULL);

BOOL Create(UINT  nIDTemplate, CWnd* pParentWnd = NULL);

ShowWindow(SW_SHOW);

注意:对话框类对象要用全局变量或调用所在类的成员变量,或定义为局部指针变量,然后new出来,存在于堆上。

2.2销毁

a). 如果是new出来的局部比变量,要在CTestDlg::PostNcDestory(){

delete this;

CDialog::PostNcDestory();  }

b). OK按钮调用的EndDialog() 对于非模态,只是隐藏,并未销毁。

      解决方法:重写OnOK和OnCancel,调用DestroyWindow(),同时不要在调用CDialog::OnOK()和CDialog:: OnCancel ();

3.动态创建按钮

CButton类成员函数Create(); 可以在mfc项目里查看接口。

4.控件的访问

CWnd::CWnd* GetDlgItem(intnID) const;获取控件指针

GetNextDlgTabItem();//返回指定控件前面或后面一个具有WS_TABSTOP风格的控件

SetWindowText();  GetWindowText();

GetDlgItemText(); SetDlgItemText();

GetDlgItemInit(); SetDlgItemInit()

char ch1[256];memset(ch1,0,sizeof(char)/sizeof(char));

SendMessage(GetDlgItem(nID)->m_hwnd,WM_GETTEXT,10,(lparam)ch1);

SendMessage(m_edit.m_hwnd,WM_GETTEXT,10,(lparam)ch1);

m_edit.SendMessage(WM_GETTEXT,10,(lparam)ch1);

WM_SETTEXT

 

4.对话框伸缩功能    通过GetWindowRect()或者GetClientRect()等获取窗口大小,然后调用SetWindowPos来实现对话框伸缩。

5.焦点传递

a).实现方法

a-1).为编辑框控件编写一个类,利用这个类来捕获键盘消息

a-2).修改编辑框控件过程函数

 WNDPROC prevProc; 定一个窗口过程

LRESULT CALLBACK NewEditProc //窗口过程的名字可以随意命名

(

HWND hwnd, // 窗口的句柄

UINT uMsg, // 消息标示

WPARAM wParam, //第一个消息参数

LPARAM lParam // 第二个消息参数

)

{

if(uMsg == WM_CHAR && wParam == 0x0d)//判断是都为回车符,wparam参数保存的是字符的ASCII码

{

::SetFocus(GetNextWindow(hwnd,GW_HWNDNEXT))//SetFocus(hwnd), GetNextWindow(HWNDhwnd/*当前窗口句柄*/,UNIT wCmd /*查找方向*/);// 是获取下一个窗口的句柄   参数:GW_HWNDNEXT  GW_HWNDPREV 

return 1;

}

else

{

return prevProc(hwnd,uMsg,wParam,lParam);如果不是回车调用先前的窗口过程来处理该消息

}

}

在OnInitDialog() 函数中调用SetWindowLong(),因为在相应PreCreateWindow()和Create()函数的时候,对话框及其子控件都没有全部创建完毕,所以无法获取各子控件的窗口对象,也就无法修改编辑框的窗口过程函数。

OnInitDialog()

{

PrevProc = (WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd,GWL_WNDPROC,(LONG)NewEditProc);

}

 

 

SetFouce(HWND hwnd)


 

 

 

 

 

 

 

你可能感兴趣的:(MFC)