الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الأسمبلر 32 - بعض البرامج مع الكود

مغلق
بدأه chik في 11 يونيو 2004 · 41 رد · 5,771 مشاهدة · في لغة Assembly لأنظمة 16, 32, 64 بت
مشاركة: واتساب X فيسبوك تيليجرام
#26

السلام عليكم ورحمة الله وبركاته..

جميله فكرة التحكم في قائمة Start التي طرحها الأخ أحمد .

وأعتزر له عن تقديم البرنامج مره ثانيه باستخدام push , call بدلا من invoke وذلك لعناء مراجعة الكود بعد التحويل وخاصة بعد التعليق على الكود وعلى وعد أن أستخدم invoke في المرات القادمة إن شاء الله .

البرنامج الآن أصبح جاهز للعمل وأود أن تجربوه على XP وسوف تلاحظوا أن الأدوات تأخذ شكل أدوات ال XP وذلك لادراج ملف mainfest بجواره . ولكنها طريقة غير عمليه وعندي فكره بجعل البرنامج يتضمن البيانات التي يحتويها الملف وعند التشغيل يتم انشاء الملف وعند الغلق يتم مسحه ولكن أعتقد أنه توجد طريقه أخرى بدل من هذه.

البرنامج هذه المره بنافذه عربيه دون تغيير في الكود (راجع ملف الريسورس)

أخوكم أحمد من مصر

ArabicDialer.zip

#27

أشكر الأخ أحمد غريب والأخ chick على وقوفهم بجانبي ومساعدتهم لي جعله الله في ميزان حسناتهم

#28

السلام عليكم

الاخ Asm4all البرنامج لا يعمل على XP ساقوم بمراجعة الكود هذا المساء إن شاء الله.

والسلام

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#29

السلام عليكم,

لم أجرب البرنامج على XP لأني لا زلت أشتغل على 98 كما أني لم أجرب الإتصال لأنه ليس لدي موديم. وعلى العموم البرنامج جميل. وقبل أن أرى الكود أريد أن أعرف ما الفرق بين الأزرار افتح الخط و اطلب الرقم.

ولدي بعض الملاحظات - قد لا تكون ذا أهمية لأني كما قلت لم أجرب البرنامج شغالا - وهي إمكانية إضافة زر لمسح الحرف الأخير في حالة ما إذا غلطت في إدخال الرقم حتى أتمكن من تغييره. والملاحظة الأخرى هي حين أريد أن أخل رقم ما وأضيف العلامة # أو * تأتي هذه العلامات على اليسار وحين نضيف رقم آخر يبقى على اليسار جنب هذه العلامات. وكما يمكن أن نضيف أيضا إمكانية تركيب الأرقام مباشرة من أرقام الكايبورد ونترك الإختيار للمستعمل مثل ما يقع في حاسبة الوندوز على سبيل المثال.

أتمنى أن تفيدك هذه الملاحظات - إذا كانت في محلها - حتى تتمكن من تطوير برنامجك.

إلى اللقاء.

#30

أشكركم على التعليق وفي الطريق لتطوير البرنامج اما زر فتح الخط فهو لعملية الرد على المكالمات الوارده

#31

السلام عليكم ورحمة الله وبركاته..

بالنسبه للأخ أحمد غريب البرنامج الذي زكرته جميل ولكن أين الكود فالملف لا يحتوي الا على ال EXE فقط.

وأشكرك على توضيح النقاط الغير مفهومه في الكود السابق.

وأشكر الأخ chick على هذه المساعده وأحييه على البرنامج الجميل الخاص بالشاشه وعلى شرحه لمتطلباته كما أشكرك على الداله LoadImage , بالفعل تمكنت من تحميل الصور (Bmp) من على الهارد وقمت بعرضها على الديالوج يصوره جيده و أود أن أعرف كيف يمكن تحميل ملف (JPG) , (GIF)

وهل توجد طربقه لمعرفة البروتوكول المأخوذ لانشاء ملف BMP أو JPG مثلا.

