怎样批量初始化MFC按钮控件?高手帮帮忙解决方案
怎样批量初始化MFC按钮控件?高手帮帮忙
编译没错,但是运行时提示内存不能为written,
调试时发现((AButton*)GetDlgItem(IDC_BUTTON_1+j))->m_Style=1;指向了同一内存,
有什么办法解决吗?由于按钮太多,一个一个改变状态太麻烦(单个判断处理运行正常)
代码
int j=0;
while(j++<12)
{
if(...)
((AButton*)GetDlgItem(IDC_BUTTON_1+j))->m_Style=1;
else ((AButton*)GetDlgItem(IDC_BUTTON_1+j))->m_Style=2;
}
下面是按钮样式文件
void AButton::OnPaint()
{
CPaintDC dc(this); // device context for painting
CWnd* pWnd=this;
CString Text;
CRect RC;
CFont Font;
CFont *pOldFont;
CBrush Brush;
CBrush *pOldBrush;
CPoint PT(200,100);
dc.SetBkMode(TRANSPARENT);//设置背景模式为透明
Font.CreateFont(12,0,0,0,FW_HEAVY,0,0,0,ANSI_CHARSET,\
OUT_TT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,\
VARIABLE_PITCH | FF_SWISS,"MS Sans Serif");
pOldFont=dc.SelectObject(&Font);
if(m_Style==1)
{
CBitmap bmp;
bmp.LoadBitmap(IDBA_BITMAPBUT1);
Brush.CreatePatternBrush(&bmp);
}
else if(m_Style==2)
{
CBitmap bmp;
bmp.LoadBitmap(IDBA_BITMAPBUT2);
Brush.CreatePatternBrush(&bmp);
}
else if(m_Style==3)
{
CBitmap bmp;
bmp.LoadBitmap(IDBA_BITMAPBUT3);
Brush.CreatePatternBrush(&bmp);
}
else if(m_Style==4)
{
CBitmap bmp;
bmp.LoadBitmap(IDBA_BITMAPBUT4);
Brush.CreatePatternBrush(&bmp);
}
else if(m_Style==5)
{
CBitmap bmp;
bmp.LoadBitmap(IDBA_BITMAPBUT5);
Brush.CreatePatternBrush(&bmp);
}
else if(m_Style==6)
{
CBitmap bmp;
bmp.LoadBitmap(IDBA_BITMAPBUT6);
Brush.CreatePatternBrush(&bmp);
}
else{
Brush.CreateSolidBrush(RGB(200,100,200));
dc.SetTextColor(RGB(220,220,220));}
pOldBrush=dc.SelectObject(&Brush);
pWnd->GetClientRect(&RC);
RECT rcn;
rcn.top=RC.top+5;
rcn.bottom=RC.bottom;
rcn.left=RC.left+5;
rcn.right=RC.right;
dc.RoundRect(&rcn,PT);
HRGN hRgn=CreateRectRgn(RC.left,RC.top,RC.right,RC.bottom);
pWnd->SetWindowRgn(hRgn,TRUE);
DeleteObject(hRgn);
pWnd->GetWindowText(Text);
dc.DrawText(Text,&RC,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
Font.DeleteObject();
Brush.DeleteObject();
dc.SelectObject(pOldFont);
dc.SelectObject(pOldBrush);
// Do not call CButton::OnPaint() for painting messages
}
第一次发帖,希望能够得到帮助,小弟感激不尽
------解决方案--------------------
AButton是你派生于CButton的类,重载PreSubclassWindow,在里面修改即可
------解决方案--------------------
你可以定义控件数据:CBUTTON* AButton[20];这么做应该没问题,但一定要是CButton的控件,如果是CRadio就不行了
------解决方案--------------------
你确定你的每次+j都是正确的地址吗?这个是关键,建议你保存一个idd的链表,链表循环不要紧
------解决方案--------------------
------解决方案--------------------
编译没错,但是运行时提示内存不能为written,
调试时发现((AButton*)GetDlgItem(IDC_BUTTON_1+j))->m_Style=1;指向了同一内存,
有什么办法解决吗?由于按钮太多,一个一个改变状态太麻烦(单个判断处理运行正常)
代码
int j=0;
while(j++<12)
{
if(...)
((AButton*)GetDlgItem(IDC_BUTTON_1+j))->m_Style=1;
else ((AButton*)GetDlgItem(IDC_BUTTON_1+j))->m_Style=2;
}
下面是按钮样式文件
void AButton::OnPaint()
{
CPaintDC dc(this); // device context for painting
CWnd* pWnd=this;
CString Text;
CRect RC;
CFont Font;
CFont *pOldFont;
CBrush Brush;
CBrush *pOldBrush;
CPoint PT(200,100);
dc.SetBkMode(TRANSPARENT);//设置背景模式为透明
Font.CreateFont(12,0,0,0,FW_HEAVY,0,0,0,ANSI_CHARSET,\
OUT_TT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,\
VARIABLE_PITCH | FF_SWISS,"MS Sans Serif");
pOldFont=dc.SelectObject(&Font);
if(m_Style==1)
{
CBitmap bmp;
bmp.LoadBitmap(IDBA_BITMAPBUT1);
Brush.CreatePatternBrush(&bmp);
}
else if(m_Style==2)
{
CBitmap bmp;
bmp.LoadBitmap(IDBA_BITMAPBUT2);
Brush.CreatePatternBrush(&bmp);
}
else if(m_Style==3)
{
CBitmap bmp;
bmp.LoadBitmap(IDBA_BITMAPBUT3);
Brush.CreatePatternBrush(&bmp);
}
else if(m_Style==4)
{
CBitmap bmp;
bmp.LoadBitmap(IDBA_BITMAPBUT4);
Brush.CreatePatternBrush(&bmp);
}
else if(m_Style==5)
{
CBitmap bmp;
bmp.LoadBitmap(IDBA_BITMAPBUT5);
Brush.CreatePatternBrush(&bmp);
}
else if(m_Style==6)
{
CBitmap bmp;
bmp.LoadBitmap(IDBA_BITMAPBUT6);
Brush.CreatePatternBrush(&bmp);
}
else{
Brush.CreateSolidBrush(RGB(200,100,200));
dc.SetTextColor(RGB(220,220,220));}
pOldBrush=dc.SelectObject(&Brush);
pWnd->GetClientRect(&RC);
RECT rcn;
rcn.top=RC.top+5;
rcn.bottom=RC.bottom;
rcn.left=RC.left+5;
rcn.right=RC.right;
dc.RoundRect(&rcn,PT);
HRGN hRgn=CreateRectRgn(RC.left,RC.top,RC.right,RC.bottom);
pWnd->SetWindowRgn(hRgn,TRUE);
DeleteObject(hRgn);
pWnd->GetWindowText(Text);
dc.DrawText(Text,&RC,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
Font.DeleteObject();
Brush.DeleteObject();
dc.SelectObject(pOldFont);
dc.SelectObject(pOldBrush);
// Do not call CButton::OnPaint() for painting messages
}
第一次发帖,希望能够得到帮助,小弟感激不尽
------解决方案--------------------
AButton是你派生于CButton的类,重载PreSubclassWindow,在里面修改即可
------解决方案--------------------
你可以定义控件数据:CBUTTON* AButton[20];这么做应该没问题,但一定要是CButton的控件,如果是CRadio就不行了
------解决方案--------------------
你确定你的每次+j都是正确的地址吗?这个是关键,建议你保存一个idd的链表,链表循环不要紧
------解决方案--------------------
------解决方案--------------------