创建并销毁一个模态对话框和非模态对话框:
//创建一个模态对话框
CTestDlg dlg;
dlg.DoModal();
//创建一个非模态对话框,不能创建局部的
//一个变量,无法显示,故只能定义一个指针
CTestDlg *pDLg=new CTestDlg();
dlg->Create(IDD_DLALOG1,this);
dlg->ShowWindow(SW_SHOW); //非模态对话框需要调用显示函数
销毁时调用DestroyWindow(),而不是EndDialog,因为它是隐藏一个窗口,而不是销毁。
动态添加一个按钮:
首先在对话框中拖放一个Button,添加该按钮的消息事件(通告消息)。
static BOOL bIsCreate=FALSE;
if(bIsCreate==FALSE) //防止重复创建导致出错
{
m_btn.Create("飞雪",BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD,
CRect(0,0,100,100),this,221);
bIsCreate=TRUE;
}
else
{
m_btn.DestryWindow();
bIsCreate=FASLE;
}
或者if(!m_btn.m_hWnd)
{
m_btn.Create("飞雪",BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD,
CRect(0,0,100,100),this,221);
}
else
{
m_btn.DestroyWindow();
}
静态文本框的创建和更改:
更改静态文本的ID后才能在ClassWizard里面看到,添加单击消息响应。注意将文本框属性内
的Notify的选项选中,才能接受通告消息。
Cstring str;
//获取文本内容,并判断是否为Number1
if(GetDlgItem(IDC_NUMBER1)->GetWindowText(str),str=="Number1:")
{
//设置新的文本内容
GetDlgItem(IDC_NUMBER1)->SetWindowText("数值1:");
}
else
{
GetDlgItem(IDC_NUMBER1)->SetWindowText("Number1:");
}
7种访问对话框控件的方法:
GetDlgItem()->Get(Set)WindowText()
GetDlgItemText()/SetDlgItemText()
GetDlgItemInt()/SetDlgItemInt()
***将控件和整型变量相关联
***将控件和控件变量相关联
SendMessage()
SendDlgItemMessage() //可用来设置复选内容
数字和字符串的相互转换:
int atoi(const char *string); //字符串转化为整数
char *itoa(int value, char *string, int radix); //整数转化为字符串
对话框的收缩与扩展功能:
首先实现按钮文本的改变,为该按钮添加一个鼠标单击相应函数。
CString str;
if(GetDlgItemText(IDC_BUTTON2,str),str=="收缩<<")
{
SetDlgItemText(IDC_BUTTON2,"扩展>>");
}
else
{
SetDlgItemText(IDC_BUTTON2,"收缩<<");
}
其次实现界面的改变,在对话框上添加一个图像控件,将其拉成一条线,充当切割线,可设置
其为不可见模式。
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=rectSeparator.bottom;
}
if(str=="收缩<<")
{
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);
}
输入焦点的自动转移:
一般都把OK按钮设置为缺省按钮,所以在子类中覆盖基类的OnOK函数。添加一个
OnInitDialog()消息响应函数,完成编辑框的窗口句柄。
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
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 prevProc(hwnd,uMsg,wParam,lParam);
}
}
WNDPROC prevProc;
BOOL CTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
prevPro=(WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd,
GWL_WNDPROC,(LONG)WinSunProc);
return TRUE;
}
//上述只可实现一个编辑框的光标转移,以下可实现,在OnOK()中实现。取消设置编辑框的多行
选中
void CTestDlg::OnOK()
{
//GetFocus()->GetNextWindow()->SetFocus();
//GetFocus()->GetWindow(GW_HWNDNEXT)->SetFocus();
//以上方法当没有下一个窗口是为空,再调用SetFocus()会出错
GetNextDlgTabItem(GetFocus())->SetFocus();
}
逃跑按钮的设计:
在对话框中拖出两个button,采用隐藏一个显示一个来实现按钮的逃跑,这是个技巧。由按钮
来捕获鼠标移动,增加一个新的类CWeixinBtn。在CTestDlg类中为两个按钮关联两个
CWeixinBtn类型的成员变量。然后为CWeixinBtn添加OnMouseMove()处理函数,然后添加一个
CWeixinBtn类的指针m_pBtn。
在CTestDlg类的初始化函数中添加一下代码:
m_btn1.m_pBtn=&m_btn2;
m_btn2.m_pBtn=&m_btn1;
然后在CWeixinBtn的OnMouseMove()中添加代码:
ShowWindow(SW_HIDE);
m_pBtn->ShowWindow(SW_SHOW);
属性表单的创建:
插入新的属性页对话框,然后添加为一个新的类,基类为CPropertyPage。创建一个属性表单
类CPropSheet,其基类为CPropertySheet。
AddPage(&m_prop1); //在CPropertySheet的构造函数中添加
AddPage(&m_prop2); //将属性页对话框加入到属性表单中
AddPage(&m_prop3);
创建属性表单菜单,然后在View类中显示属性表单
CPropSheet propSheet("飞雪待剑属性表单");
propSheet.DoModal(); //显示模态的属性表单
向导的创建:
和创建属性表单的过程一样,在View类中显示
CPropSheet propSheet("飞雪待剑属性表单");
propSheet.SetWizardMode(); //设置为向导
propSheet.DoModal();
在不同的属性页中添加OnSetActive消息响应函数,在该函数中设置各属性页的上一步,下一
步及完成按钮的使用。因为默认情况是包含上一步和下一步两个按钮。
BOOL CProp1::OnSetActive()
{
//只显示下一步按钮
((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_NEXT);
return CPropertyPage::OnSetActive();
}
BOOL CProp2::OnSetActive()
{
//显示上一步和下一步
((CPropertySheet*)GetParent())->SetWizardButtons
(PSWIZB_BACK | PSWIZB_NEXT);
return CPropertyPage::OnSetActive();
}
BOOL CProp3::OnSetActive()
{
//显示上一步和下一步
((CPropertySheet*)GetParent())->SetWizardButtons
(PSWIZB_BACK | PSWIZB_FINISH);
return CPropertyPage::OnSetActive();
}
判断用户是否进行选择:
在下一步按钮被点击时相应OnWizardNext()函数。在该函数可以设置只有在用户做了必要
的选择时,才能进入下一步,该按钮才会被应用。注意调用UpdateData()函数来从控件当中取
回值赋给成员变量,调用UpdateData(FALSE)来将成员变量的值赋给控件。
列表框中增加一些选项,在OnInitDialog()中完成
((CListBox*)GetDlgItem(IDC_LIST1))->AddString("北京");
((CListBox*)GetDlgItem(IDC_LIST2))->AddString("天津");
((CListBox*)GetDlgItem(IDC_LIST3))->AddString("上海");
组合框中增加一些选项,在OnInitDialog()中完成
((CComboBox*)GetDlgItem(IDC_COMBO2))->AddString("1000元以下");
((CComboBox*)GetDlgItem(IDC_COMBO2))->AddString("1000-2000元");
((CComboBox*)GetDlgItem(IDC_COMBO2))->AddString("2000-3000元");
//将选项中的第一个选项显示为缺省选项
((CComboBox*)GetDlgItem(IDC_COMBO2))->SetCurSel(0);
当用户点击完成时,存储用户选择。故添加OnWizardFinish()消息响应函数,添加代码
int index;
//取出用户选择的选项的索引号
index=((CComboBox*)GetDlgItem(IDC_COMBO2))->GetCurSel();
//将用户的选择存到m_strSalary中。
((CComboBox*)GetDlgItem(IDC_COMBO2))->GetLBText(index,m_strSalary);
在视类中显示用户的选择:
if(IDWIZFINISH == propSheet.DoModal())
{
//将存储的数据调过来
Invalidate(); //让窗口无效,引起重绘,在OnDraw()中输出选择
}
补充:C语言中对数组的快速初始化
void *memset(void *dest, int c, size_t count);
―――dest为数组首地址―――c为数组值―――count为数组大小