أخوكم أحمد من مصر

#32

السلام عليكم,

الأخ Asm4all أنا سعيد أنك توصل إلى حلول لبرنامجك كما أنا سعيد ان الأمثلة أفادتك في شيء.

فيما يخص الصور من نوع GIF أو JPG فهذه لا يمكن أن نستعملها مباشرة. فكما نعلم أن هذا النوع مختلف عن BMP حيث أن النوعين السابقين نوعان مضغطان كل بطريقته الخاصة.ولإستعمال هذا النوع إما أن نستعمل الألغوريثم الذي استعمل للضغط حتى نقوم بفك هذا الضغط من جديد ونقوم بالإستعمال - وقد نجد هذا في النت - أو نقوم باستعمال بعض الدوال الجاهزة بالأسمبلر وإضافتها في برنامجنا إذا كنا لا نريد أن نشغل رأسنا أكثر من اللازم وهذه أيضا موجودة في النت - ليست على بالي الآن - وانضر في أمثلة الأسمبلر في MASM فإن لم تخني ذاكرتي أضن أن هناك أمثلة لصور GIF أو jgg .

أتمنى لك التوفيق وإلى اللقاء.

#33

السلام عليكم ورحمة الله وبركاته...

شكرا عزيزي chick

بالنسبه لبرنامج الهاتف فقمت باضافة زر لمسح الحرف الأخير من الشاشه وبالنسبه للعلامات # , * فكل منهما تعمل كحرف انجليزي لذلك تأخذ سلوك كتلبة الانجليزي وسط العربي فتغير من ترتيب الحروف ولكنها مخزنه في الذاكره بالترتيب الصحيح وعند الطلب يتم ارسال النغمه الخصة بكل زر بترتيبه في الذاكره.

ومن ناحيه أخذ الرقم من الكيبورد حاولت فعل ذلك ولكن لم أفلح ربما لسوء اختياري للأمر الخاص باختبار حدث الضغط على زر من أزرار الكيبورد حيث في دالة الديالوج جربت :

.if uMsg == WM_KEYDOWN

jmp exitdlg

.elseif uMsg == WM_CHAR

jmp exitdlg

.endif

ولم تفلح أي منهما لذلك أود توضيح كيفية معرفة هذا الحدث.

أخوكم أحمد من مصر

#34

السلام عليكم,

الأخ Asm4all : كما قلت لك مسبقا لم أتمكن من تجريب البرنامج في التشغيل لعدم توفري على اللازم وبما أن الأشياء شغالة فهنيئا عليك.

فيما يخص قضية الكايبورد ففعلا لن تشتغل على الطريقة التي دكرت . وهنا يمكن أن نستعمل طرق مختلفة كمثل أن نصنع الأزرار بواسطة الكود وبما أن الزر هو عبارة عن نافدة فسيكون له دالة لمعالجة الرسائل ومن ثم يمكن أن نعالج جميع الرسائل ومن ضمنها الضغط على أزرار الكايبورد . وبما أن هنا لدينا أزرارا كثيرة فقد تكون هده الطريقة ربما شيئا ما طويلة ولكن بقليق من التحايل يمكن أن نجمع كل الأزرار لأن لهم تقريبا نفس الوضيفة. والطريقة الثانية والتي ربما تكون أفضل هنا حسب رأيي هي عمل هوك HOOK على البروسس الدي يهمنا وهدا سيفك الأمر. وسأحاول المرة القادمة أن أعطي مثال على هده الطريقة بأن أعطي مثال كحاسبة الوندوز . أتمنى أن يكون لدي الوقت لأكتبه هدا المساء لأضعه هنا غدا إن شاء الله.

إلى اللقاء.

#35

السلام عليكم

اسف على الغيبه كنت ومازلت مشغول بشويه اعمال كان الله فى العون.

الاخ الحبيب Asm4all اليك و الى جميع الاحبة فى المنتدى الكود كامل لى العبه ارجو ان تعم الفائده, وإذا كان هناك اى إستفسار انا فى الخدمه إن شاء الله, والاخوه الخبراء مشاء الله فى إزدياد مستمر اللهم زد وبارك.

