PDA

View Full Version : سوال: چگونه امکان داره که در روال مربوط به دیالوگ،از یک متغیر خارجی استفاده کنیم؟



feri88
شنبه 26 اردیبهشت 1388, 21:13 عصر
سلام
چگونه امکان داره که در روال مربوط به دیالوگ،از یک متغیر خارجی استفاده کنیم؟

چون ظاهرا نمی تونیم همین متغیر خارجی رو(که قراره در داخل پردازش پیام ها از آن استفاده کنیم)به عنوان آرگومان ورودی روال بفرستیم!
با توجه به اینکه روال دیالوگ،آرگومان های ورودی از پیش تعریف شده به صورت زیر داره:

BOOL CALLBACK DlgProc (HWND, UINT, WPARAM, LPARAM) ;
چه طوری می شه که یک متغیر دیگه رو (که از جای دیگه مقدار گرفته!)به عنوان آرگومان به اون ارسال کرد؟



توضیح:
البته با فرض اینکه قرار باشه این دیالوگ رو توی یه برنامه dll فراخونی کرد!
نه یه برنامه ویندوزی که تابع winmain و روال wndproc داشته باشه،
یعنی اینکه نه خبری از رجیستر کردن کلاس ویندوز باشه و نه پیاده سازی wndproc .فقط یه دیالوگ و روال مربوط به اون باشه!
من توی برنامه های ویندوزی که توی winmain اون overhead های ثابت رو داره و تابع DialogBox توی روال wndproc فراخونی میشه و روال مربوط به دیالوگ اجرا میشه رو دیدم،البته تو نمونه برنامه هایی که من دیدم بازم نمی شد که متغیر خارجی رو وارد روال دیالوگ کرد!

ولی به هر حال می خوام ببینم چه جوری میشه این کار رو کرد؟ به خصوص اگه یه برنامه روتین ویندوزی نباشه و فقط بخوام داخل یه کد dll از تابع DialogBox و روال مربوط به اون استفاده کنم.
مرسی:لبخندساده:

Nima_NF
شنبه 26 اردیبهشت 1388, 23:16 عصر
راه های مختلفی برای این کار هست،

1- اگر قرار هست در dll باشد پیشنهاد من اسن هست که یک تابع نوشته شود مثلا SetData که با فراخوانی آن متغیر های عمومی که در داخل dll تعریف شده است قابل دسترسی شوند و مقدار دهی شوند. سپس راحت از آن ها استفاده کنید. به صورت پیش فرض می توانند همه صفر یا NULL باشند.

2- از تابع CreateDialogParam استفاده کنید و در پارامتر آخر داده را ارسال کنید، سپس در پیام مدار lparam برابر داده ارسال شده است:



typedef struct
{
BOOL isOn ;
int num;
}
DLGSTR ;

static DLGSTR data ;

hdlg = CreateDialogParam (hInstance,appName, hwnd, DlgProc, (LPARAM) &data) ;


سپس در دیالوگ:



static DLGSTR * pData ;

WM_INITDIALOG:
pData = (DLGSTR *) lParam ;


لزوما structure نباید باشد، کلا یک اشاره گر به هرچیزی.

3- روش دیگر با استفاده از SetWindowLong و GetWindowLong هست. در بخش فلگ مقدار صفر قرار دهید. حتما باید در cbWndExtra داخل WNDCLASS به DLGWINDOWEXTR مشخص شود. این روش بیشتر در پنجره ها کاربردی تر هست تا دیالوگ.