ورود

نسخه کامل مشاهده نسخه کامل : ويژوال بيسيك و سبك نمايش كنترل هاي ويندوز اكس پي



majid_kntu
24-06-2006, 21:53
از اولين باري كه با VB6 آشنا شدم با شكل ظاهري كنترل هاي آن مشكل داشتم تا اينكه بعد ها با زير و رو كردن MSDN راه حلي براي رفع اين مشكل پيدا كردم: "استفاده از اعلانيه وابستگي ها"
تا اينكه چند تا از بچه هاي دانشگاه ازم پرسيدن چرا VB6 مثل VB.NET نگارش 2005 خود به خود از نگارش جديد كنترل ها استفاده نمي كنه . بعد از صحبت و تبادل نظر به اين فكر افتادم اين مقاله رو بنويسم تا علاقه مندان وي بي بخونن .
به عكس هاي زير نگاه كنين:

[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ] [ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

يكي تصوير يه برنامه با اعلانيه است و اونيكي تصوير همون برنامه بدون اعلانيه.
اگه دوست داريد برنامه هاتون باسبك اكس پي يا هر Theme ديگه اي كه در اكس پي قابل نصبه اجرا بشه مراحل زير رو انجام بدين
1-Start up Object پروژتون رو به Sub Main تغيير بديد.
2- يه مدول به برنامتون اضافه كنين و كد زير رو توش وارد كنيد:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
در كد بالا فرض براين است كه شي آغازين قبلي شما Form1بوده است.
3- پروژه خود را كامپايل كنيد.
4- مثال ضميمه را از لينك زير دريافت كنيد و فايل Project1.exe.manifest را از آن كپي كرده در كنار برنامه كامپايل شده خود قرار دهيد و سپس نام آنرا تغيير دهيد و به جاي Project1 نام برنامه خود را تايپ كنيد.


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

اين تغير نام خيلي مهم است چراكه اكس پي هنگام اجراي يك برنامه در پوشه آن بدنبال اعلانيه آن خواهد گشت تا بدين ترتيب وابستگي هاي برنامه را به همراه نگارش آنها شناسايي كند .اين پروسه در راستاي پياده سازي پروژه اسمبلي هاي پهلو به پهلو انجام مي گيرد كه بحث در باره آن در اين مقوله نمي گنجد.

البته اين رو هم بگم نتيجه كار رو تو محيط IDE وي بي نمي تونيد ببينيد كه البته اين هم راه داره.كافيه يه اعلانيه براي vb6.exe تو پوشه محل نصب قرار بديد البته اين به معني عدم نياز برنامه هاي نوشته شده توسط اون به اعلانيه نيست.

این فایل اکس ام ال می تواندشامل برچسب هایی برای قرار دادن توصیف ونام برنامه شما باشد که اختیاری هستند وآنها رابرای درک بهتر مطلب حذف کرده ام.

این کار ممکن است عواقب ناخواسته ای درپی داشته باشد مثلا برای یک دکمه رادیویی که در یک قاب قرار گرفته باشد(به مثال پیوست شده رجوع کنید)
سی پلاس پلاس دارای امکاناتی است که به کمک آنها می توان اعلانیه را در فایل اجرایی قرار داد تا به این ترتیب هر کجا که فایل اجرایی قرار گرفت اعلانیه به همراه آن باشد که این مزایای خاص خود را دارد.
بعد از کمی تحقیق و تفحص متوجه شدم در وی بی هم می توان اعلانیه را مثل زبان سی پلاس پلاس به صورت ماخذ به فایل اجرایی پیوست کردبدلیل پیچیده بودن مراحل کار روش اونو شرح نمیدم .

براي اينكه اعلانيه برنامه هميشه همراه برنامه تون باشه بهتره اونو به شكل resource به برنامه پيوست كنيد.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

navid_mansour
25-06-2006, 01:26
چرا برای microsoft comon contorls 6 جواب نمیده این کد؟

majid_kntu
25-06-2006, 18:07
من حدس ميزنم منظور شما كنترل هايي مثل TabStrip يا نگارش هاي پيشرفته تر كنترل هايي مثل Progressbar باشد.همانطور كه در كد مثال نوشته ام تابع API ي مربوطه از Comctl32 فراخواني ميشود و براي تعريف وابستگي به Microsoft windows common controls 6 sp4 (كه احيانا منظور شماست) بايد كل قطعه كد مربوط به Intialize كنترل ها را تغيير داد.در مثال ضميمه ما فقط به اكس پي ميگوييم كه از نگارش 6 فايل comctl32.ocx استفاده كند و درباره mscomctl.ocx چيزي اعلان نكرده ايم.

navid_mansour
26-06-2006, 02:27
میشه بیشتر توضیح بدی؟؟؟؟

shahabmusic
26-06-2006, 03:04
اگه اينطوري برنامه رو بنويسم بعد توي ويندوز 98 اجرا مي شه؟؟؟

navid_mansour
26-06-2006, 03:29
فکر نکنم,هر ویندوزی با سبک خودش اجرا میشه

majid_kntu
26-06-2006, 20:10
حدست درسته!هر نگارشي از ويندوز با سبك خودش برنامه را اجرا مي كند . مثلا Vista يا 98.
اين را هم بگويم كه در محيط ويندوز خيلي چيزها هستند كه از آنچه به نظر مي رسند پيچيده ترند.مثلا ممكن است اين شبه پيش بياد كه روش بالا درمورد هر كنترلي كه در ويندوز مي بينيد جواب بدهد.
ولي حقيقتش اينه كه ما مي تونيم حتي يك سبك مخصوص خودمون رو طراحي كنيم وبا روشي مشابه برنامه رو وادار كنيم از Texture هايي كه براش تعريف كرديم استفاده كنه كه البته راستش رو بخواهيد هنوز خودم امتحانش نكردم.
بعدش اينرو هم اضافه كنم كه اگر Intialize رو مثل مثال بدرستي انجام داده باشيد هيچ مشكل سيستماتيكي براي برنامه ايجاد نميشه.
پس هيچ نگراني درباره اجرا مثلا در 98 نداشته باشيد. البته انتظار ديدن سبك اكس ژي رو تو 98 نداشته باشيد.

navid_mansour
26-06-2006, 22:13
برای microsft common controls 6 توضیح ندادی؟میشه لطف کنی؟

majid_kntu
27-06-2006, 21:19
ببين اين روش فقط قادره كنترل هايي رو كه در comctl32 هستند رو تغيير بده و براي هر كنترل ديگه اي كه در اين فايل نباشه اين روش بي تاثيره .
واضح تر بگم
تو IDE وي بي كليد تركيبي Ctrl+T رو بزن
Microsoft Windows Common Controls 5 رو انتخاب كن .
در قسمت Location آدرسي مثل آدرس زير ميبيني
c:\windows\system32\comctl32.ocx
در واقع وي بي به طور پيش فرض از نگارش 5 اين فايل استفاده مي كنه.
به خاطر خصلت نسل اكس پي در يك ويندوز هر دو نگارش 5 و 6 اين فايل وجود داره و برنامه ها انتخاب مي كنن كه از كدوم نسخه استفاده كنن.
همانطور كه گفتم برنامه هاي كامپايل شده با وي بي 6 به طور پيش فرض از نگارش 5 استفاده مي كنن.
در اين مثال هم ما اونو وادار مي كنيم تا از نگارش 6 فايل comctl32 استفاده كنه .
بنابراين من منظور شما از Microsoft Common Controls 6 رو متوجه نمي شم!!!!
اگه مي شه يكي از كنترل هايي كه به نظر شما اين مثال در مورد اون جواب نميده رو نام ببريد.به ياد داشته باشيد كه كنترلي رو كه مي خواهيد مثال بزنيد بايد تو فايل comctl32.ocx باشه...

Blue Rose
28-06-2006, 05:10
سلام
قبلا توضیح داده شده بود

majid_kntu
02-07-2006, 06:21
لطفاًاز مبحث گفتگو خارج نشويد و سولات خود را واضح بيان كنيد!

سمیرا62
06-07-2006, 05:08
چي قبلاً توضيح داده شده بود؟

shahabmusic
10-07-2006, 15:35
ممنون درست اجرا شد ولي كاش راهي براي اجراي همه ابزارهاي ايكس پي وجود مي داشت.
مرسي.ممنون.

taghi_ramzi
13-07-2006, 16:52
خیلی عذر میخام تو فایل comctl32.ocx ما اصلا کنترلهایی که شما بالا تو عکس گذاشتی نیست
این عکس رو ببینید :

[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ] ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ])

