PDA

View Full Version : سوال: مشکل در بکارگیری Handle



[REVEX]
شنبه 19 بهمن 1387, 20:02 عصر
با سلام
مشکل من در بار گیری Handle میباشد
هنگامی کلیک تابع readsqmeter از IDC_EDIT2 رشته رو میخونه و توی IDC_EDIT3 کپی میکنه و توی MessageBox نشون میده ولی وقتی توی تابع استفاده میشه جواب نمیده.
مشکل در بکارگیری Handle هست.
با تشکر




void readsqmeter(HWND hWin)
{
char szName[256];
GetDlgItemText(hWin,IDC_EDIT2,szName,10);
SetDlgItemText(hWin, IDC_EDIT3,szName);
MessageBox(hWin,szName,"About",MB_ICONINFORMATION);
}

void CYardConvertorDlg::OnOK()
{
HWND hWin;
readsqmeter(hWin);

}

Nima_NF
شنبه 19 بهمن 1387, 20:54 عصر
اگر از MFC استفاده می کنید به سبک کد win32 ننویسید. در MFC اگر در دیالوگ کنونی تابع را می فرستید نیاری به پارامتر اول نیست.
در win32 پارامتر HWND باید هندل پنجره کنونی شما باشد در حالی که شما خالی به تابع می فرستید.

پس در MFC برای پنجره یا دیالوگ کنونی:



SetDlgItemText(IDC_EDIT1,"your text");

[REVEX]
یک شنبه 20 بهمن 1387, 08:13 صبح
با تشکر بابت پاسخ
من در ابتدا به شکلی که شما فرموید نوشتم ولی با مشکل مواجه شدم.
در صورتی که بدون استفاده از تابع نوشته بشه ، درسته و جواب میده.


void CYDCDlg::OnOK()
{
char szName[256];
GetDlgItemText(IDC_EDIT1,szName,10);
SetDlgItemText( IDC_EDIT3,szName);
MessageBox(szName,"About",MB_ICONINFORMATION);
}

ولی اگر در غالب یک تابع نوشته بشه با پیغام زیر مواجه میشه


'GetDlgItemTextA' : function does not take 3 parameters
و حتما باید سه پارامتر داشته باشد



void readsqmeter()
{
char szName[256];
GetDlgItemText(IDC_EDIT1,szName,10);
SetDlgItemText( IDC_EDIT3,szName);
MessageBox(szName,"About",MB_ICONINFORMATION);
}
void CYDCDlg::OnOK()
{
readsqmeter();
}

Cave_Man
یک شنبه 20 بهمن 1387, 15:43 عصر
پسر خوب این تابع شما void readsqmeter از نوع member function ها نیست.پس بیاید و از تابع AfxMessageBox استفاده کنید.

با اجازه آقا نیمای گل. <خجالت>

Cave_Man
یک شنبه 20 بهمن 1387, 16:21 عصر
اگه هنوز میخای از تابع MessageBox در اون تابع استفاده کنی باید اولا یه اشاره گر به پنجره جاری با تابع ارسال کنی.ثانیا باید هندل رو از نوع LPVOID و بعدا تبدیل کست کنی CAST


void readsqmeter(LPVOID hWin)
{
char szName[255];
strcpy(szName,"SALAM");

CYCDlg*handle=(CYCDlg*) hWin;

handle->MessageBox(szName,"About",MB_ICONINFORMATION);

}


void CYCDlg::OnOK()
{
readsqmeter(this);

}

[REVEX]
یک شنبه 20 بهمن 1387, 17:39 عصر
ممنونم Cave_Man
هدف یادگیری بود که با لطف شما و Nima_NF حل شد.

Nima_NF
یک شنبه 20 بهمن 1387, 17:55 عصر
همانطور که Cave_Man گفتند تابع شما عضو کلاس نیست، پس برای این کار این تابع را عضوی از کلاس دیالوگ مورد نظر شما تعریف کنید تا بداند تابع مورد نظر از MFC استفاده می کند.

اگر نمی خواهید عضو کلاس باشد از this استفاده کنید.
البته اگر کدی که جناب Cave_Man در بالا گذاشتند به شکل زیر بنویسید کافی است.
یعنی با this شیئی از دیالوگ بفرستید و سپس مستقیم از هندل HWND مربوط به دیالوگ که در متغیر m_hWnd هست استفاده کنید. یعنی هر جا در کلاس که خواستید m_hWnd را فراخوانی کنید:




void CYDCDlg::OnOK()
{
readsqmeter( this );
}

void readsqmeter(CWnd *hwnd)
{
char szName[256];
hwnd->GetDlgItemText(IDC_EDIT1,szName,10);
hwnd->SetDlgItemText( IDC_EDIT3,szName);
hwnd->MessageBox(szName,"About",MB_ICONINFORMATION);
}