הצגת תמונה ב MFC

NORT

New member
הצגת תמונה ב MFC

אני כותב תוכנית שבא יש בשלב כולשהו צריך לטעון תמונה ע"י שימוש ב CFileDialog שבו אני בעצם מגדיר PATH שבו הקובץ עם התמונה נימצא ומציג את התמונה בתוך DIALOG כולשהו. 1.אני עושה שימוש ב BITMAP שבו אני טוען את הקובץ של התמונה, אבל אני לא מוצא ב MSDN את סוגי הקבצים שאני יכול לטעון לשם (למשל GIF,BMP ) מישהו יודע ? 2.יש דרך לטפל בגודל התמונה שאני טוען בזמן הריצה כך שלא יצא לי מהמסגרת של ה DIALOG (למשל להקטין את התמונה)? 3.האם מישהו מכיר איזה רכיב COM שאני יכול לעסות בו שימוש שיכול לבצע טעינת התמונה כשהוא מקבל PATH שמציין את מיקום התמונה?
 

yair24

Member
פעם עשיתי משהו כזה

אני מעלה לך פה קוד של מה שקורה אחרי לחיצה על כפתור BROWSE ובחירת תמונה... תראה אם זה עוזר לך:
void CDialogDlg::OnBrowse1() { CBitmap pdc; CDC* dc = m_bmp.GetDC(); // DC to the static control. // szFilters is a text string that includes two file name filters: // "*.my" for "MyType Files" and "*.*' for "All Files." char szFilters[]="MyType Files (*.bmp)|*.bmp|All Files (*.*)|*.*||"; // Create an Open dialog; the default file name extension is ".my". CFileDialog fileDlg (TRUE, "bmp", "*.bmp",OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, szFilters, this); // Display the file dialog. When user clicks OK, fileDlg.DoModal() // returns IDOK. if( fileDlg.DoModal ()==IDOK ) { pathName = fileDlg.GetPathName(); Invalidate(); CString fileName = fileDlg.GetFileTitle (); SetWindowText(pathName); } }​
 

yair24

Member
אההה רגע...

בעצם עכשיו כשהסתכלתי על התוכנית שוב גיליתי שבזמנו אני הורדתי איזה מחלקה שנקראת CPICTURE מאיזה אתר יכול להיות שמCODEGURU או CODE PROJECT נדמה לי שאת המחלקה הזאת כתב איזה פרופסור ישראלי. אני לא זוכר את השם שלו...
 

yair24

Member
מצאתי !!

http://www.codeguru.com/Cpp/G-M/bitmap/article.php/c4903/ תוריד למטה את המחלקה ותקרא את ההוראות Example & Usage 4 Dummies לא שאתה DUMMIE אבל זה הוראות טובות מה שהוא טוען שם זה שהוא חיפש הרבה זמן מחלקה שמאפשרת טעינת תמונות לתוך DIALOG ושהוא לא מצא אז הוא הכין מחלקה שעושה את זה. יאיר
 

galh

New member
תמונות "אירוטיות"? ../images/Emo3.gif

1. אאל"ט חלונות תומכת ב- bmp, jpg, gif ו- png. יכול להיות שגם ב- tiff. 2. בשביל להקטין את התמונה אתה יכול להשתמש בחבילות כמו DevIL או ב- GdiPlus. אם האיכות של הקטנת התמונה פחות חשובה אז BitBlt מסוגל לבצע הקטנת תמונה. 3. לא צריך. יש API של חלונות בשם OleLoadPicture שעושה את העבודה.
 

yair24

Member
זה עובד גם בDIALOG?

כי אני זוכר שהיתה אז בעיה של לטעון תמונה לתוך טופס שמבוסס דיאלוג...
 

galh

New member
למה שלא יעבוד?

אין קשר בין טעינת התמונה לבין הציור שלה. אתה מניח Picture box על הדיאלוג ועושה BitBlt אליו אחרי שטענת את התמונה.
 

yair24

Member
ואללה מוזר...

עכשיו כשאני בודק למה השתמשתי במחלקה הזאת אני רואה שמה שעשיתי איתה זה בעצם את הטעינה של התמונה ואחר כך השתמשתי בה כדי לקחת את המידות שלה WIDTH HEIGHT...
void CDialogDlg::OnPaint() { CPaintDC dc(this); // device context for painting if (IsIconic()) { SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { if(pathName!="") { CDialog::OnPaint(); CRect rc; pdc.Load(pathName); m_bmp.GetWindowRect(&rc); pdc.UpdateSizeOnDC(&dc); // Get Picture Dimentions In Pixels pdc.Show(&dc, CPoint(0,0), CPoint(pdc.m_Width, pdc.m_Height), 0,0); } } } void CDialogDlg::OnButton1() { int h,w; CDC* dc = m_bmp.GetDC(); // DC to the static control. CString widthstr,heightstr; FILE* fpt; h=pdc.m_Height; w=pdc.m_Width; widthstr.Format("%d",w); m_widthEdit+=widthstr; // write the width of the font. UpdateData(FALSE); heightstr.Format("%d",h); m_heightEdit+=heightstr; // write the width of the font. UpdateData(FALSE); fpt=fopen("yoyo.txt","w+"); for(int i=0;i<h;i++) { for(int j=0;j<w;j++) { if(dc->GetPixel(j,i)!=0) // white so I put 0. fputc('0',fpt); else fputc('1',fpt); } fputc('\n',fpt); } }​
הייתי יכול לעשות את זה גם בלי השימוש במחלקה הזאת?
 

galh

New member
היית יכול, אבל היית מגיע לאותו מקום

ממה שאני זוכר המחלקה CPicture עובדת עם הפונקציות של ה- OleLoadPicture ושות'.
 
למעלה