PDA

View Full Version : سوال: چگونه تو ++C با کلیدهای مکان نما کار کنیم؟



هم دانشگاهی
دوشنبه 29 شهریور 1389, 13:11 عصر
سلام دوستان!

میخواستم بدونم چه طوری تو ++C با کلید های مکان نما کار کنیم و بتونیم اون ها رو جابه جا کنیم؟

خیلی ممنونم! :لبخندساده:

tdkhakpur
دوشنبه 29 شهریور 1389, 15:13 عصر
برای این کار شما باید کد اسکن کلید را بدست بیارید اول از همه یک getch بگیر اگر نتیجه 0 شد یک getch دیگه بگیر چیزی که برگشت میده عدد کد اسکن هست حالا با دو سه با امتحان میتونی عدد کلیدهای جهت نما را پیدا کنی و ...

هم دانشگاهی
دوشنبه 29 شهریور 1389, 23:27 عصر
خب حالا که فهمیدیم کد کلید ها چنده چه طوری ازش استفاده کنیم؟ :لبخندساده:

البته برای من کد کلیدهای بالا و پایین و چپ و راست یکی بودن! :افسرده:

میشه بیشتر توضیح بدین؟
ممنونم

tdkhakpur
دوشنبه 29 شهریور 1389, 23:47 عصر
خب حالا که فهمیدیم کد کلید ها چنده چه طوری ازش استفاده کنیم؟
البته برای من کد کلیدهای بالا و پایین و چپ و راست یکی بودن!
میشه بیشتر توضیح بدین؟

توضیح زیادی نداره دو سه خطه ساده است میتوانید به جای ارسال پیغماهای موجود کارتان را بهش بدید.


#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <dos.h>
int main()
{
if( getch()==0 )
cout<<getch();
switch(getch())
{
case 72: cout<<"up"; break;
case 75: cout<<"left"; break;
case 77: cout<<"rightt"; break;
case 80: cout<<"down"; break;
}
return 0;
}

Salar Ashgi
دوشنبه 29 شهریور 1389, 23:51 عصر
برای تمام کلید ها کد اسکی وجود دارد که با این کد میتوان تشخیص داد که آیا کلیدی فشرده شده است یا
خیر !
به لینک های زیر هم سری بزنید :
http://www.cplusplus.com/forum/beginner/5136/

http://www.programmersheaven.com/mb/CandCPP/323786/323786/arrow-keys-in-c++/

http://www.codingforums.com/archive/index.php/t-100973.html

هم دانشگاهی
سه شنبه 30 شهریور 1389, 00:12 صبح
متوجه شدم اما میخوام تو cosole application DOS مکان نما رو با این کدها جابجا کنم!

هنموز اینجا رو نفهمیدم!:متفکر:

راستی بابت لینکها هم خیلی ممنون ! باحال بودن!:خجالت:

tdkhakpur
سه شنبه 30 شهریور 1389, 01:38 صبح
برای تمام کلید ها کد اسکی وجود دارد

برای همه کلید ها نه!
برای یک سری کلیدها که جزو کلیدهای توسعه یافته هستند کد اسکی تعلق نگرفته بلکه کد توسعه یافته داره که برای دریافت آن از طریق صفحه کلید باید دوبار به بافر صفحه کلید مراجعه شود یعنی در اصل وقتی کلیدی از این نوع فشرده میشه اشاره گر بافر صفحه کلید دو یابت به طرف انتها حرکت میکنه در صورتی که برای کلیدهای عادی یک بایت هست.


متوجه شدم اما میخوام تو cosole application DOS مکان نما رو با این کدها جابجا کنم!


ببینید برای اینکه مکان نمای استاندارد حرکت کنه باید از gotoxy استفاده کنید یعنی تقریبا بصورت زیر.


#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <dos.h>
int main()
{
int x=1, y=1;
while( getch()!=27 ){
switch(getch())
{
case 72: y = y>0 ? y-1 : 0 "; break;
case 75: x = x>0 ? x-1 : 0 "; break;
case 77: x = x<80 ? x+1 : 0 "; break;
case 80: y = y<24 ? y+1 : 24 "; break;
}
gotoxy(x, y);
}
return 0;
}

هم دانشگاهی
سه شنبه 30 شهریور 1389, 05:46 صبح
من کد رو فهمیدم! اما . . .

آخه من از Dev -cpp استفاده میکنم اون تو داخل کتابخانه conio.h تابع gotoxy نیستش! :متفکر:

راه حل دیگه نیستش؟

Salar Ashgi
سه شنبه 30 شهریور 1389, 10:20 صبح
برای همه کلید ها نه!

بله ، درسته ! منظورم اکثر کلیدهای کاربردی بود !

هم دانشگاهی
سه شنبه 30 شهریور 1389, 11:05 صبح
دوستان سوال من بی جواب موند!

