View Full Version : سوال: نحوه گذاشتن عکس در یک دیالوگ
feri88
دوشنبه 18 خرداد 1388, 20:52 عصر
سلام
من یه پروژه MFC دارم که توی دیالوگش می خوام یه عکس بذارم، ولی وقتی یه picture control می ذارم توی دیالوگ، نمی دونم اون عکسه رو چه جوری باید بذارم؟
البته توی properties اش، یه بخشی به نام Image داره، ولی اون بخش غیر فعاله و نمی تونم اسم عکسم رو اونجا بنویسم!
لطفا راهنمایی کنید که چی کار باید بکنم؟
در ضمن اگه می شه، شکل دستورش که توی فایل .rc ایجاد میشه رو هم بذارید.
هم چنین می خوام که عکس فایل exe ی MFC که شکل سه تا مکعب روی هم هستش رو با عکس خودم عوض کنم، برای این منظور چی کار باید بکنم؟
مرسی
Nima_NF
دوشنبه 18 خرداد 1388, 23:25 عصر
برای مورد اول، زیر قسمت image در properties که غیر فعال هست، گزینه type وجود دارد در آن گزینه Bitmap را انتخاب کنید تا image فعال شود. (باید عکس bmp را به صورت resource با یک ID اضافه کرده باشید تا قابل انتخاب شدن باشد)
برای سایر فرمت های باید از کدنویسی و کنترل سفارشی ساخت خودتان استفاده کنید.
هم چنین می خوام که عکس فایل exe ی MFC که شکل سه تا مکعب روی هم هستش رو با عکس خودم عوض کنم، برای این منظور چی کار باید بکنم؟
یک آیکن با پسوند و قوانین لازم اندازه های آن را به صورت resource به برنامه اضافه کنید و سپس در فایل resource.h آن را با پایین ترین شماره بین سایر آیکن ها تعرفی کنید مثلا:
#define IDR_MAINFRAME 2
در قسمت سازنده برنامه شما چیزی شبیه کد زیر تعریف شده است تا آن را لود کند، آن را تغییر دهید به ID آیکن شما:
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
برای دیالوگ ها، در قمست OnInitDialog با SetIcon این آیکن برای دیالوگ ها ست می شود.
حسین محمدی
سه شنبه 19 خرداد 1388, 10:02 صبح
من یک مثال براتون می آورم.
در فایل Sample.rc
CONTROL "",IDC_PICTURE1,"Static",SS_BITMAP,119,15,15,13
در فایل SampleDlg.h و در کلاس CSampleDlg
CStatic m_Picture;
در فایل SampleDlg.cpp
void CSampleDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAOTBLOBDlg)
DDX_Control(pDX, IDC_PICTURE1, m_Picture);
//}}AFX_DATA_MAP
}
void CSampleDlg::OnBtnLoadFromFile()
{
HBITMAP hImage = NULL;
CFileDialog dlgFile ( TRUE, NULL, NULL,
OFN_HIDEREADONLY,
_T("Bitmap Files (*.bmp)|*.bmp||"),
this );
dlgFile.m_ofn.lpstrTitle = "Select Bitmap file...";
// dlgFile.m_ofn.lpstrInitialDir = "c:\\Bitmaps";
// If user selects a file then upload it to picture.
if ( IDOK != dlgFile.DoModal() ) return;
CString m_strPictureName = dlgFile.GetPathName();
// Load image.
hImage = (HBITMAP) LoadImage( AfxGetInstanceHandle(),
m_strPictureName,
IMAGE_BITMAP,
0,
0,
LR_LOADFROMFILE );
if ( !hImage )
{
AfxMessageBox("Failed to load image.");
UpdateButtonState();
return;
}
// Hook image to picture control.
m_Picture.SetBitmap( hImage );
UpdateButtonState();
}
feri88
سه شنبه 19 خرداد 1388, 13:00 عصر
سلام
من نمی دونم چرا هر کاری می کنم، نمی تونم یه عکس بچسبونم به دیالوگ!!
من به ترتیب این کارها رو انجام دادم:
اول اومدم با Add Resource یه bitmap رو Import کردم(عکس مورد نظرم رو به پسوند bmp تبدیل کردم و اونو توی فولدر res از پروژه قرار دادم و مثل شکل پایین import اش کردم)
ولی این فایل بعد از اضافه شدن، توی solution explorer ظاهر نشد(یعنی mypicture.bmp رو توی solution explorer ندیدم!)
http://i44.tinypic.com/sg6f5l.jpg
من فقط می خوام این عکس مثل یه آرم به دیالوگم بچسبه!
بعد اومدم یه picture control به دیالوگ اضافه کردم و type اون رو bitmap انتخاب کردم و ID اش رو IDC-PICTURE1 کردم، توی کد rc دقیقا این خط ظاهر شد.
CONTROL "",IDC_PICTURE1,"Static",SS_BITMAP,119,15,15,13
بعد اومدم اسم عکسم رو (mypicture.bmp ) توی بخش Image نوشتم.
ولی هیچ اتفاقی نیفتاد (یعنی عکس مورد نظرم رو توی picture control ندیدم!)
در ضمن در مورد اون کدی که آقای حسین محمدی گذاشتند که مربوط به لود کردن عکس هست، راستش چیزی متوجه نشدم، می خواستم بپرسم که آیا لازمه که من حتما این کدها رو به sampledlg.cpp اضافه کنم؟
و آیا نیازه که یه متغیر به نام m_picture به کنترل اختصاص بدم؟
آخه من فقط می خوام یه عکس توی دیالوگم ظاهر بشه، همین.
در مورد سوال دومم، آیا میشه یه عکس از نوع مثلا bmp رو به جای اون شکل سه تا مکعب گذاشت؟
در این مورد هم من اومدم پسوند عکسم رو ico کردم و اون رو از طریق Add Resource و Icon به پروژه Import کردم، یعنی new نکردم ولی بازم اتفاقی نیفتاد!
ببخشید می دونم سوالم خیلی پیش پا اقتاده اس، ولی با این حال تا حالا موفق نشدم یه عکس به یه دیالوگ اضافه کنم!
خیلی ممنون می شم اگه دوباره راهنماییم کنید و بگید کجا اشتباه می کنم.
Nima_NF
سه شنبه 19 خرداد 1388, 14:52 عصر
پسوند عکسم رو ico کردماین ها فرمت هستند نه فقط یک پسوند.
شما باید با نرم افزارهای طراحی icon عکس مورد نظر را کوچک کنید و با توجه به سیستم عامل فرمت ico را تولید کنید (سایز ها 16x16 / 32x32 / 64x64 با رنگ های مختلف و ... تا استاندارد و قابل استفاده باشد)
برای bmp هم همین طور. شما باید با paint یا photoshop عکس خود را به bmp تبدیل کنید، نه با تغییر پسوند.
بعد اومدم اسم عکسم رو (mypicture.bmp ) توی بخش Image نوشتم.
همانطور که در پست قبل گفتم، وقتی عکس bmp را import کردید باید در resource view دیده شود. بعد از آن، اصلا نیاز نیست کدهای rc را تغییر دهید، همه چیز در همان properties است. type را روی image قرار دهیدو پس باید ID آن را (نه اسم فایل را) در properties در قسمت image انتخاب کنید.
در ضمن در مورد اون کدی که آقای حسین محمدی گذاشتند که مربوط به لود کردن عکس هست، راستش چیزی متوجه نشدم، می خواستم بپرسم که آیا لازمه که من حتما این کدها رو به sampledlg.cpp اضافه کنم؟
و آیا نیازه که یه متغیر به نام m_picture به کنترل اختصاص بدم؟این کدهایی که برای شما گذاشتند روش نمایش عکس در نقطه دلخواه از دیالوگ هست، بدون picture control، بلکه با کدنویسی.
feri88
چهارشنبه 20 خرداد 1388, 19:13 عصر
سلام
خیلی ممنون از راهنمایی های خوبتون
بالاخره موفق شدم یک عکس به دیالوگ بچسبونم!
حالا سوالم اینه که چه جوری میشه سایز این عکس رو توی خود دیالوگ تغییر داد؟
بعد از اینکه من عکس رو توی دیالوگ انتخاب می کنم، از گوشه هاش نمی تونم سایزش رو تغییر بدم.
خاصیت real image size هم false هستش، ولی بازم نمی شه سایزش رو تغییر داد!
در مورد اون کدهایی هم که آقای حسین محمدی زحمتش رو کشیدن، کنجکاو شدم که این کدها رو هم امتحان کنم،
یعنی اومدم یه picture control به دیالوگ اضافه کردم و متغیر m_picture رو بهش اختصاص دادم و بعد کد مربوط به تابع CSampleDlg::OnBtnLoadFromFile رو به فایل SampleDlg.cpp اضافه کردم و الگوی اون رو هم داخل کلاس فایل SampleDlg.h تعریف کردم، ولی چند تا ارور داد که اونا رو می ذارم، از طرفی سوالم اینه که رویداد مربوط به این تابع چیه؟
یعنی اینکه با انجام چه رویدادی، محتویات این تابع اجرا میشه؟
چون مثلا وقتی ما یه دکمه یا یه کنترل کادر ویرایشی به دیالوگ اضافه می کنیم، رویدادهایی مثل BTN-CLICKED و EN-CHANGE و ... می تونیم بهشون اختصاص بدیم که به محض رخداد این event ها، تابع مربوط به اونها در فایل SampleDlg.cpp اجرا بشه!
ولی اینجا ما چیزی توی دیالوگ نداریم که تابع متناظر با اون، CSampleDlg::OnBtnLoadFromFile باشه!
پس چه طوری این تابع صدا زده میشه و محتویاتش اجرا میشه؟
اینم اون ارورهایی که موقع کامپایل دیدم:
SampleDlg.cpp
d:\ SampleDlg.cpp(174) : error C2665: 'AfxMessageBox' : none of the 2 overloads could convert all the argument types
e:\program files\microsoft visual studio 9.0\vc\atlmfc\include\afxwin.h(5372): could be 'int AfxMessageBox(LPCTSTR,UINT,UINT)'
e:\program files\microsoft visual studio 9.0\vc\atlmfc\include\afxwin.h(5374): or 'int AfxMessageBox(UINT,UINT,UINT)'
while trying to match the argument list '(const char [22])'
d:\ SampleDlg.cpp(175) : error C3861: 'UpdateButtonState': identifier not found
d:\ SampleDlg.cpp(180) : error C2065: 'm_Picture' : undeclared identifier
d:\ SampleDlg.cpp(180) : error C2228: left of '.SetBitmap' must have class/struct/union type is ''unknown-type''
d:\ SampleDlg.cpp(181) : error C3861: 'UpdateButtonState': identifier not found
Sample- 5 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
با تشکر
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.