البرنامج كبير نوعاً ما ولكن الجزء الذى يهمك هو Open Bitmap, لم اضع اى شرح فى الكود كما ان هناك جزء بسيط فى الكود لم يستخدم فى البرنامج.

والسلام

mosaic.zip

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#36

السلام عليكم,

الأخ Asm4all كما وعدتك سأعطيك طريقتين لكن نتمكن من استعمال أزرار الكايبورد في نافذتنا ديالوغ.

لم يكن لدي الوقت الكافي لإنهاء البرنامج كاملا ولكن هنا نفهم ما نقصده أي كيف نتعامل مع الأزرار. البرنامج يحتوي على 4 أزرار - اكتفيت بأربعة ولكن يمكن أن نستعمل العشرة أرقام بنفس الشكل -من 0 إلى 3 وحين ننقر على عدد يزيد في العدد الضاهر على اليمين وكذلك حين نضغط على زر رقمي سواء الأرقام الخاصة في يمين الكايبورد أو الأزرار الرقمية الأخرى نقوم بنفس المهمة.

ولأجل هذا سأعطي هنا طريقتين :

-طريقة HOOK : ما يعرف بالهوك هو استقبال الرسائل الموجهة إلى نافذة ما وقد نقوم بمعالجة الرسالة نحن ومن ثم يمكن أن نوجهها للدالة الأصلية التي من المفروض أن تعالج البرنامج. وهنا نجد نوعين من هذا الهوك : إما أن يكون عاما Wide وهنا نستقبل الرسائل التي نريد والموجهة إلى أي نافذة في أي برنامج أو أي بروسس وهنا يتطلب الأمر أن نضع الهوك داخل كود في مكتبة من نوع DLL وهذا لا يرزمنا كله في برنامجنا لأننا نريد فقط أن نتحكم في رسائل الكايبورد الخاصة بنافذتنا. والنوع الثاني سيكون بالطبع هوك محلي إن صح القول وهذا الذي سنستعمله. وعكس الأول الكود هنا يمكن أن يكون داخل نفس برنامج النافذة التي تهمنا.

والطريقة إذن تكون كالتالي : سنضع هوك أو دالة ستقوم بمعالجة برنامج الكايبورد وهذه الدالة ستقوم بمعالجة الزر المضغوط فإذا كان زر لرقم من 0 إلى 9 سنقوم بإضهار الرقم في النافذة الخاصة لذلك وفي الحالة الأخرى نرسل الأمر إلى دوال المعالجات الأصلية لتقوم بما تبقى من شغل.

وفي الملف المرفق تجدون المشروع كاملا لهذه الطريقة:

ButtonKeyHook.zip

#37

السلام عليكم,

سأتم الموضوع السابق وهنا سأعطي الطريقة الثانية والتي تعرف بطريقة SubClassing .وهنا يمكن كما نعلم أن نضيف أي كونترول وعلى سبيل المثال ButtonControl إلى نافذتنا عن طريق الكود مثلما سنخلق نافذة جديدة وللعلم أن أي كونترول يعتبر بمثابة نافذة وهنا لن نجد أي مشكل فبما أن الكونترول سنخلقه فإننا سنخلق معه دالته الخاصة لمعالجة رسائله وما علينا إلا أن نضيف معالجة ازرار الكايبورد . أما إذا كان لكينا الكنترول - مثلا صنعناه عن طريق الرسوسرس - فهنا نقوم بما يلي وهي طريقة تشبه طريق الهوك وقد تختلف في بعض المبادء فقط. نبحث عن عنوان الدالة التي تعالج رسائل الكنترول الذي يهمنا ونغير دالته إلى دالة نصنعها نحن ونضع فيها ما نريد أن نعالجه. والطريقة ستعمل كما يلي:

