[ statquos @ 25.06.2008. 10:30 ] @
kako napraviti da program prečita datoteku i prikaze sliku

naprimkjer: c:\slika\slika.jpg

to sliku prikaze u dialogu
[ deerbeer @ 25.06.2008. 11:26 ] @
Ucitavas sliku sa LoadImage - za JPG slike moras imati posebnu biblioteku jer ova funkcija cita samo BMP-ove ...
Code:

HBITMAP hBitMap = (HBITMAP)::LoadImage(0, "c:\\mojaslika.bmp",IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);


Sledeci korak je da napravis CBitmap objekat od ucitane bitmape(hBitMap) ..
Code:

if (hBitMap) 
{
  CBitmap bmp;
   bmp.Attach(hBitMap); 
   
   Invalidate() ; 

}


Invalidate() metoda sluzi da bi naterao svoj prozor da se iscrta ponovo cim ucitas bitmapu
tj. poziva se OnPaint metoda gde ces obaviti crtanje uz pomoc GDI funkcija ...

U OnPaint metodi :
Code:

  
  // kostrukcija device contexta pomocu kojeg crtas po prozoru .
  CPaintDC dc (this) ; 
  
  //uzmi strukturu u kojoj se nalaze informacije od bitmape (sirina,visina ..itd..) 
  BITMAP bmpInfo;
  bmp.GetBitmap(&bmpInfo); 

  UINT nWidth = bmpInfo.bmWidth ; 
  UINT nHeight = bmpInfo.bmHeight ;  

   //pravis memorijsku  kopiju device -contexta (CDC) u koju ces da smestis tvoju bitmapu 
   CDC memDC ; 
   memDC.CreateCompatibleDC(&dc) ; 
   
   //ucitas bitmapu u kopiju CDC-a  
   memDC.SelectObject(&bmp) ; 

   //Najzad iskopiras bitmapu na tvoj prozor .... 
   dc.BitBlt(0,0,nWidth ,nHeight,&memDC,0,0,SRCCOPY) ; 

   memDC.DeleteDC() ; 
   
}

[ statquos @ 25.06.2008. 17:03 ] @
kako bi napravio da bi program prečitao mapu dje su slike in prikazuje sve slike u dialogu...

npr: mapa: C:\slike
u mapi imam više slika: slika1.bmp, slika2.bmp, slika3.bmp


[Ovu poruku je menjao statquos dana 25.06.2008. u 20:00 GMT+1]
[ deerbeer @ 26.06.2008. 09:10 ] @
Ako sam te dobro razumeo dodaj na dijalog dugme Browse ili tako nesto
koje ce otvarati File Open Dialog gde ces moci da izaberes vise slika koje zelis da prikazujes :
Za tu priliku dodaj CStringList promenljivu u tvoj Dialog class koja ce cuvati putanje slika iz odabranog foldera

Na Browse button click :
Code:

