سلام آقای ریئسی قبل اینکه سوالمو بپرسم بابت تدوین این مجموعه آموزشی ازتون تشکرمیکنم
الان مشکلی که دارم اینکه البته لازمه بگم که میکرویی که استفاده کردم stm32است و از ramخارجی هم استفاده میکنم
با نرم افزار GUIBuilderسه تا pageساختم که pageاول دوتا دکمه داره که به کمک دکمه ها بین pageها حرکت میکنه
ازRTXهم استفاده نمیکنم داخل تابع mainودرداخل حلقه whileیه برنامه ساده نوشتم
while(1)
{
page1=1;
if(page1==1)
{
CreateWindow1();
while(page1==1)
{
GUI_Exec();
if(page2==1)
{
CreateWindow2();
while(page2==1)
{
GUI_Exec();
}
}
if(page3==1)
{
CreateWindow3();
while(page3==1)
{
GUI_Exec();
}
}
}
}
همون طورکه میبینید برای رفتن به pageدوم داخل کد سی که از pageاول داشتم داخل دکمه اول یه متغییر رو یک میکنم سپس شرط اول درست میشه و pageدوم ساخته میشه
مشکل اینجاست که با این برنامه pageهای مختلف ایجاد میشه واین موضوع باعث میشه حافظهramپرمیشه و برنامه هنگ میکنه و همه چی از کار میافته
راهنمای emwinاون طورکه من فهمیدم میگه باید قبل از ایجاد صفحه جدید صفحه قبلی بسته بشه
چهارتا تابع معرفی شده
GUI_CreateDialogBox()
GUI_ExecCreatedDialog()
GUI_ExecDialogBox()
GUI_EndDialog()
الان با تابع چهارم چطور و کجا باید فراخوانی بشه تا صفحه ای که باز شده بسته بشه
وبا کدوم تابع باید دوباره صفحه رو ایجاد کرد
void GUI_EndDialog(WM_HWIN hDialog, int r);
الان تو این تابع آرکومان های اول چی باید باشن
ممنون میشم راهنمایی کنید گیج شدم
- - - Updated - - -
آرگومان اول و دوم این تابع چی باید باشه
تویه مثال داخل راهنمای emwinآرگومان دوم این تابع بعضی وقت ها صفر است و در حای دیگر یک شده
case WM_KEY:
switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key) {
case GUI_ID_ESCAPE:
GUI_EndDialog(hWin, 1);
break;
case GUI_ID_ENTER:
GUI_EndDialog(hWin, 0);
break;
}
break;
سلام.برای جلوگیری از پرشده حافظه نباید پنجره ها رو دوباره بسازید.دو راه دارید:
1. چک کنید اگه پنجره قبلا ساخته شده .اول اون رو حذف کنید( با دستور WM_Delete ) و مجددا پنجره رو بسازید.
2. پنجره رو فقط یک بار بسازید و وقتی بهش نیاز ندارید hide کنید و وقتی نیاز دارید show کنید.
Hardware & Software designer
Telegram:@y_r_z
با سلام خدمت دوستان عزبز بالاخص جناب آقای رییسی.
من برد lpc1788 ewb rev4.0 و lcd 7 inch و touch مقاومتیش خریداری کردم والبته یک سال پیش هم cd آموزشیتون رو هم تهیه کرده بودم.
همه مثالها کامپایل و دیباگ و پروگرم میشن و lcd هم کار میکنه ولی touch تو هیچ کدوم از مثالها کار نمیکنه.
بعد از مطالعه مطالب این انجمن طبق فرمایشاتتون توی مثال LPC1788-RTX for 4pin touch تغییرات 2 هدر فایل GUI_X_Touch_Analog.c و Touch_Cal.c رو اعمال کردم ولی باز هم تاچ کاره نکرد که کالیبره بشه.
آیسی تاچ روی بورد ADS7846 هست که فکر نکنم ربطی داشته باشه.
لطفا راهنمایی بفرمایید.
فایل پیوست 9544
فایل پیوست 9545
فایل پیوست 9546
سلام دوباره.آقا مشکل من هم حل شد.اگه عکس اول که آپلود کرده بودم رو زوم کنید متوجه میشید که تاچ و سوکتش رو برعکس زده بودم که اشتباه بود و با نصب صحیح به خوبی کار کرد.آخه دفعه اولم بود با تاچ کار میکردم.
در ضمن هیچ تغییراتی در برنامه داخل CD آموزش EMWIN ندادم و عینا کامپایل و پروگرم کردم.یعنی تو مثال LPC1788-RTX for 4pin touch داخل سی دی هیچ تغییراتی ندادم.
در ضمن به هر کدام از سوکت های touchpad هم وصلش کنید فرقی نداره با هم موازیند.اینم از عکسش:
IMG_20170826_154215.jpg
ویرایش توسط omid_2132 : 26-08-2017 در ساعت 16:46
سلام خیلی ممنون آقای رئیسی دقیقا مشکل همین بودقبل از ایجاد یه صفحه جدید صفحه قبلی رو باید deleteکرد
درحال حاضر یه مشکل دیگه دارم ممنون میشم راهنمایی بفرمایید
درواقع یه متغییری دارم که تو تابع اینتراپت پلاس میشه حال چه طور باید متغییر به صورت اتوماتیک رو کادر editeآپدیت بشه
درحال حاضر حتما باید یه دکمه داخل صفحه رو لمس کنم تا از اون طریق بتونم مقدار جدید متغییر رو تو کادر مورد نظر نمایش بدم
گرافیک هم توسط guibuilderساخته شده
گویا کد سی تولید شده توسط این نرم افزار توسط switch,caseنوشته شده و برای آپدیت صفحه یا اصلا هرکاری را که بخوایم رو صفحه اتفاق بیافته حتما باید صفحه لمس بشه
اگه اینطور باشه چطور میشه به کمک emwinیه ساعت ساخت در اینصورت حتما باید صفحه رو لمس کنیم تا مقدار ساعت رو صفحه آپدیت بشه
ممنون میشم راهنمایی بفرماییدو از دوستان
سلام.نیازی به لمس تاچ نیست. مثلا با دستور ات زیر میتونید یه متن رو تغییر بدید
که hWinMainPage اشاره گر به پنجره و buf رشته مورد نظر هستکد:( hItem= WM_GetDialogItem(hWinMainPage,ID_TEXT_1 (TEXT_SetText(hItem, buf
Hardware & Software designer
Telegram:@y_r_z
سلام.من تو مثال LPC1788-RTX for 4pin touch هفت اینچ وقتی تو دستور GUI_DrawBitmap(&bmlogo, 0, 0); یک عکس با سایز 300*500 قرار میدم عکس از رزولیشن واقعی کوچکتر دیده میشه و وقتی به 360*600 میبرم عکس رو تو کیل ارور not enough میده.چطور یه عکس با حداکثر اندازه lcd م قرار بدم.
تابع اول رو داخل اینتراپت استفاده کنید.در اینجا مقدار یک prgressbar فرضا ارسال میشه.
تابع دوم در فایلی که guibuilder براتون ساخته رو اضافه کنید . دقت کنید کل تابع رو نیاز نیست فقط باید قسمت سوئیچ مربوط به dlProgBarEvent رو کپی کنید.
اون Define رو هم در هر دو فایل سی (یا یک فایل هدر اضافه کنید).اینطوری هر وقت اینتراپت زده شد مقدار روی صفحه اپدیت میشه.
فقط یادت باشه که با این دستور ، پیغام به کل صفحه های موجود ارسال میشه ولی اگر بخواید به یک صفحه خاص ارسال بشه باید از wm_sendmessage استفاده کنید که
اگر یک صفحه فقط باشه همین هم باید جواب بده.
کد:#define dlProgBarEvent WM_USER+1 void dl_setProgBar(int prc) { WM_MESSAGE dlMsg; dlMsg.MsgId = dlProgBarEvent; dlMsg.Data.v = prc; WM_BroadcastMessage(&dlMsg); } static void _cbDialog(WM_MESSAGE * pMsg) { WM_HWIN hItem; int NCode; int Id; // USER START (Optionally insert additional variables) // USER END switch (pMsg->MsgId) { case dlProgBarEvent: hItem = WM_GetDialogItem(pMsg->hWin, ID_PROGBAR_0); PROGBAR_SetValue(hItem, pMsg->Data.v); break; case WM_INIT_DIALOG: // . . . }
سلام آقای رئیسی
ممنون
ولی مگه با این دستور فقط یه متن ثابت رو نشون نمیدن
;("TEXT_SetText(hItem, "ALI
الان من بجای ALIاز یه متغییر استفاده کنم کامپایلر ازم ایراد میگیره
تو تعریف خود این تابع آرگومان دوم یه constتعریف شده
نکته دوم
همین مثالی که زدین فکر کنید bufتو mainبرنامه درحاله تغییره
من این دوخط دستوری رو که گفتین کجای برنامه بنویسم
که با تغییر bufتو برنامه مقدارش رو السیدی آپدیت بشه؟؟
منظورم از تغییر اینه که مثلا هر یک ثانیه در حاله تغییره
این تغییرات رو چه جوری من باید به پنجره انتقال بدم
تا مقدارbufرو السیدی تغییرکنه؟؟
ممنون میشم واقعا اگه کمک کنید
خیلی تلاش کردم
یوزرمنوال emwinهم خوندم ولی دقیق توضیح نداده مثال ام نداره
مثالی هم در این رابطه پیدا نکردم
کلا گیج شدم دیگه حسابی
سلام
آقا خدا پدر مادر تو بیامرزه مشکل حل شد
حقیقت این موضوع رو من تو سایت seggerبهش برخوردم
همین مشکل مطرح شده بود
من این موضوع رو پیاده کردم ولی مشکلم این بود که اون defineرو که شما بهش اشاره کرده بودین رو لحاظ نکرده بودم
توسایت هم چیزی نگفته بود برا همین بود که جواب نمیگرفتم
البته من نمیخواستم اون تابع داخل اینتراپت قرار بگیره تو mainبرنامه جایی احتیاج داشتم دائما پیغامی رو به داخل پنجره بفرستم
تا داخل کادر editeآپدیت بشه
فقط درمورد اون موضوعی که گفتین که این برنامه باعث میشه پیغام برای همه پنجره ها ارسال میشه
وبرای یک پنجره خاص باید ازتابع wm_sendmessage استفاده کرد حق باشماست تو همون سایت seggerهم به این موضوع اشاره شده
من این موضوع رو هم پیاده کردم وبرای یک پنجره خاص فرستادم بازهم همه چی انجام شد بادستورات زیر
;WM_MESSAGE dlMsg
;WM_HWIN hClient
;(hClient = WM_GetClientWindow(hWin
;(WM_SendMessage(hClient, &dlMsg
آقا در هر صورت خیلی ممنون واقعا دستت درد نکنه
طبق فرمایشاتتون حتما باید یک پنجره بسته بشه تا امکان باز شدن پنجره دیگر میسر شود.ولی وقتی من از کد زیر استفاده میکنم
فقط یک قسمت مثلا اگه تو تابع چک باکس قرار داده باشم فقط قسمت چک باکس از بین میره و بقیه window باقی میمونه که طبیعیه چون آخرین مقدار hItem رو با ID_CHECKBOX_0 تو برنامه خودم جایگداری کرده بودم.کد:case ID_CHECKBOX_0: // Notifications sent by 'Checkbox' switch(NCode) { case WM_NOTIFICATION_CLICKED: hItem = WM_GetDialogItem(pMsg->hWin, ID_CHECKBOX_0); CHECKBOX_SetBoxBkColor(hItem,GUI_RED,1); WM_DeleteWindow(hItem);
وقتی هم از
استفاده میکنم هیچ تغییری در پنجره م نمیبینم.من میخوام کل پنجره م پاک بشه تا بتونم یک پنجره دیگه باز کنم.ممنون میشم راهنماییم بفرمایید.کد:hItem = WM_GetDialogItem(pMsg->hWin, ID_WINDOW_0); WM_DeleteWindow(hItem);
در پایان اگر از دوستان یک مثال دو پنجره ای داشته باشند لطف کنند و اینجا قرار بدن تا با شکل کلی کار آشنا بشیم.
ویرایش توسط omid_2132 : 25-09-2017 در ساعت 18:47
ظاهرا با فرمان WM_DeleteWindow میشه پنجره رو بست ولی چطور به کار میره رو ندونستم.البته من غیر فعالش کردم وقتی فعالش میکنم پنجره delete مبشه ولی در حین کار برنامه نمیتونم به کار ببرمش.
کد:void MainTask(void) { WM_HWIN Test; GUI_Init(); Test=Createexample1(); //WM_DeleteWindow(Test); while (1) { GUI_Delay(100); } }
سلام.وقتی شما میخواهید یک پنجره جدید باز کنید و با پنجره فعلی کار ندارید اید این کار رو کنید:
1. چک کنید اگه پنجره ی جدید قبلا ساخته شده .اول اون رو حذف کنید( با دستور wm_delete ) و مجددا پنجره رو بسازید.
2. یا پنجره رو فقط یک بار بسازید و وقتی بهش نیاز ندارید hide کنید و وقتی نیاز دارید show کنید.
3-یا وقتی میخواید یه پنجره جدید باز کنید پنجره فعلی رو delete کنید
خب معلومه پنجره ای که delete بشه دیگه قابل استفاده نیست
ویرایش توسط yraeisi : 27-09-2017 در ساعت 09:10
Hardware & Software designer
Telegram:@y_r_z
ممنون جناب آقای رییسی که به سوالم پاسخ میدید و تشکر از زحماتی که برای آماده کردن سی دی آموزشی کشیدید.
اگه براتون ممکن باشه یک مثال ساده با 2 پنجره مثل مثال صفحه 887 از pdf قرار بدین تا با محل و ترتیب استفاده تابع WM_DeleteWindow یا WM_ShowWindow آشنا بشیم.من خیلی جاها سرچ کردم مثالها گویا نبودن.
منظورم اینه که تغییرات باید هم تو تابع main.c و هم تو تابع dlg.c داده بشه؟
برا باز کردن دو پنجره تو guibuilder در قسمت save دو تابع ذخیره میشود که چگونه فراخونی میشوند ظاهرا نکاتی دارند که در قالب یک مثال ساده میتوان جواب سوالها را یافت.
ویرایش توسط omid_2132 : 27-09-2017 در ساعت 15:01