PDA

View Full Version : نمایش تصویر در پینت



zahra27
یک شنبه 11 مرداد 1394, 13:39 عصر
من یه جدول از تصاویر دارم که تو پینت نوشتم میخوام این جدولو نمایش بدم بعد کلیک کنم وبا کلیک کردن مثلا خونه ی سوم جدول تصویرش تغییر کنه.چیکارباید بکنم؟مشکل اینه که تو پینت نمیتونم موس کلیک رو فراخوانی کنم وتو کلیک هم نمیشه پینت رو مجدد نوشت.کمک فوری لازم دارم لطفا اگه اطلاعاتی دارید بهم بگید.

محمد فدوی
یک شنبه 11 مرداد 1394, 19:24 عصر
متوجه سؤال نشدم. منظورتون از «پینت» نرم‌افزار Paint در ویندوزه؟
خب شما الان یه جدول توی Paint کشیدی و می‌خوای هروقت روی یه سلول از اون جدول کلیک کردی تصویر داخل اون سلول تغییر کنه؟

اگه منظور سؤال رو درست فهمیده باشم، اولین پیشنهادم اینه که چنین کاری رو انجام ندی! و در گام بعدی اگه اصرار داری عملیش کنی با جاوا انجامش ندی (احتمالا سی یا انتخاب بهتریه)!!
بذار مشکلات سر راه رو دونه دونه بررسی کنیم. اولا به راحتی نمی‌تونیم از اینکه ماوس روی یه پنجره‌ی دیگه (مثلا پنجره‌ی Paint) کلیک کرده باخبر بشیم. برای اینکار یا باید از Hookهای استاندارد ویندوز استفاده کنیم که در اینصورت نیاز داریم از توابع استاندارد API استفاده کنیم (مثال (http://www.jotschi.de/technik/2008/01/06/java-global-keyboard-hook-jni.html))، یا به عنوان یه راه فرعی، لحظه به لحظه وضعیت ماوس رو بررسی کنیم و هروقت دیدیم ماوس کلیک شده بقیه‌ی کارها رو انجام بدیم که در ادامه توضیح می‌دم!

حالا فرض کنیم ساز و کاری رو ایجاد کردیم که می‌تونیم اعمال روی ماوس حتی اگه روی برنامه‌ی ما نبود شنود کنیم. مشکل بعدی اینه که از کجا بفهمیم آیا کاربر روی یه سند Paint کلیک کرده؟! بازم باید دست به دامن توابع API بشیم... با تابع API استاندارد GetActiveWindow (https://msdn.microsoft.com/en-us/library/windows/desktop/ms646292%28v=vs.85%29.aspx) می‌تونیم یه دستگیره (Handle یا همون HWND (https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751%28v=vs.85%29.aspx)) از پنجره‌ی فعال به دست بیاریم و می‌تونیم بررسی کنیم که آیا پنجره‌ی فعال Paint هست یا نه و تصمیم بگیریم.

با فرض اینکه متوجه شدیم عمل کلیک انجام شده و فهمیدیم روی Paint هم بوده، با این مشکل روبروییم که بفهمیم روی کدوم سلول کلیک شده؟! یا اصلا شاید خارج از جدول یا مثلا روی نوارابزار Paint کلیک شده (و کلی حالت دیگه!) احتمالا این سخت‌ترین بخش پروژه خواهد بود! باتوجه به اینکه پنجره‌ی Paint ممکنه در هر قسمتی از صفحه قرار داشته باشه، نیاز داریم یه مقدار تصاویر رو پروسس کنیم. خوشبختانه با استفاده از متدهای کلاس Robot (http://stackoverflow.com/questions/4490454/how-to-take-a-screenshot-in-java) خیلی ساده می‌تونیم از هر بخشی از صفحه اسکرین‌شات بگیریم! باید از بخشی که ماوس روی اون قرار داره عکس بگیریم و بعد از پروسس کردنش اگه تشخیص دادیم روی جدول داخل سند کلیک شده بازم با استفاده از قابلیت‌های کلاس Robot (http://stackoverflow.com/questions/19185162/how-to-simulate-a-real-mouse-click-using-java) تغییرات دلخواهمون رو توی اون سلول ایجاد کنیم...
درضمن موقع کار کردن با توابع API یه واسط مثل JNI (https://en.wikipedia.org/wiki/Java_Native_Interface) یا JNA (https://en.wikipedia.org/wiki/Java_Native_Access) لازممون می‌شه. (JNA ساده‌تره)

به نظر نمی‌رسه انجام این‌کارها منطقی باشه و بهتره یه راه‌حل جایگزین مثل نمایش دادن تصویر توی خود برنامه، یا چیزای دیگه استفاده کنی.
البته اگه بازم اصرار داری که همین راه رو ادامه بدی جزئیات بیشتری رو معلوم کن تا بشه بیشتر راهنماییت کرد.

zahra27
سه شنبه 13 مرداد 1394, 22:23 عصر
متوجه سؤال نشدم. منظورتون از «پینت» نرم‌افزار Paint در ویندوزه؟
خب شما الان یه جدول توی Paint کشیدی و می‌خوای هروقت روی یه سلول از اون جدول کلیک کردی تصویر داخل اون سلول تغییر کنه؟

اگه منظور سؤال رو درست فهمیده باشم، اولین پیشنهادم اینه که چنین کاری رو انجام ندی! و در گام بعدی اگه اصرار داری عملیش کنی با جاوا انجامش ندی (احتمالا سی یا انتخاب بهتریه)!!
بذار مشکلات سر راه رو دونه دونه بررسی کنیم. اولا به راحتی نمی‌تونیم از اینکه ماوس روی یه پنجره‌ی دیگه (مثلا پنجره‌ی Paint) کلیک کرده باخبر بشیم. برای اینکار یا باید از Hookهای استاندارد ویندوز استفاده کنیم که در اینصورت نیاز داریم از توابع استاندارد API استفاده کنیم (مثال (http://www.jotschi.de/technik/2008/01/06/java-global-keyboard-hook-jni.html))، یا به عنوان یه راه فرعی، لحظه به لحظه وضعیت ماوس رو بررسی کنیم و هروقت دیدیم ماوس کلیک شده بقیه‌ی کارها رو انجام بدیم که در ادامه توضیح می‌دم!

حالا فرض کنیم ساز و کاری رو ایجاد کردیم که می‌تونیم اعمال روی ماوس حتی اگه روی برنامه‌ی ما نبود شنود کنیم. مشکل بعدی اینه که از کجا بفهمیم آیا کاربر روی یه سند Paint کلیک کرده؟! بازم باید دست به دامن توابع API بشیم... با تابع API استاندارد GetActiveWindow (https://msdn.microsoft.com/en-us/library/windows/desktop/ms646292%28v=vs.85%29.aspx) می‌تونیم یه دستگیره (Handle یا همون HWND (https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751%28v=vs.85%29.aspx)) از پنجره‌ی فعال به دست بیاریم و می‌تونیم بررسی کنیم که آیا پنجره‌ی فعال Paint هست یا نه و تصمیم بگیریم.

با فرض اینکه متوجه شدیم عمل کلیک انجام شده و فهمیدیم روی Paint هم بوده، با این مشکل روبروییم که بفهمیم روی کدوم سلول کلیک شده؟! یا اصلا شاید خارج از جدول یا مثلا روی نوارابزار Paint کلیک شده (و کلی حالت دیگه!) احتمالا این سخت‌ترین بخش پروژه خواهد بود! باتوجه به اینکه پنجره‌ی Paint ممکنه در هر قسمتی از صفحه قرار داشته باشه، نیاز داریم یه مقدار تصاویر رو پروسس کنیم. خوشبختانه با استفاده از متدهای کلاس Robot (http://stackoverflow.com/questions/4490454/how-to-take-a-screenshot-in-java) خیلی ساده می‌تونیم از هر بخشی از صفحه اسکرین‌شات بگیریم! باید از بخشی که ماوس روی اون قرار داره عکس بگیریم و بعد از پروسس کردنش اگه تشخیص دادیم روی جدول داخل سند کلیک شده بازم با استفاده از قابلیت‌های کلاس Robot (http://stackoverflow.com/questions/19185162/how-to-simulate-a-real-mouse-click-using-java) تغییرات دلخواهمون رو توی اون سلول ایجاد کنیم...
درضمن موقع کار کردن با توابع API یه واسط مثل JNI (https://en.wikipedia.org/wiki/Java_Native_Interface) یا JNA (https://en.wikipedia.org/wiki/Java_Native_Access) لازممون می‌شه. (JNA ساده‌تره)

به نظر نمی‌رسه انجام این‌کارها منطقی باشه و بهتره یه راه‌حل جایگزین مثل نمایش دادن تصویر توی خود برنامه، یا چیزای دیگه استفاده کنی.
البته اگه بازم اصرار داری که همین راه رو ادامه بدی جزئیات بیشتری رو معلوم کن تا بشه بیشتر راهنماییت کرد.

نه منظورم paintComponentخود جاواست.مجبورم برناممو با جاوا بنویسم. من مبتدیم آسون تر توضیح بدید:لبخند:لطفا

MohseN16
چهارشنبه 21 مرداد 1394, 14:09 عصر
نه منظورم paintComponentخود جاواست.مجبورم برناممو با جاوا بنویسم. من مبتدیم آسون تر توضیح بدید:لبخند:لطفا
خب چرا از کلاس جدول خود جاوا استفاده نمیکنین؟ اینطوری برای هر خونه از جدول میشه ی Listener نوشت تا زمانی که روش کلیک شد تصویر اون خونرو عوض کنه