حين يتلقى الكنترول رسالة ما فعوض أن يرسلها إلى دالته الأصلية سيرسلها إلى دالتنا والتي ستقوم بالواجب . وهنا يجب علينا أن نرجع الأمور إلى الدالة الأصلية في الرسائل الأخرى التي لم نعالجعا في دالتنا الخاصة. فمثلا لو نفترض أن دالتنا التي سنضيفها نحن نكتفي فيها بمعالجة أزرار الكايبورد فقط فإذا لم نرجع الأمور إلى الدالة الأصلية فحين يستقبل الكنترول رسالة أخرى مثل الضهور على الشاشة مثلا فلن يجد الكود الخاص بهذا وبرنامجنا قد لا يسير على الشكل الذي نتوقعه.

والدالة التي تمكننا من تغيير دالة كونترول ما هي SetWindowLong . ومكتبة MSDN تقول ما يلي :

LONG SetWindowLong(
  HWND hWnd,       // handle of window
  int nIndex,      // offset of value to set
  LONG dwNewLong   // new value
)

البارامتر الأول هو هاندل النافذة التي نريدها.

البارامتر الثاني يقول لنا مذا نريد تغييره . وللغلم هذه الدالة يمكنها تغيير أشياء عدة وفي مثالنا بما أننا نريد تغيير دالة معالجات الرسائل سنعطيها الرقم GWL_WNDPROC .

أما البرارامتر الأخير فسيكون طبعا العنوان للدالة الجديدة التي ستحل مكان الدالة الأصلية.

والمهم أيضا ما ترجعه هذه الدالة إذا تم كل شيء بنجاح وهو عنوان الدالة الأصلية وهذا يجب أن نحفضه لكي نستدعيه عند الحاجة.

وفي الملف المرفق تجدون نفس المثال السابق ولكن هنا استعملنا هذه الطريقة للتعامل مع أزرار الكايبورد.

أتمنى أن يكون هذا الشرح مفيدا وإلى اللقاء إذا كان هناك أي لبس.

ButKeySubClass.zip

#38

السلام عليكم ورحمة الله وبركاته..

أخي أحمد أشكرك على كود اللعبه. الكود كبير بعض الشيء لذلك سأحتاج لوقت لدراسته و التعلم منه وطرح أسئله فيه.

الأخ العزيز Chick أشكرك على البرنامج الذي يوضح كيفية التعامل مع الكيبورد ButClas وتوجد تعليقات عليه:

1 ) البرنامج يقوم بمعالجة الضغط على الكيبورد في حالة ما يكون الزر صفر فقط هو الفعال ولا تعمل الداله مع غيره .

2 ) يقوم البرنامج بارسال الداله Beep دون أن نطلبها منه وهذا معناه عدم استقبال الأمر من قبل النافذه.

أما البرنامج الآخر ButKey والذي يعتمد على ال HOOK فهو رائع فلا توجد به هذه الملاحظات.

ملحوظه بسيطه :

لا تستعمل

if x >= 1000

فانها تعادل

cmp	x,1000
ja	@@@@
je	@@@@

ولكن استعمل :

if x > 999

فهي تعادل

cmp	x,999
ja	@@@@

كذلك الحال مع

if x<= 1000

استعمل

if x< 1001

كلاهما يؤدي نفس الغرض ولكن الأولى تستخدم عمليتين إختبار بينما الثانيه تستخدم عمليه واحده (توفير في مساحة ووقت البرنامج)

معزرة ! فالتعامل مع الميكروكنترولر يكون بال Cycle , ال Byte

ولي سؤال كيف يمكن الانتقال الى عنوان معين في بروسيدير من خلال بروسيدير آخر .كمثلا الانتقال من نقطه معينه في KeyProc الى نقطه معينه في WndProc.

وكيف يمكن تمرير بيانات بين كلا من الدالتين عن طرق الستاك ؟

#39

السلام عليكم,

الأخ Asm4all : عندك حق فيما قلت باستعمال <= . وكما قلت مسبقا هذا البرنامج كتبته بسرعة ولم يكن اهتمامي ب Optimization بل فقط إعطاء شيئ شغال.

