Witam,
otóż przerobiłem sobie program dodając do programu taki kod:
HBITMAP CreateBitmapMask(HBITMAP hbmColour, COLORREF crTransparent)
{
HDC hdcMem, hdcMem2;
HBITMAP hbmMask, hbmOld, hbmOld2;
BITMAP bm;
GetObject(hbmColour, sizeof(BITMAP), &bm);
hbmMask = CreateBitmap(bm.bmWidth, bm.bmHeight, 1, 1, NULL);
hdcMem = CreateCompatibleDC(NULL);
hdcMem2 = CreateCompatibleDC(NULL);
hbmOld = (HBITMAP)SelectObject(hdcMem, hbmColour);
hbmOld2 = (HBITMAP)SelectObject(hdcMem2, hbmMask);
SetBkColor(hdcMem, crTransparent);
BitBlt(hdcMem2, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);
BitBlt(hdcMem, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem2, 0, 0, SRCINVERT);
SelectObject(hdcMem, hbmOld);
SelectObject(hdcMem2, hbmOld2);
DeleteDC(hdcMem);
DeleteDC(hdcMem2);
return hbmMask;
}
i do funkcji która jest wykonywana co pewien czas
string strEmotionBmpPath;
try {
SimpleXML xml;
xml.fromXML(File("EmoPacks\\Kolobok.xml", File::READ, File::OPEN).read());
if(xml.findChild("Emoticons")) {
xml.stepIn();
while(xml.findChild("Emoticon")) {
tstring strEmotionText = Text::toT(xml.getChildAttrib("PasteText"));
if (strEmotionText.empty()) {
strEmotionText = Text::toT(xml.getChildAttrib("Expression"));
}
strEmotionBmpPath = xml.getChildAttrib("Bitmap");
if (!strEmotionBmpPath.empty()) {
if (strEmotionBmpPath[0] == '.') {
strEmotionBmpPath = "EmoPacks\\" + strEmotionBmpPath;
} else {
strEmotionBmpPath = "EmoPacks\\" + strEmotionBmpPath;
}
int rrrr=chat->getLineCount()-1;
unsigned offset;
for(int yu=chat->getFirstVisibleLine();yu<=rrrr;yu++){
tstring finder=chat->getLine(yu);
int position = finder.find(strEmotionText, offset );
try {
if(position>0)
{
HBITMAP hbmObraz;
HBITMAP hbmMaska;
BITMAP bmInfo;
HWND hwnd=chat->handle();
hbmObraz = (HBITMAP) ::LoadImage(0, Text::toT(strEmotionBmpPath).c_str(), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
//tworzymy do niej maskę
hbmMaska = CreateBitmapMask(hbmObraz, RGB(0,0,0));
//pobieramy jej wymiary i zapamiętujemy je
GetObject(hbmObraz, sizeof(bmInfo), &bmInfo);
//tworzymy rozmaite pomocnicze bufory
HDC hdc = GetDC(chat->handle());
HDC hdcNowy = CreateCompatibleDC(hdc);
GetObject(hbmObraz, sizeof(bmInfo), &bmInfo);
SelectObject(hdcNowy, hbmMaska);
if(position>30 and position<60)
BitBlt(hdc, position*4.98,(yu-chat->getFirstVisibleLine())*13, bmInfo.bmWidth, bmInfo.bmHeight, hdcNowy, 0, 0, SRCAND);
else if(position>60)
BitBlt(hdc, position*4.77,(yu-chat->getFirstVisibleLine())*13, bmInfo.bmWidth, bmInfo.bmHeight, hdcNowy, 0, 0, SRCAND);
else
BitBlt(hdc, position*4.9,(yu-chat->getFirstVisibleLine())*13, bmInfo.bmWidth, bmInfo.bmHeight, hdcNowy, 0, 0, SRCAND);
SelectObject(hdcNowy, hbmObraz);
if(position>30 and position<60)
BitBlt(hdc, position*4.98,(yu-chat->getFirstVisibleLine())*13, bmInfo.bmWidth, bmInfo.bmHeight, hdcNowy, 0, 0, SRCPAINT);
else if(position>60)
BitBlt(hdc, position*4.77,(yu-chat->getFirstVisibleLine())*13, bmInfo.bmWidth, bmInfo.bmHeight, hdcNowy, 0, 0, SRCPAINT);
else
BitBlt(hdc, position*4.9,(yu-chat->getFirstVisibleLine())*13, bmInfo.bmWidth, bmInfo.bmHeight, hdcNowy, 0, 0, SRCPAINT);
ReleaseDC(hwnd, hdc);
}
} catch(const Exception& e) {}
}
}
}
xml.stepOut();
}
} catch(const Exception& e) {}
}
}
i po włączeniu programu program działa ale po jakimś czasie(nie zawsze taki sam) wyskakuje błąd i pisze
[...]Pamięć nie może być "read"[...]
Czy ktoś może wie czym to jest spowodowane?? i jak to naprawić??