VC学习:对话框
2010-11-01 08:07:59 来源:WEB开发网http://tech.cncms.com/develop/vc/59131.html
http://tech.cncms.com/develop/vc/59160.html
http://tech.cncms.com/develop/vc/59028.html
/*【对话框专题知识】*/
//知识点:创建对话框;显示对话框;
//新建Single Document程序
void CMyBoleView::OnDialog() //对话框的响应函数
{
//首先创建一个新的对话框资源,并增加一个相关的类[CTestDlg]用来操作该资源。再增加一个菜单项(view类)用来显示该对话框。【每增加一个新对话框都需增加一个相关类来做相关处理】
//▲注意:要在view类头文件里包含testdlg.h,才能在菜单项的消息响应函数使用该类。
/*■1.<<创建、显示、关闭模态对话框>>*/
CTestDlg dlg; //此处是局部变量,但不要紧,因为程序会暂时停下来等模态对话框关闭后再运行;
dlg.DoModal();//创建并显示模态对话框
/*■2.<<创建、显示、销毁非模态对话框>>*/
//>>错误写法:CTestDlg dlg;
//▲不能定义成局部变量。局部变量两种处理方法:[1]定义成view类的成员变量;[2]定义成指针,在堆栈上分配内存,因为堆栈上的内存和程序的整个生命期是一致的(前提是程序不能主动销毁)
CTestDlg *pDlg=new CTestDlg;
//▲>>指针变量是一个局部变量,生命周期结束后其保存的内存地址就丢失了,程序无法再引用了,解决方法:
//[1]定义为视类的成员变量,再在其析构函数里用delete函数释放内存;
//[2]在CTestDlg类中重载PostNcDestroy虚函数,释放this指针指向的内存。
pDlg->Create(IDD_DIALOG1,this); //第一个参数可以是对话框资源ID或对话框模板名称;第二个参数指定父窗口,为NULL时即为主应用程序窗口
pDlg->ShowWindow(SW_SHOW);
//▲>>非模态与模态的区别:[1]显示 [2]局部变量的使用 [3]按下ok键后,模态的会调用OnOK虚函数,其又会调用EndDialog函数,从而终止模态对话框而非模态的并不销毁对话框,仅使其不可见,故要重写基类的OnOK虚函数(或OnCancel虚函数),在重写函数中调用DestroyWindow函数
pDlg->DestroyWindow();//销毁非模态对话框
delete pDlg;//释放指针
/*■3.1<<动态创建模态对话框>>*/
CTestDlg dlg;//局部变量不要紧,因为程序会暂时停下来等模态对话框关闭后再运行
dlg.DoModal();//创建并显示模态对话框
}
/*■3.<<动态创建模态对话框>>*/
//功能:单击对话框中某个按钮时(在对方框),就在对话框中动态创建一个新按钮
void CTestDlg::OnBtnAdd() //按钮Add的响应函数
{
//>>先创建模态对话框(view类Ondialog中,见上3.1),再在对话框IDD_DIALOG1添加一按钮Add并对其添加消息处理函数(CTestDlg类,也即此函数)
//>>再在CTestDlg类中添加CButton型的私有成员变量m_bt。为m_bt对象是否已经与窗口关联,避免重复关联而出错,有如下三种实现方法:
//▲法一:BOOL型私有成员变量m_bIsCreated(在其构造函数中初始化为FALSE),用来标识是否已经创建过按钮窗口了
if(m_bIsCreated==FALSE) //确保m_bt没有与某窗口绑定了
{
m_bt.Create("New",BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE,CRect(0,0,100,200),this,123); //CButton类的Create用来创建按钮。若无WS_VISIBLE,则要加ShowWindow
m_bIsCreated=TRUE;
}
else
{
m_bt.DestroyWindow();
m_bIsCreated=FALSE;
}
//▲法二:若不用成员变量m_bISCreated,也可以用下方法
static BOOL bIsCreated=FALSE;//注意:必须是static,否则每次调用OnBtAdd函数时都会被重新定义,实现不了所需功能;而对于static,第一次加载时,就会为其分配内存空间并初始化为FALSE,以后再进入OnBtnAdd时,就不会再为这个静态分配内存空间并初始化了!
if(bIsCreated==FALSE) //确保m_bt没有与某窗口绑定了
{
m_bt.Create("New",BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE,CRect(0,0,100,200),this,123);//若无WS_VISIBLE,则要加ShowWindow
bIsCreated=TRUE;
}
else
{
m_bt.DestroyWindow();
bIsCreated=FALSE;
}*/
//▲法三:由于CWnd类有一个成员变量m_hWnd用来保存与窗口对象相关联的窗口句柄,如果窗口句柄没有任一窗口相关联,则句柄为NULL
if(!m_bt.m_hWnd)
{
m_bt.Create("New",BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE,CRect(0,0,100,200),this,123);
}
else
{
m_bt.DestroyWindow();
}
}
/*■4.<<静态文本控件的访问>>*/
//功能:单击一个静态文本(Number1:)时,把文本变成“数值1:”
void CTestDlg::OnNumber1() //静态文本Number1的响应函数
{
//先添加一个对话框及类,并添加菜单来显示(同前)
//再添加静态文本Number1:,改变其ID(由于静态文本一般只其标签的作用,其ID默认都相同,特殊情况下需要操作它时需改变它)
//注意:静态文本控件默认是不发送通告消息的。需要勾上Notify选项
CString str;
if(GetDlgItem(IDC_NUMBER1)->GetWindowText(str), str == "Number1:") //if语句的一种使用方法
//控件实际上也是窗口,要获取静态文本控件上显示的文本,可以利用CWnd类GetWindowText来实现,之前需要由GetDlgItem来获取静态文本框件对象
{
GetDlgItem(IDC_NUMBER1)->SetWindowText("数值1:");
}
else
{
GetDlgItem(IDC_NUMBER1)->SetWindowText("Number1:");
}
}
/*■5.<<编辑框控件>>*/
//功能:在前两个编辑框中分别输入数字,然后单击Add按钮,把其和显示在第三个编辑框
void CTestDlg::OnBtnAdd()
{
//▲法一:GetDlgItem->GetWindowText
int num1, num2, num3;
char ch1[10], ch2[10], ch3[10];
GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10);
GetDlgItem(IDC_EDIT2)->GetWindowText(ch2,10);
num1 = atoi(ch1);//atoi将数字组成的字符串转换成数值
num2 = atoi(ch2);
更多精彩
赞助商链接