C++ mfc图片控件在多次运行后消失
我正在使用图片控件显示四个小型彩色BMP。我有一个成员函数,可以将bmp设置为我想要的颜色。问题是,当我使用测试按钮单击功能多次运行函数SetColor时,图片控件消失,对话框行为怪异,例如拖动时没有边框。如有任何帮助或建议,将不胜感激C++ mfc图片控件在多次运行后消失,c++,visual-studio,mfc,picturebox,C++,Visual Studio,Mfc,Picturebox,我正在使用图片控件显示四个小型彩色BMP。我有一个成员函数,可以将bmp设置为我想要的颜色。问题是,当我使用测试按钮单击功能多次运行函数SetColor时,图片控件消失,对话框行为怪异,例如拖动时没有边框。如有任何帮助或建议,将不胜感激 void CRLoaderDlg::SetColor(int ColorID, int PictureID) { // data structure for picture/PictureID arrangement CStatic *p
void CRLoaderDlg::SetColor(int ColorID, int PictureID) {
// data structure for picture/PictureID arrangement
CStatic *pointertopicture[4];
// check for PictureID boundary
if (PictureID < 0 || PictureID > 3) {
MessageBox("PictureID out of bounds", "Error", NULL);
return; // exit function
}
// idc_picturecontrol is the picture control id of the dialog
pointertopicture[0] = (CStatic*)GetDlgItem(IDC_PICTURECONTROL0);
pointertopicture[1] = (CStatic*)GetDlgItem(IDC_PICTURECONTROL1);
pointertopicture[2] = (CStatic*)GetDlgItem(IDC_PICTURECONTROL2);
pointertopicture[3] = (CStatic*)GetDlgItem(IDC_PICTURECONTROL3);
// handle for bitmap
HBITMAP redbmp; // color id is 0
HBITMAP orangebmp; // color id is 1
HBITMAP yellowbmp; // color id is 2
HBITMAP greenbmp; // color id is 3
HBITMAP bluebmp; // color id is 4
HBITMAP purplebmp; // color id is 5
HBITMAP whitebmp; // color id is 6
HBITMAP blackbmp; // color id is 7
HBITMAP greybmp; // color id is 8
// set handle for bitmap with function loadimage to specified image + path (path optional)
redbmp = (HBITMAP)LoadImage(NULL, "sred.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
orangebmp = (HBITMAP)LoadImage(NULL, "sorange.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
yellowbmp = (HBITMAP)LoadImage(NULL, "syellow.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
greenbmp = (HBITMAP)LoadImage(NULL, "sgreen.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
bluebmp = (HBITMAP)LoadImage(NULL, "sblue.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
purplebmp = (HBITMAP)LoadImage(NULL, "spurple.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
whitebmp = (HBITMAP)LoadImage(NULL, "swhite.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
blackbmp = (HBITMAP)LoadImage(NULL, "sblack.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
greybmp = (HBITMAP)LoadImage(NULL, "sgrey.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
// function to set bitmap image to handle of image
if (ColorID == 0) pointertopicture[PictureID]->SetBitmap(redbmp);
else if (ColorID == 1) pointertopicture[PictureID]->SetBitmap(orangebmp);
else if (ColorID == 2) pointertopicture[PictureID]->SetBitmap(yellowbmp);
else if (ColorID == 3) pointertopicture[PictureID]->SetBitmap(greenbmp);
else if (ColorID == 4) pointertopicture[PictureID]->SetBitmap(bluebmp);
else if (ColorID == 5) pointertopicture[PictureID]->SetBitmap(purplebmp);
else if (ColorID == 6) pointertopicture[PictureID]->SetBitmap(whitebmp);
else if (ColorID == 7) pointertopicture[PictureID]->SetBitmap(blackbmp);
else if (ColorID == 8) pointertopicture[PictureID]->SetBitmap(greybmp);
}
// run SetColor function 50 times
void CRLoaderDlg::OnBnClickedButtonTest() {
for (int i = 0; i < 50; i++) {
for (int c = 0; c < 9; c++) {
for (int p = 0; p < 4; p++) {
SetColor(c, p);
}
}
}
}
void CRLoaderDlg::SetColor(int-ColorID,int-PictureID){
//picture/PictureID排列的数据结构
CStatic*指针式结构[4];
//检查PictureID边界
如果(图片ID<0 | |图片ID>3){
MessageBox(“PictureID超出范围”、“错误”、NULL);
return;//退出函数
}
//idc_picturecontrol是对话框的图片控件id
pointertopicture[0]=(CStatic*)GetDlgItem(IDC_PICTURECONTROL0);
pointertopicture[1]=(CStatic*)GetDlgItem(IDC_PICTURECONTROL1);
pointertopicture[2]=(CStatic*)GetDlgItem(IDC_PICTURECONTROL2);
pointertopicture[3]=(CStatic*)GetDlgItem(IDC_PICTURECONTROL3);
//位图句柄
HBITMAP redbmp;//颜色id为0
HBITMAP orangebmp;//颜色id为1
HBITMAP yellowbmp;//颜色id为2
HBITMAP greenbmp;//颜色id为3
HBITMAP bluebmp;//颜色id为4
HBITMAP purplebmp;//颜色id为5
HBITMAP whitebmp;//颜色id为6
HBITMAP blackmp;//颜色id为7
HBITMAP greybmp;//颜色id为8
//将具有函数loadimage的位图句柄设置为指定的图像+路径(路径可选)
redbmp=(HBITMAP)LoadImage(NULL,“sred.bmp”,IMAGE\u位图,0,0,LR\u LOADFROMFILE);
orangebmp=(HBITMAP)LoadImage(NULL,“sorange.bmp”,图像\u位图,0,0,LR\u LOADFROMFILE);
yellowbmp=(HBITMAP)LoadImage(NULL,“syellow.bmp”,IMAGE\u位图,0,0,LR\u LOADFROMFILE);
greenbmp=(HBITMAP)LoadImage(NULL,“sgreen.bmp”,IMAGE\u位图,0,0,LR\u LOADFROMFILE);
bluebmp=(HBITMAP)LoadImage(NULL,“sblue.bmp”,IMAGE\u位图,0,0,LR\u LOADFROMFILE);
purplebmp=(HBITMAP)LoadImage(NULL,“spurple.bmp”,IMAGE\u位图,0,0,LR\u LOADFROMFILE);
whitebmp=(HBITMAP)LoadImage(NULL,“swhite.bmp”,IMAGE\u位图,0,0,LR\u LOADFROMFILE);
blackmp=(HBITMAP)LoadImage(NULL,“sblack.bmp”,IMAGE\u位图,0,0,LR\u LOADFROMFILE);
greybmp=(HBITMAP)LoadImage(NULL,“sgrey.bmp”,IMAGE\u位图,0,0,LR\u LOADFROMFILE);
//函数设置位图图像以处理图像
if(ColorID==0)pointertopicture[PictureID]->SetBitmap(redbmp);
else if(ColorID==1)pointertopicture[PictureID]->SetBitmap(orangebmp);
else if(ColorID==2)pointertopicture[PictureID]->SetBitmap(yellowbmp);
else if(ColorID==3)pointertopicture[PictureID]->SetBitmap(greenbmp);
else if(ColorID==4)pointertopicture[PictureID]->SetBitmap(bluebmp);
else if(ColorID==5)pointertopicture[PictureID]->SetBitmap(purplebmp);
else if(ColorID==6)pointertopicture[PictureID]->SetBitmap(whitebmp);
else if(ColorID==7)pointertopicture[PictureID]->SetBitmap(BlackMP);
else if(ColorID==8)pointertopicture[PictureID]->SetBitmap(greybmp);
}
//运行SetColor函数50次
void CRLoaderDlg::OnBnClickedButtonTest(){
对于(int i=0;i<50;i++){
对于(int c=0;c<9;c++){
对于(int p=0;p<4;p++){
SetColor(c,p);
}
}
}
}
您有GDI资源泄漏,因为您没有删除旧位图。
使用DeleteObject
删除它们。
SetBitmap
返回旧的HBITMAP
,因此,如果旧的HBITMAP
不是NULL
,您可以删除它
正如您所观察到的,当您没有可用的GDI资源时,GDI泄漏可能会导致绘制问题。您有GDI资源泄漏,因为您没有删除旧位图。 使用
DeleteObject
删除它们。
SetBitmap
返回旧的HBITMAP
,因此,如果旧的HBITMAP
不是NULL
,您可以删除它
正如您所观察到的,当您没有可用的GDI资源时,GDI泄漏可能会导致绘制问题