[求助] 【MFC】消息之间怎么一环一环的传递改变下去?
mfc吧
全部回复
仅看楼主
level 1
冥狱幽瞳 楼主
就是一个窗口上有多个下拉框
重复类型:
重复周期:
重复时间:
……
修改第一个重复类型,比如是
按日重复,第二个重复周期的内容变成一号、二号、三号……
按周重复,第二个重复周期的内容变成星期一星期二星期三……
而按周重复我还想将Combo Box改成复选按钮,或许会分成两行,然后对应的重复时间什么的位置就会跟着下移
……
然后再往下其他控件的位置也发生了变化。
……
内容的联动我已经做好了,通过修改重复类型,产生CBN_SELCHANGE消息,来修改重复周期的内容。
可是这就有个问题,那就是重复类型没有点击之前,重复周期……重复时间等缺省不好做。
像OnCbnSelchangeComtype()函数中那些设置,我倒是可以选一个设置到OnInitDialog里面,可问题不能到这里解决。
修改了重复类型,重写了重复周期,那再往下的重复时间呢,也写在OnCbnSelchangeComtype()里面?
我希望能够在自动变化了周期之后,还能发送一个消息,换一个消息相应去自动变化时间。
我尝试用SendMessage来发送消息,不过没学好,我一时间不明白SendMessage的内容应该怎么写,放控件ID?放消息类型?这两个应该都要放吧,还是使用其他的办法??
这里面我还有很重要的想要解决的问题,那就是界面排版的问题,代码里面写了一个界面排版,并且用自定义消息(Initmove )来调用这个排版,可是这个排版是固定的。
如果我重复类型选择了按周重复,重复周期里面的下拉框隐藏掉,变成七个多选按钮,或许会占据两排三排,然后再往下的重复时间的位置会向下顺延,我总感觉,只要设置一个关联的消息传递就能做到
思路是:
重复类型变化了,传递一个消息给重复周期,我感觉应该也是用CBN_SELCHANGE,比如SendMessage(CBN_SELCHANGE,IDC_COMPER)?这个写法应该是错的,唉,都怪我没学好。
重复周期内容变化了,作出对应代码改变,然后传递消息给下一个重复时间……
这样依次传递依次修改,而不是做在同一个消息里面,应该怎么写代码?可我就是做不到……求助:
代码发在下一楼
2017年05月14日 12点05分 1
level 1
冥狱幽瞳 楼主
代码删掉很多,因为回复字数不让太多,但大概意思表达出来了,希望能得到帮助
BOOL DATADlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 在此添加额外的初始化
SendMessage(Initmove);
Comtype.AddString(_T("不重复"));
Comtype.AddString(_T("按日重复"));
Comtype.AddString(_T("按周重复"));
Comtype.AddString(_T("按月重复"));
Comtype.AddString(_T("按年重复"));
Comtype.AddString(_T("按自定义重复"));
Comtype.SetCurSel(0);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
void DATADlg::OnCbnSelchangeComtype()
{
CString Text;
GetDlgItemText(IDC_COMTYPE, Text);
if (Text == _T("不重复"))
{
Comper.ResetContent();
GetDlgItem(IDC_STAPER)->SetWindowText(_T("不重复"));
}
else if (Text == _T("按日重复"))
{
Comper.ResetContent();
Comper.AddString(_T("1"));
Comper.AddString(_T("2"));
Comper.AddString(_T("3"));
Comper.SetCurSel(0);
GetDlgItem(IDC_STAPER)->SetWindowText(_T("日"));
}
else if (Text == _T("按周重复"))
{
Comper.ResetContent();
Comper.AddString(_T("星期一"));
Comper.AddString(_T("星期二"));
Comper.AddString(_T("星期三"));
Comper.AddString(_T("星期四"));
Comper.SetCurSel(0);
GetDlgItem(IDC_STAPER)->SetWindowText(_T(" "));
}
else if (Text == _T("按月重复"))
{
Comper.ResetContent();
Comper.AddString(_T("1"));
Comper.AddString(_T("2"));
Comper.AddString(_T("3"));
Comper.SetCurSel(0);
GetDlgItem(IDC_STAPER)->SetWindowText(_T("月"));
}
else if (Text == _T("按年重复"))
{
……省略
……
afx_msg LRESULT DATADlg::OnInitmove(WPARAM wParam, LPARAM lParam)
{
//定义左半边的位置,设定X1;
int x1=5, x2, y1=5, y2, x3;
CRect EDITrect, STXNRrect;
GetDlgItem(IDC_EDIT)->GetWindowRect(&EDITrect);
GetDlgItem(IDC_STATICTXNR)->GetWindowRect(&STXNRrect);
STXNRrect.MoveToXY(x1, y1);
EDITrect.MoveToXY(STXNRrect.TopLeft().x, STXNRrect.TopLeft().y + STXNRrect.Height());
GetDlgItem(IDC_STATICTXNR)->MoveWindow(STXNRrect);//移动到目标位置
GetDlgItem(IDC_EDIT)->MoveWindow(EDITrect);//移动到目标位置
x2 = EDITrect.right + 30;
//定义右半边 提醒时间等文字的x点
//第一行 提醒时间
CRect STXSJrect, DATErect, TIMErect;
GetDlgItem(IDC_STATICTXSJ)->GetWindowRect(&STXSJrect);
GetDlgItem(IDC_DATE)->GetWindowRect(&DATErect);
GetDlgItem(IDC_TIME)->GetWindowRect(&TIMErect);
DATErect.MoveToY(0);
TIMErect.MoveToY(0);
y2 = (TIMErect.Height() - STXSJrect.Height()) / 2;
STXSJrect.MoveToXY(x2, y2);
GetDlgItem(IDC_STATICTXSJ)->MoveWindow(STXSJrect);
x3 = STXSJrect.right;//确定后面所有X3的位置
DATErect.MoveToX(x3);
GetDlgItem(IDC_DATE)->MoveWindow(DATErect);
TIMErect.MoveToX(DATErect.right);
GetDlgItem(IDC_TIME)->MoveWindow(TIMErect);
y2 = TIMErect.bottom + 5;
//第二行 重复类型
CRect SCFLXrect;//重复类型文字
CRect TYPErect;//重复类型下拉框
GetDlgItem(IDC_STATICCFLX)->GetWindowRect(&SCFLXrect);
GetDlgItem(IDC_COMTYPE)->GetWindowRect(&TYPErect);
TYPErect.MoveToXY(x3,y2);
SCFLXrect.MoveToXY(x2, y2 + (TYPErect.Height() - SCFLXrect.Height()) / 2);
GetDlgItem(IDC_STATICCFLX)->MoveWindow(SCFLXrect);
GetDlgItem(IDC_COMTYPE)->MoveWindow(TYPErect);
y2 = TYPErect.bottom + 5;
//第三行 重复周期
CRect SCFZQrect;//重复周期
CRect SMrect;//文字:每
CRect PERrect;//重复周期下拉框
2017年05月14日 12点05分 2
1