تو Dev-cpp تابع gotoxy نیست ! آیا تابع دیگه ای نیست که بشه باهاش کار کرد؟

PC2st
سه شنبه 30 شهریور 1389, 12:02 عصر
می‌توانید از کتابخانه‌های cross-platform استفاده کنید، مثل کتابخانهٔ NCURSES

یا اگر می‌خواهید مستقیم با ترمینال کار کنید، می‌توانید از کد ANSI escape استفاده کنید، بطور مثال من برای جابجایی مکان نما در گنو/لینوکس می‌توانم از دستور زیر استفاده کنم، احتمالاً در ویندوز هم مشابه زیر است:


std::cout << "Hello" << "\e[10;40f" << "World" << std::endl;که e[10;40f\ مشابه goto است و مکان‌نما را به سطر ۱۰ و ستون ۴۰ منتقل می‌کند، سپس کلمه World را چاپ می‌کند. به این روش می‌توان رنگ را نیز تغییر دهید و همچنین سایر مشخصات هم قابل تغییر است. e\ همان کاراکتر Escape است و زمانیکه با کاراکتر ] ترکیب می‌شود موجب استفاده از کاراکتر CSI می‌شود. در گنو/لینوکس در پوستهٔ شل نیز می‌توان چنین کاری را انجام داد (و احتمالاً در خط فرمان ویندوز هم می‌توان):


echo -e "Hello\e[10;40fWorld"برای اطلاعات بیشتر در رابطه با این مورد:
http://en.wikipedia.org/wiki/ANSI_escape_code

هم دانشگاهی
سه شنبه 30 شهریور 1389, 22:13 عصر
من این کد رو تو dev-cpp اجاش کردم اما فقط اون رو چاپ کرد
10,40f[

میتونه اشکالش از چی باشه؟

PC2st
چهارشنبه 31 شهریور 1389, 10:41 صبح
ظاهراً ویندوزهای سری NT بطور native از این قابلیت پشتیبانی نمی‌کند، اما پشتیبانی جزئی از آن را می‌توانید فعال کنید که در لینکی که داده بودم، روش آن نوشته شده است.

بنابراین به عنوان یک روش دیگر، می‌توانید از Console API ویندوز استفاده کنید:
http://msdn.microsoft.com/en-us/library/ms682087%28VS.85%29.aspx

برای جابجایی مکان‌نما از تابع SetConsoleCursorPosition استفاده کنید.

هم دانشگاهی
چهارشنبه 31 شهریور 1389, 21:42 عصر
بابت لینک ممنونم

میشه prototype تابع SetConsoleCursorPosition رو بگین!
:چشمک:

PC2st
چهارشنبه 31 شهریور 1389, 22:28 عصر
من لینک مرجع کار با Console API را داده بودم.
از درون همان لینک بر روی Console Functions و سپس بر روی SetConsoleCursorPosition کلیک کنید.
پس از ۲ کلیک، در نهایت باید به این لینک برسید (http://msdn.microsoft.com/en-us/library/ms686025%28v=VS.85%29.aspx) که همه توضیحات را داده است.

هم دانشگاهی
جمعه 02 مهر 1389, 17:28 عصر
ببخشید ولی از اون روزی که شما این سایت رو معرفی کردین سایت باز نشد
فکر کنم یه مشکلی هست! :چشمک:

اگه میشه prototype این تابع SetConsoleCursorPosition رو بگین! ( توضیح بدین) :چشمک:

PC2st
جمعه 02 مهر 1389, 19:02 عصر
#include <windows.h>

COORD pos;
pos.X = 40;
pos.Y = 10;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_H ANDLE), pos);

هم دانشگاهی
جمعه 02 مهر 1389, 20:50 عصر
واقعا ممنونم! :خجالت: درست شد

اینم کد تغییر مکان نما در صفحه console

Enjoy it now


#include <iostream.h>
#include <conio.h>
#include <windows.h>
using namespace std;
int main()
{
COORD pos;
pos.X=1;
pos.Y=1;
while( getch()!=27 ){
switch(getch())
{
case 13: cout<<"yes"; break;
case 72: pos.Y = pos.Y>0 ? pos.Y-1 : 0 ; break;
case 75: pos.X = pos.X>0 ? pos.X-1 : 0 ; break;
case 77: pos.X = pos.X<80 ? pos.X+1 : 0 ; break;
case 80: pos.Y = pos.Y<24 ? pos.Y+1 : 24 ; break;
default: break;
}
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_H ANDLE), pos);
}
return 0;
}

PC2st
جمعه 02 مهر 1389, 21:06 عصر
چون در ویندوز با فشردن کلید ENTER دو کاراکتر n\ و r\ به ترتیب وارد می‌شود، در حلقه‌ای که شما نوشتی، کد کاراکتر ۱۳ همان r\ است که دومین کاراکتری است که توسط ENTER وارد شده است.