فيما يخص الضغط على الأزرار في المثال الأول كما ذكرت , فهذا شغال عندي بكل الأزرار وليس الزر 0 فقط فبما أنه يعطيك Beep في بعض الحالات فجرب أن تغير رقم الكود للأزرار وأن تعطيها الأرقام الخاصة بها . فهذه قد تختلف خاصة في بعض الكايبوردات الحديثة وكان من الأجدى في البرنامج أن نتعرف على نوع الكايبورد قبل أن نبدأ المعالجة ولكن هذا قد يزيد شيئا ما في الكود وقد يخرجنا عن النقطة الأساسية التي كنا نريد أن نتطرق لها. فجرب بالكودات الخاصة بالكايبورد اللي عندك ثم نناقش من بعد.

اقتباس
ولي سؤال كيف يمكن الانتقال الى عنوان معين في بروسيدير من خلال بروسيدير آخر .كمثلا الانتقال من نقطه معينه في KeyProc الى نقطه معينه في WndProc.

وكيف يمكن تمرير بيانات بين كلا من الدالتين عن طرق الستاك ؟

هنا لم أفهم المقصود جيدا. فمثلا حين أكون في دالة KeyProc ما علي سوى أن أرسل رسالة للنافذة حتى أتحول إلى الدالة الخاصة بالرسالة. فمثلا إذا أرسلت WM_MOUSEUP فطبعا هذا سيستدعي الذهاب إلى WndProc وخاصة إلى البرنامج الذي يعالج هذه الرسالة. وفيما يخص الستاك فالإستدعاء يتم دائما على نفس الطريقة.

هذا حسب ما فهمته من التدخل وإذا كان هناك أشياء أخرى نتطرق لها في المستقبل إن شاء الله.

تم تعديل هذه المشاركة بواسطة chik في 5 نوفمبر 2004 في 17:39

#40

السلام عليكم,

عدت مرة أخرى إلى هذا الموضوع وسأعطي هنا برنامجا على شكل كامرا. حين ننجز البرنامج تظهر شاشة صغيرة في أعلى السكرين وستتحول الماوس إلى شكل كامرا بحيث يمكن أن نتجول بها عبر السكرين أو مختلف النوافذ والصورة ستلتقط على الشاشة الصغيرة ويمكن أن نختار نوع الزوم وهنا قد أعطيت 5 فقط زوم عادي + أو - 20% أو + - 50% ولتغيير الزوم أو الخروج من البرنامج ننقر باليمين على النافذة الصغيرة ويظهر لنا Menu نختار فيه ما نريد .

وفي هذا البرنامج يمكن أن نأخذ رأيا كيف يمكن أن ننقل صورة من مكان إلى آخر وتكبيرها أو تصغيرها باستعمال الدالة StretchBlt وكذلك كيف نتعامل مع نوع المينيو الغير مستقر باستعمال الدالة TrackPopupMenu .

إذا كان فيه أي اقتراح أو تعديل يمكن وضع كل هذه الإقتراحات للناقشها هنا.

إلى اللقاء.

Camera.zip

تم تعديل هذه المشاركة بواسطة chik في 5 نوفمبر 2004 في 17:40

#41

السلام عليكم,

وللذين يفضلون البرنامج السابق ب س++ نفس البرنامج هنا وعلى سبيل المثال فيما يخص الفرق بين اللغتين يمكن أن نشاهد الفرق في طول البرنامجين رغم أن الكود بالأسمبلر يظهر أطول.

إلى اللقاء.

Camera2.zip

#42

السلام عليكم,

في قسم هنا في المنتدى كان سؤال أحد الأعضاء عن كيفية إخفاء الصور التي يضمنها داخل برامجه وقد اقترحت طريقة وقمت ببرمجة بعض الأشياء بالأسمبلر ولمن يهمه هذا يمكن مشاهدة الموضوع التالي وتحميل المشروع HideImage من هذا الرابط :

/index.ph...pic=50027&st=15

إلى اللقاء.

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…