rEplay!
flabra: próbowałem z Lock.. i Sizeof.. ale przy LoadResource trzeba podać nazwę ikony. I nie bardzo mi to jakoś takoś :)
W każdym razie zrobiłem tak (kod poniżej) i mam problem bo przy próbie odczytu w linijce zaznaczonej wykrzyknikami wyskakuje, że pamięć nie może być read..
void cln(char* t, int ile){// - zeruje tablice
for(int i=0;i<ile;i++)
t[i]=NULL;
}
#define TYTUL "Program"
int mb(HWND hwnd, char * co, TYTUL, int butt=MB_OK){//uproszczenie pisania MessageBox'uf
return MessageBox(hwnd,co,tytul,butt);
}
case WM_LBUTTONDOWN:{
HINSTANCE hin = (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE);
HICON hic=ExtractIcon(hin,"jakis.exe",0);
HDC hdc=GetDC(hwnd);
//DrawIcon(hdc,0,0,hic); //to rysuje ok
//DrawIcon(hdc,40,40,hic); //i to tez ok
ICONINFO icinf;
BOOL ret=GetIconInfo(hic, &icinf);
if(ret){
BITMAP bmp, bm2;
if(GetObject(icinf.hbmMask, sizeof(BITMAP), &bmp) && GetObject(icinf.hbmColor, sizeof(BITMAP), &bm2)){
fstream zapis("ikona.txt",ios::out|ios::binary);
if(!zapis){
zapis.close();
mb(hwnd,"Błąd strumienia!");
break;
}
zapis.write((char*)&bmp.bmWidth, sizeof(LONG));
zapis.write((char*)&bmp.bmHeight, sizeof(LONG));
zapis.write((char*)&bmp.bmWidthBytes, sizeof(LONG));
zapis.write((char*)&bmp.bmPlanes, sizeof(WORD));
zapis.write((char*)&bmp.bmBitsPixel, sizeof(WORD));
/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
zapis.write((BYTE*)bmp.bmBits, bmp.bmWidth * bmp.bmHeight);//sprawdzalem i nie ma roznicy czy char* czy BYTE*
/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
zapis.write((char*)&bm2.bmWidth, sizeof(LONG));
zapis.write((char*)&bm2.bmHeight, sizeof(LONG));
zapis.write((char*)&bm2.bmWidthBytes, sizeof(LONG));
zapis.write((char*)&bm2.bmPlanes, sizeof(WORD));
zapis.write((char*)&bm2.bmBitsPixel, sizeof(WORD));
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
zapis.write((char*)bm2.bmBits, bm2.bmWidth * bm2.bmHeight);//sprawdzalem i nie ma roznicy czy char* czy BYTE*
/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
zapis.close();
}
HDC dc=CreateCompatibleDC(hdc);
SelectObject(dc, icinf.hbmMask);
BitBlt(hdc,0,0,50,50,dc,0,0,SRCCOPY);
SelectObject(dc, icinf.hbmColor);
BitBlt(hdc,50,50,150,150,dc,0,0,SRCCOPY);
DeleteDC(dc);
DestroyIcon(hic);
}else{
mb(hwnd,"GetIconInfo ERROR");
}
ReleaseDC(hdc,hwnd);
}break;
//-------------------------------
case WM_RBUTTONDOWN:{
fstream odczyt("ikona.txt",ios::in|ios::binary);
if(!odczyt){
odczyt.close();
mb(hwnd,"Błąd strumienia! odczyt");
break;
}
LONG w1=0, h1=0, wb1=0, w2=0, h2=0, wb2=0;
WORD pl1=0, bp1=0, pl2=0, bp2=0;
HBITMAP hb1, hb2;
odczyt.read((char*)&w1, sizeof(LONG));
odczyt.read((char*)&h1, sizeof(LONG));
odczyt.read((char*)&wb1, sizeof(LONG));
odczyt.read((char*)&pl1, sizeof(WORD));
odczyt.read((char*)&bp1, sizeof(WORD));
BYTE *bity1=new BYTE[w1*h1];
cln(bity1, w1*h1);
odczyt.read(bity1, w1 * h1);
odczyt.read((char*)&w2, sizeof(LONG));
odczyt.read((char*)&h2, sizeof(LONG));
odczyt.read((char*)&wb2, sizeof(LONG));
odczyt.read((char*)&pl2, sizeof(WORD));
odczyt.read((char*)&bp2, sizeof(WORD));
BYTE *bity2=new BYTE[w2*h2];
cln(bity2, w2*h2);
odczyt.read(bity2, w2 * h2);
odczyt.close();
BITMAP b1;
b1.bmType =0;
b1.bmWidth =w1;
b1.bmHeight =h1;
b1.bmWidthBytes =wb1;
b1.bmPlanes =pl1;
b1.bmBitsPixel =bp1;
b1.bmBits =bity1;
BITMAP b2;
b2.bmType =0;
b2.bmWidth =w2;
b2.bmHeight =h2;
b2.bmWidthBytes =wb2;
b2.bmPlanes =pl2;
b2.bmBitsPixel =bp2;
b2.bmBits =bity2;
HDC hdc=GetDC(hwnd);
hb1=CreateBitmapIndirect(&b1);
hb2=CreateBitmapIndirect(&b2);
if(!hb1 || !hb2) mb(0,""); //testowe
HDC dc=CreateCompatibleDC(hdc);
SelectObject(dc, hb1);
BitBlt(hdc,0,50,50,50,dc,0,0,SRCCOPY);
SelectObject(dc, hb2);
BitBlt(hdc,50,0,150,150,dc,0,0,SRCCOPY);
DeleteDC(dc);
ICONINFO icinf;
icinf.fIcon=TRUE;
icinf.xHotspot=w1/2-1;
icinf.yHotspot=h1/2-1;
icinf.hbmMask=hb1;
icinf.hbmColor=hb2;
HICON hic=CreateIconIndirect(&icinf);
DrawIcon(hdc,100,50,hic);
ReleaseDC(hdc,hwnd);
delete [] bity1; bity1=0;
delete [] bity2; bity2=0;
}break;
ktoś, coś?....