همونطور که تو این عکس میبینید فایل comctl32.ocx شامل کنترلهایی میشه که من دورش خط کشیدم !
قضیه چیه ؟

Payman_62
14-07-2006, 01:33
کدوم عکس رو میگی؟
هنگام تبدیل استایل برنامه به ایکس پی هم کنترل های خود ویبی تغییر میکنن هم common controls

taghi_ramzi
14-07-2006, 12:34
اصلا همچین اتفاقی نمیفته !!!!

Payman_62
14-07-2006, 15:10
پس یه جای کار رو اشتباه انجام دادی.

majid_kntu
14-07-2006, 17:01
براي رفع هر گونه ابهام درباره كنترل ها به تصاوير زير نگاه كنيد:

[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

اميدوارم متوجه مطلب شده باشيد.

majid_kntu
14-07-2006, 17:08
اگر مي خواهيد تغيرات را در IDE وي بي هم مشاهده كنيد پرونده زير را با حجم 1 كيلوبايت دانلود كنيد:

XP visual style for vb6 IDE ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ])

بعد از Unzip كردن پرونده vb6.exe.manifest رو در محلي كه vb6.exe قرار دارد (محل نصب ويژوال بيسيك 6 يه چيزي مثل :
c:\Program Files\Microsoft Visual Studio\VB98
) قرار دهيد.با اجرا مجدد وي بي نتيجه را ملاحظه كنيد.

