Zapisywanie ikon do pliku. API C++ uuyndouus

0

V-tam!

Robię program do zapisu zawartości płyt, dysków, katalogów.. I chciałbym, aby przy przeglądzie zapisanej struktury folderów i plików były pokazywane ikony jakie są dla nich wyświetlane w momencie zapisu. Pobieranie ikon (uchwyty, indeksy z listy systemowej..) mam zrobione (z ikonami dysków nie) i chciałbym uzyskane tak ikony ZAPISAĆ DO PLIKU. No i mam skomplikowane pytanie: JAK?

0

LockResource() + SizeofResource()

0

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, &amp;icinf);
			if(ret){
				BITMAP bmp, bm2;
				if(GetObject(icinf.hbmMask, sizeof(BITMAP), &amp;bmp) &amp;&amp; GetObject(icinf.hbmColor, sizeof(BITMAP), &amp;bm2)){
					fstream zapis("ikona.txt",ios::out|ios::binary);
					if(!zapis){
						zapis.close();
						mb(hwnd,"Błąd strumienia!");
						break;
					}
					zapis.write((char*)&amp;bmp.bmWidth, sizeof(LONG));
					zapis.write((char*)&amp;bmp.bmHeight, sizeof(LONG));
					zapis.write((char*)&amp;bmp.bmWidthBytes, sizeof(LONG));
					zapis.write((char*)&amp;bmp.bmPlanes, sizeof(WORD));
					zapis.write((char*)&amp;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*)&amp;bm2.bmWidth, sizeof(LONG));
					zapis.write((char*)&amp;bm2.bmHeight, sizeof(LONG));
					zapis.write((char*)&amp;bm2.bmWidthBytes, sizeof(LONG));
					zapis.write((char*)&amp;bm2.bmPlanes, sizeof(WORD));
					zapis.write((char*)&amp;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*)&amp;w1, sizeof(LONG));
			odczyt.read((char*)&amp;h1, sizeof(LONG));
			odczyt.read((char*)&amp;wb1, sizeof(LONG));
			odczyt.read((char*)&amp;pl1, sizeof(WORD));
			odczyt.read((char*)&amp;bp1, sizeof(WORD));

			BYTE *bity1=new BYTE[w1*h1];
			cln(bity1, w1*h1);

			odczyt.read(bity1, w1 * h1);

			odczyt.read((char*)&amp;w2, sizeof(LONG));
			odczyt.read((char*)&amp;h2, sizeof(LONG));
			odczyt.read((char*)&amp;wb2, sizeof(LONG));
			odczyt.read((char*)&amp;pl2, sizeof(WORD));
			odczyt.read((char*)&amp;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(&amp;b1);
			hb2=CreateBitmapIndirect(&amp;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(&amp;icinf);

			DrawIcon(hdc,100,50,hic);
			ReleaseDC(hdc,hwnd);
			delete [] bity1; bity1=0;
			delete [] bity2; bity2=0;
		}break;

ktoś, coś?....

0

SORRY!
przy wykrzyknikach nie dałem dwóch // jest jeden /

i dlaczego jest tyle niebieskiego?? :)
mea culpa, mea culpa, mea maxima culpa

1 użytkowników online, w tym zalogowanych: 0, gości: 1