PDA

View Full Version : با کشیدنه خط صفحه هم اسکرول بشه



فاطمه وطن دوست
جمعه 28 تیر 1387, 19:20 عصر
سلام
=====

تو وورد برای اینکه یه خط رو ترسیم کنیم ،از لاین استفاده میکنیم ، باید اول روی یه

نقطه از صفحه کلیک کنیم و بعد ماوس رو بکشیم تا نقطه ی دلخواه (دوم ) تا خط رسم بشه

اگه خط از محدوده ای که الان داریم توش ترسیم رو انجام میدیم بزنه بیرون ، صفحه اسکرول

میشه.

مثلا فرض کنید تو یه نقطه از صفحه مثلا بالا سمت راست کلیک کنیم -( مختصات اول

تا انتهای صفحه پائین سمت چپ (مختصات دوم ) ماوس رو بکشیم و رها کنیم.

اگر به اسکرول عمودی نگاه کنید میبینید که صفحه اسکرول میشه .

منم میخوام همچین کاری رو روی یه پیکچر باکس ( صفحه مختصات ) + یوزر کنترل خط پیاده

کنم نتونستم ، حالا میخوام از راهنمائی شما استفاده کنم .

koruir
جمعه 28 تیر 1387, 20:43 عصر
خوب کار ساده ای هست.
با یه کم API میتونی این کار رو بکنی.

1. اول مختصات Mouse Pointer رو پیدا کن.
2. بعد مختصات جایی که Picture Box تمام شده پیدا کن.
3. حالا یه دستور شرطی تو یه تایمر؛ که اگه Mouse Pointer از پایین ترین نقطه Picture Box پایین تر بود؛ با تابه SendMassege یه کلید یه کنترل Picture Box بفرستید.

نکته: کلید فرستاده شده میتونه End باشه یا Down Arrow Key

امیدوارم مفید بوده باشه.

فاطمه وطن دوست
جمعه 28 تیر 1387, 20:53 عصر
سلام

این تایمر برای چیه ؟

koruir
جمعه 28 تیر 1387, 23:41 عصر
این تایمر برای چیه ؟

سلام دوست عزیز.
از تایمر استفاده میشه تا شرط بالا رو هر 1 ثانیه یا کمتر چک کنه. و هر وقت که شرط برقرار بود؛ کار رو انجام بده.
یعنی هر وقت موس رفت پایین ؛ Scroll Picture Box هم بیاد پایین.

__H2__
جمعه 28 تیر 1387, 23:43 عصر
سلام


این تایمر برای چیه ؟

ضمن تایید، پست جناب koruir ...
برای اینکه
1- در زمان توقف ماوس هم باز حرکت داشته باشید.
2- در سیستم های مختلف با سرعتهای اجرای مختلف، سرعت اسکرول شما ثابت باشد.

این نمونه گرچه کدی برای ترسیم خط ندارد ولی در روند جاری که گفتید با رویدادهای ماوس روی تصویر به دقت کار میکند.
متاسفانه من VB6 ندارم و نمونه را تحت VB9-2008 تهیه کرده ام، اگر به کدهای فایل Form1.vb دقت کنید میتوانید، نمونه را به VB6 تبدیل کنید.

فاطمه وطن دوست
شنبه 29 تیر 1387, 11:17 صبح
سلام

میشه یه توضیحی هم راجع به کدتون بدین ، من VB9-2008 بلد نیستم .
نمیدونم این کدائی مه نوشتین دقیقا چه کار میکنه .

=============================================

تا یه حد خیلی کوچیک متوجه شدم ولی نه کاملا .

__H2__
شنبه 29 تیر 1387, 14:50 عصر
سلام
کار این نمونه دقیقاً چیزی است که شما خواسته بودید، یک تصویر بزرگ (160KB) با Scrollbar دارد که اگر ماوس را روی آن بکشید، اسکرول میشود.
فقط خطی رسم نمی کند (برای سادگی و قابل فهم بودن کد) یعنی اگر شما کد ترسیم خط از نقطه MouseDown به MouseUp را هم اضافه کنید، دیگر کامل میشود.

متاسفانه چون VB6 ندارم، باید خط به خط را توضیح دهم.
حتماً متون زیر را در کنار کدهای فایل Form1.vb در Notepad باز کنید و بخوانید.
==========
- DELTA میزان حاشیه ای را که اگر ماوس از آن بیشتر به لبه ها نزدیک شود، باید اسکرول انجام شود، مشخص میکند.

- ADDSCROLLPOSITION هم میزان اسکرول در هر بار سرریز تایمر را مشخص میکند.

- m_Point_MouseDown زوج X و Y مربوط به نقطه ای در صفحه کلی دسکتاپ که ماوس اولین بار Down شده را نگه میدارد.

- m_Point_Min زوج X و Y مربوط به نقطه ای در صفحه کلی دسکتاپ که ماوس از سمت چپ یا بالا از آن فراتر رود باید اسکرول انجام شود را مشخص میکند.

- m_Point_Max زوج X و Y مربوط به نقطه ای در صفحه کلی دسکتاپ که ماوس از سمت راست یا پایین از آن فراتر رود باید اسکرول انجام شود را مشخص میکند.
==========
رویداد MouseDown
اگر دکمه چپ ماوس فشره شده بود
{
1- تایمر را روشن کن.

2- مکان فعلی ماوس شامل زوج XوY را در صفحه نمایش مانیتور در m_Point_MouseDown بریز.

3- مختصات نقطه حداقل (بالا-چپ) را که ماوس از آن چپ تر یا بالاتر بروید، باید صفحه اسکرول شود در m_Point_Min بریز.
(این نقطه به اندازه حاشیه DELTA واحد از گوشه بالا-چپ فاصله دارد، تا ماوس به این حاشیه پایانی که وارد شد، اسکرول انجام شود.)

4- مختصات نقطه حداکثر (پایین-راست) را که ماوس از آن راست تر یا پایین تر بروید، باید صفحه اسکرول شود در m_Point_Max بریز.
(این نقطه به اندازه حاشیه DELTA واحد از گوشه پایین-راست فاصله دارد، تا ماوس به این حاشیه پایانی که وارد شد، اسکرول انجام شود.)

توجه: تابع PointToScreen مختصات جاری در محدوده کنترلر را به مختصات کلی صفحه نمایش تبدیل میکند.
}
==========
رویداد MouseUp
تایمر را خاموش کن.
==========
رویداد Tick یا سرریز مدام تایمر
1- مکان جاری ماوس را بدست اور و در mousepoint بریز.
2- مقدار جاری اسکرول در جهت زوج X و Y را در scrollposition بریز.
3- اگر مقدار اسکرول منفی بود، مثبتش کن. (در نسخه 2008 این عدد برخی مواقع منفی گزارش میشود ولی ما باید مثبت تحویل بدهیم!)

4- اگر نقطه جاری ماوس از نقطه اولیه راست تر بود و نقطه جاری از مرز راست حاشیه مشخص شده برای شروع اسکرول توسط m_Point_Max گذشته بود
{
مقدار scrollposition را در جهت X به اندازه ADDSCROLLPOSITION واحد افزایش بده. (اسکرول به راست)
}

5- اگر نقطه جاری ماوس از نقطه اولیه چپ تر بود و نقطه جاری از مرز چپ حاشیه مشخص شده برای شروع اسکرول توسط m_Point_Min گذشته بود
{
مقدار scrollposition را در جهت X به اندازه ADDSCROLLPOSITION واحد کاهش بده. (اسکرول به چپ)
}

6- اگر نقطه جاری ماوس از نقطه اولیه پایین تر بود و نقطه جاری از مرز پایین حاشیه مشخص شده برای شروع اسکرول توسط m_Point_Max گذشته بود
{
مقدار scrollposition را در جهت Y به اندازه ADDSCROLLPOSITION واحد افزایش بده. (اسکرول به پایین)
}

7- اگر نقطه جاری ماوس از نقطه اولیه بالاتر تر بود و نقطه جاری از مرز بالا حاشیه مشخص شده برای شروع اسکرول توسط m_Point_Min گذشته بود
{
مقدار scrollposition را در جهت Y به اندازه ADDSCROLLPOSITION واحد کاهش بده. (اسکرول به بالا)
}

8- مقدار متغییر scrollposition را برای اجرای اسکرول به محل جدید تحویل بده.
==========
نمونه کامپایل شده تک exe را هم در زیر گذاشته ام ولی برای اجرا باید Framework2.0 در رایانه تان نصب باشد که میتوانید از Add/Remove چکش کنید.
البته کسانی که ویستا دارند، نیاز به چک کردن هم ندارند و فقط نصب بودن ابزار فوق برای XP است.
البته میتوانید Framework را به حجم حدود 26 مگ، مستقیم از زیر دانلود و نصب کنید، ولی به شخصه بعید میدانم کسی برای دیدن این exe این کار را بکند.

www.h02.ir/Download.aspx?File=Framework.NET-2.0.50727.zip (http://www.h02.ir/Download.aspx?File=Framework.NET-2.0.50727.zip)

بحرحال اگر ویستا یا XP+Framework دارید میتوانید، exe زیر را دانلود کنید و یک نگاهی بکنید.

فاطمه وطن دوست
یک شنبه 30 تیر 1387, 21:30 عصر
سلام

برنامه که تبدیل شده به vb6 ( البته اصلا مشکل نبود)
=======================================

فقط یه مشکل نمیتونم روی یوزر کنترل اعمال کنم
=======================================

مثلا:
وقتی یوزر کنترل خط رو توی پیکچر باکس میکشی ، بعد رهاش میکنی ، بسته به اینکه آیا از مزری که برای اسکرول شدنه صفحه در نظر گرفته شده ، گذشته باشه ، اون موقع صفحه اسکرول بشه - این قسمتشو چطوری باید انجام داد ؟
=========================================

البته من چقدر زحمت میکشم ، خسته نباشم. :بامزه::لبخندساده:

__H2__
دوشنبه 31 تیر 1387, 09:43 صبح
سلام
من کد شما را در Notepad دیدم.
متاسفانه این تبدیل شده آنکه من گفتم نبود.
1- در رویداد MouseDown شما اصلاً محدوده حداقل و حداکثر را به دست نیاورده اید.
2- کد رویداد تایمر را به جای MouseUp نوشته اید و اصلاً رویداد تایمر ندارید !!!!
3- مختصات ها را به مختصات کلی صفحه نمایش تبدیل نکرده اید و گمانم X و Y ای که VB6 میدهد هم مثل VB9 نسبی باشد.
{
نسبی یعنی انکه مختصات 0و0 به گوشه چپ-بالا کنترلر جاری اشاره میکد و 10و10 یعنی 10 پیکسل از لبه چپ-بالای کنترلر را نشانه روی میکند.
مطلق ومانیتوری یعنی انکه مختصات 0و0 به گوشه چپ-بالا صفحه نمایش مانیتور اشاره میکد و 10و10 یعنی 10 پیکسل از لبه چپ-بالای مانیتور را نشانه روی میکند.
}

آن الگویتم که من گفتم، اولین چیزی بود که به ذهنم رسید و نمیگویم راه بهتر دیگری ندارد ولی شما مطمئن هستید که این کد، تبدیل شده همان الگوریتم است؟؟؟؟

اگر باز هم نتوانستید، خودم سعی میکنم برایتان کد VB6 اش را بنویسم. یک بار دیگر سعی کنید.
موفق باشید.

فاطمه وطن دوست
دوشنبه 31 تیر 1387, 11:46 صبح
سلام

آره ، کده اشتباهه . :اشتباه:

2- کد رویداد تایمر را به جای MouseUp نوشته اید و اصلاً رویداد تایمر ندارید !!!!

ای وای ، آره همین طوره . :لبخند:

===============================================
نمیدونم چرا این طوری شده . :چشمک:

فاطمه وطن دوست
سه شنبه 01 مرداد 1387, 18:53 عصر
سلام
===========

نميتونم كدو بفهمم ، از چند نفرم سوال كردم اونا هم كمكي نكردن.
لطفا خودتون كدو آپ كنيد.

=========================================

koruir
چهارشنبه 02 مرداد 1387, 16:43 عصر
دوست عزيز سلام.
من برنامه رو که براتون گفته بودم نوشتم. البته با VB6.0
اول فکر کردم کار راحتيه اما. . .
حدودا نوشتنش 20 دقيقه کار برد.

اصول کلي برنامه هموني هست که قبلا گفتم. فقط از SendMassege استفاده نکردم.

1. اول مختصات Mouse Pointer رو پیدا کن.
2. بعد مختصات جایی که Picture Box تمام شده پیدا کن.
3. حالا یه دستور شرطی تو یه تایمر؛ که اگه Mouse Pointer از پایین ترین نقطه Picture Box پایین تر بود؛ عکس رو بالا ببره.

برنامه ميتونه بسته به مکان Mouse عکس رو به بالا - پايين - چپ و يا راست ببره.

http://barnamenevis.org/forum/attachment.php?attachmentid=20853&d=1216817015

Mbt925
چهارشنبه 02 مرداد 1387, 17:37 عصر
نمونه ای که دوست عزیزمون قرار دادن رو کمی تغییر دادم:

- استفاده از INT برای عملیات های اینچنینی باعث غیر دقیق بودن کار میشه: در این نمونه باعث پرش تصویر میشد.
- استفاده از کنترل برچسب و سایر کنترل ها برای انجام عملیات ریاضی درست نیست.
- استفاده از تایمر (با اینتروال کم) حافظه ی اشغالی سیستم رو افزایش میده.

- برای تشخیص حرکت موس، از تابع SetCapture استفاده بشه خیلی بهتر و اصولی تر.
این تابع حرکات موس رو به یک هندل ارسال می کنه، در این نمونه همه ی حرکات رو برای کنترل جعبه تصویر ارسال می کنیم تا بتونه تصویر خودش رو حرکت بده.

koruir
چهارشنبه 02 مرداد 1387, 23:17 عصر
دوست عزيز mbt925 از شما ممنونم ولي:


استفاده از کنترل برچسب و سایر کنترل ها برای انجام عملیات ریاضی درست نیست
من براي اين از Label استفاده کردم تا دوستان بهتر اصول کار برنامه رو درک کنن.


استفاده از تایمر (با اینتروال کم) حافظه ی اشغالی سیستم رو افزایش میده
خوب ميتونيم Intrval تايمر رو ببريم پايين و در عوض مقدار تغيير Scroll.Value رو زياد کنيم.

نکته: در کدي که شما نوشتين؛ اگه موس ثابت باشه عملي انجام نميشه. تنها با حرکت موس هست که PicBox تغيير ميکنه. که فکر کنم به دليل استفاده نکردن از Timer باشه.

البته هر روش بنا به مورد استفاده صحيح هست.
ممنون که کد منو کامل کردين دوست عزيز.

__H2__
پنج شنبه 03 مرداد 1387, 16:32 عصر
سلام
همانطور که گفتم خیلی وقت بود قیافه VB6 را هم ندیده بودم، الآن هم به طور موقت آنرا از CD ها قدیمی پیدا کردم و در VPC نصب کردم و حاصلش کد زیر شد.

البته قابل ذک راست که میتوان Scrollbar ها را توسط API های ویندوز هم اورد و ست کرد، که در این صورت خیلی بهتر است ولی حقیقتش چون VB9 تمام این قبیل مباحث را پشتیبانی میکند و من دیگر کار نکرده ام، API های مربوطه یادم رفته بود و نه وقت داشتم و نه ارزش یادآوری داشت. در نتیجه حاصل کد زیر شد، که تبدیل شده نمونه VB9 است.

بعد از سالها که مجدداً VB6 را دیدم، واقعاً مخم داشت هنگ میکرد، واقعاً، خدا صبرتان دهد که بعد از ده سال هنوز این فسیل نرم افزاری را تحمل میکنید.

جمیعاً موفق باشید.

koruir
پنج شنبه 03 مرداد 1387, 17:20 عصر
ضمن تشکر از جناب __H2__.
برنامه نوشته شده توسط ايشون (H2) از برنامه من بهتر و حرفه اي تر هست.