static wchar_t  szFilter[] = _T("Bitmap (.bmp) |*.bmp|);  
static wchar_t szNameBuffer[10000];
szNameBuffer[0]= 0 ; 

DWORD dwOpenFlags = OFN_PATHMUSTEXIST | OFN_ALLOWMULTISELECT | OFN_HIDEREADONLY | OFN_EXPLORER ; 
                            
CFileDialog dlg(TRUE,NULL,NULL,dwOpenFlags  ,szFilter,this) ; 
dlg.m_ofn.lpstrTitle = _T("Select image(s)") ; 
dlg.m_ofn.lpstrFile = szNameBuffer ; 
dlg.m_ofn.nMaxFile = 10000 ;  
INT_PTR nResult = dlg.DoModal() ; 

if ( nResult == IDOK) 
{
   POSITION ps = dlg.GetStartPosition() ; 
    while (ps != NULL)
    {
        CStringList m_pFileList ; // dodaj ovo kao promeljivu tvoje Dialog klase ... 
        CString strFilePath = dlg.GetNextPathName(ps); 
        m_pFileList.AddTail(strFilePath) ; //dodajes izabrane putanje u listu
                                
    }
}


Kad pokupis putanje slika koje izaberes i smestis ih u listu onda ti ostaje da ih prikazujes redom :
Mozes dodati jos neke dugmice za navigaciju (Napred >> ) i (<< Nazad) da bi mogao da listash tj. prikazujes slike redom :

Code:

//prva slika u listi ..
CString strImageFile =  m_pFileList.FindIndex(0);  
HBITMAP hBitMap = (HBITMAP)::LoadImage(0, strImageFile,IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
// pa onda ide kod iz prethodnog posta ... 

[ statquos @ 26.06.2008. 19:02 ] @
to bi mi trebao da bi automatski čitao cijeli direktorij... bez gumba
npr: da imam slike u mapi C:\slike
i bi mi prikazivao sve slike koje so u mapi "slike"
[ deerbeer @ 26.06.2008. 22:00 ] @
Code:

void GetDirFiles (CString& strDirectory) 
{

HANDLE hFile = NULL; 
WIN32_FIND_DATA fd ; 

CStringList  m_pFileList; 
CString strFile = _T("*.bmp") ; 
        
hFile =  FindFirstFile(strDirectory + strFile,&fd) ;
CString strFullName ; 

do 
{
    LPCTSTR lpszFile = fd.cFileName ; 
    if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) 
    {
       CString strFileName = fd.cFileName ; 
       strFullName = strDirectory + strFileName ; 
       m_pFileList.AddTail(strFullName) ; //dodajes u tvoju listu fajlova .. 
    }
}
while (FindNextFile(hFile,&fd)) ;     
FindClose(hFile) ; 

}

Ova funkcija ti popunjava listu fajlova za sve bitmape u datom direktorijumu
[ Eurora3D Team @ 29.06.2008. 12:04 ] @
@deerbeer lep tutorijal
Cestitam kolega :) .... svaka cast
[ deerbeer @ 29.06.2008. 14:14 ] @
Funkcija GetDirFiles se moze i dopuniti sa dijalogom "Browse for folder"

Code:


CString  BrowseForFolder (HWND hWndParent )
{
  //putanja izabranog direktorijuma 
  TCHAR path[MAX_PATH];
  CString strDir ;

  //struktura browseinfo u kojoj se definisu opcije za diajlog ...       
  BROWSEINFO bi = { 0 };
  bi.pszDisplayName = path;

  // parent prozor ili forma koja otvara BrowseForFolder dijalog 
  bi.hwndOwner = hWndParent
  
  // glavne opcije -flagovi za filtriranje foldera u dijalogu 
  bi.ulFlags = BIF_RETURNONLYFSDIRS ; 
  // moguce opcije su jos BIF_BROWSEFORCOMPUTER ,BIF_BROWSEFORPRINTER, BIF_BROWSEINCLUDEFILES, BIF_EDITBOX itd ... 

   bi.lpszTitle = _T("Browse for folder") ; 
    
   LPITEMIDLIST pidl = SHBrowseForFolder (&bi);
   if (pidl) 
   { 
      if (SHGetPathFromIDList (pidl,path ) )
         strDir = path ; 
   
     //clean up .... 
     IMalloc * imalloc = 0;
     if ( SUCCEEDED( SHGetMalloc ( &imalloc )) )
     {
         imalloc->Free (pidl);
         imalloc->Release ();
     }
  }
  return strDir ; 
  
}

//ako se koristi MFC-ova CWnd ili CDialog klasa za prozor.. 
  HWND hWndOwner = this->GetSafeHwnd() ; 
  CString strDir = BrowseForFolder (hWndOwner) ; 
  if (!strDir.IsEmpty())
       GetDirFiles(strDir) ; 


[ Eurora3D Team @ 30.06.2008. 01:02 ] @
U fajlu sa linka je MFC program sa ovim kodom koji je napisao @deerbeer ... i ja sam dodao ponesto (iscrtavanje svih slika i skrolovanje)
http://eurora3d.com/es/PictureDialog.zip