Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ mfc图片控件在多次运行后消失_C++_Visual Studio_Mfc_Picturebox - Fatal编程技术网

C++ mfc图片控件在多次运行后消失

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

我正在使用图片控件显示四个小型彩色BMP。我有一个成员函数,可以将bmp设置为我想要的颜色。问题是,当我使用测试按钮单击功能多次运行函数SetColor时,图片控件消失,对话框行为怪异,例如拖动时没有边框。如有任何帮助或建议,将不胜感激

    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泄漏可能会导致绘制问题