سمیرا62
19-07-2006, 13:25
من این روش رو روی چند برنامه کامپایل شده اجرا کردم ولی بعضیاشون دیگه اجرا نمیشن.چرا؟

shahabmusic
19-07-2006, 13:37
1-Start up Object پروژتون رو به Sub Main تغيير بديد.
2- يه مدول به برنامتون اضافه كنين و كد زير رو توش وارد كنيد:

Declare Sub InitCommonControls Lib "comctl32" ()

Sub Main()

InitCommonControls

Form1.Show

End Sub
user32.
مال منم هيچ وقت درست نميشد ولي از وقتي اين كدو اضافه كردم مشكل حل شد.

Payman_62
19-07-2006, 15:12
سلام.
خوب قسمت مهم کار همینه دیگه.

orange
19-07-2006, 16:57
سلام دوستان
خسته نباشد.
آيا مي توان اين كار را براي Common Controls 6 هم انجام داد؟

majid_kntu
19-07-2006, 17:20
انتظار نداشته باشيد كه هر فايل exe اي به كمك اين روش از كنترل هاي اكس پي استفاده كنه چرا كه قبل از هر چيزي كنترل ها بايد تو حافظه بار بشن واين كار توسط تابع API با نام InitCommonControls انجام ميشه .بايد بگم اين مهمه كه اين تابع ( يا به قول برنامه نويساي وي بي ساب روتين) كجا فراخوني بشه مثلا اگه اونو تو رويداد Form_Load فراخوني كنيد موقع اجرا پيغام خطا دريافت مي كنيد و برنامه بسته ميشه.

majid_kntu
21-07-2006, 19:39
Orange عزيز فكر كنم راه حل مشكلتو بتوني تو كامنت هاي قبلي همين تاپيك پيدا كني .براي جلو گيري از زياده گويي جوابتو نميدم ولي اگه نتونستي جوابتو تو اونا پيدا كني يه كامنت ديگه اينجا بذار.
ممنون!

majid_kntu
21-07-2006, 19:41
يعني اين روش ذاتاً براي Microsoft Common Controls 6 است.

سمیرا62
22-07-2006, 19:21
مجيد جان از مطلب خوبت ممنونم.اميدوارم بتونيم چيزاي بيشتري ازت ياد بگيريم.

سمیرا62
22-07-2006, 19:23
منظورتون از Microsoft Common Controls6 چيه؟؟

Ali-Bahal
22-07-2006, 22:02
تنکیو

majid_kntu
23-07-2006, 08:22
دوستان به اين وسيله اصلاح مي كنم.ويژوال بيسيك دات نت 2005 از سيستم كاملا متفاوتي براي پياده سازي كنترلهاش استفاده مي كنه و ربطي به اين تكنيك نداشت.اگه دچار سو تفاهم شديد بايد بگم اون از .Net Framework 2.0 استفاده مي كنه.

majid_kntu
26-07-2006, 23:42
براي توليد اعلانيه از برنامه زير كه هر چند كامل نيست ولي كار مي كنه استفاده كنيد.
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

majid_kntu
26-07-2006, 23:44
قبل از استفاده از برنامه بالا مطمئن شويد مراحل شرح داده شده در كد برنامه خود را بدرستي انجام داده ايد

سمیرا62
27-07-2006, 18:37
كمك!
برنامه بالا رو روي يه فايل اجرا كردم ديگه باز نميشه error مي زنه

majid_kntu
07-08-2006, 19:48
كمك!
برنامه بالا رو روي يه فايل اجرا كردم ديگه باز نميشه error مي زنه


فايل اعلانيه آن را پاك كنيد يا تغير نام دهيد

majid_kntu
22-02-2008, 17:44
اين تاپيكو خيلي وقت پيش زدم!
يادم رفته بود اينو هم اضافه كنم.
براي اينكه اعلانيه برنامه هميشه همراه برنامه تون باشه بهتره اونو به شكل resource به برنامه پيوست كنيد.
براي اينكار از برنامه زير استفاده كنيد:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
طرز كارش سادس توضيح نمي دم.
به اين ترتيب ديگه با جابجا شدن EXE‌يا DLL اعلانيه برنامه غير فعال نميشه.