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

فكرة لعمل أداة " Text Box" مطورة.

مغلق
بدأه Abdullah.Alshammeri في 13 أكتوبر 2006 · 21 رد · 2,501 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم .

الفكرة بسيطة جدا ..

ما رأيكم لو أنشأنا أداة تحكم مثل الصندوق النصي ..

الهدف :

التحكم بها .. مثلا نستطيع استخدامها في مشاريع كثيرة ..

أنا عندما حاولت عمل برنامج يعمل تلوين لكلمات ..اصطدمت بمشكلة محدودية الاداة الجاهزة ,

وعندما حاولت اضافة ميزة ترقيم الاسطر .. ايضا واجهت مشاكل ..

----------------

نعمل صندوق نصي بسيط يعمل على الويندوز فقط لاغير .

نستخدم دالة واحدة وهي TextOut ..مع دوال اضافية مساعدة ..

مجرد فكرة .. سأحاول ان اطورها .. واللي عنده معلومة او محاولة ..يضيفها .

أتمنى تكون الاداة جاهزة قبل صلاة العيد ..

تم تعديل هذه المشاركة بواسطة الشمري في 13 أكتوبر 2006 في 03:51

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#2

عندي حالة مشابهة جدا .. و بالتحديد هذه الأيام! لكن في لغة D

هناك مكتبة gui غير مكتملة اسمها Harmonia و هي لا تحتوي على عنصر Text Area (فيها TextBox و لكن سطر واحد) و حاليا عندي مشروع صغير جدا و لكنه يحتاج هذا العنصر, ففكرت اني اعمل واحد. و فعلا خلف الكواليس لا يحصل شيء اكثر من TextOutW تقريبا. لذلك الفكرة المفروض تبقى نفسها.

#3

هل هذه المكتبة "harmonia" مفتوحة المصدر .. بحثت في موقعها وما وجدت شيء .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#4

لا اريد تغيير الموضوع, و لكن نعم

http://harmonia.terrainformatica.com

و المصدر موجود في الـ svn

svn://harmonia.dyndns.org

اذا كنت تريد الاطلاع على السورس كود الخاص بمحرر النصوص (ذو السطر الواحد) فقد ارفقته.

behaviors.zip

#5

شمري... حتى وانت صايم نشيط :)

أنا اليوم قبل الافطار شفت موضوعك، وما عرفت حتى أرد!!

الآن بعد الافطار الحمد لله تمام...

لنبدأ على بركة الله.

ماذا هي خصائص التكست بوكس الذي ستبنيه؟

هل تعاملت مع ريتش تيكست بوكس؟ وما رأيك به؟

---------------> كأني بأعمل معاك مقابلة تلفزيونية :)

#6

فتحت الوورد و قعدت شوية اشخبط و ادون بعض افكاري .. بس اسف دونتها باللهجة العامية و بشكل مخربط (كتبت الافكار و هي في راسي) و كنت القي في نفس الوقت نظرة على الكود في هارمونيا .. احم, على كل حال, اليكم شخابيطي:

اقتباس
بسم الله الرحمن الرحيم

شخبطة للـ edit box او محرر النصوص.

اول شي, الكتابة مو كلش مشكلة, و همينة الـ insert و الـ delete ان شاء الله همينة مو كلش مشكلة.

المشكلة هي انه لمن الماوس يضغط على مكان معين من صندوق الكتابة, لازم نحدد هذا المكان شنو هو بالنص, يعني لازم نطلع الـ index مال caret او المؤشر .. مدري شيسموه. زين شلون نسويهة؟ خلي نشوف هارمونيا شلون يسويها بسطر النصوص الواحد ..

زين, عدهم int findCharPos(point p) و هذا الظاهر هو الـ function المسؤول عن العملية.

همم .. اول شي ياخذ الـ graphics مال وندو ..و هذا الـ graphics بيه فنكشن اسمه measureChars و تنطيه فد string .. يعني تكله (حسب ما اتصور) قيسلي هالحروف اذا كتبتهة شكد راح تاخذ مساحة؟ و بويندوز هذا راح يستدعي nativeMeasureChars بالكلاس NativeGraphics داخل الـ implementation الخاصة بالوندوز. (وقت كتابة هذه الورقة لا يوجد Implementation في هارمونيا لنظام غير الوندوز) و الكود مال هذا الفنكشن هو عبارة عن:

  size nativeMeasureChars(wchar[] chars)
  {
	  SIZE sz;
	  BOOL r = GetTextExtentPoint32W(_hdc, chars, chars.length, &sz);
	  debug if(!r)
	  {
		DWORD dw = GetLastError();
		if(dw != ERROR_SUCCESS)
		  Application.alert(format("measure chars err:%d",dw));
	  }
	  return size(cast(int)sz.cx, cast(int)sz.cy);
  }

و كما نرى, القيمة المرجعة هي من نوع size و اللي هو عبارة عن x,y تمثل ابعاد شكل معين. زين بس هذا الـ size شيعني؟ او عن شنو يعبر؟! اتصور انه يمثل ابعاد المربع اللي يحتله النص لمن تكتبه عالشاشة .. طبعا على فرض انه المساحة تكفي .. حسب ما اظن.

زين, نرجع لـ findCharPos .. اشو هسة دا لاحظ فد شي غريب, و هو انه هذا القياس مال حروف هو مو كل شي .. اصلا عبالك فد شي هيجي ماله علاقة!! شنو هاي؟

زين .. اول شي اني لاحظت كبل شوية فد متغير داخل الكلاس اسمه firstChar و الكلاس اللي دا احجي عنه هو الـ LineEditor, فشنو هو هذا الـ firstChar؟ هو من نوع int بالمناسبة. اتصور و الله اعلم انه هو اول حرف يظهر من النص داخل الصندوق .. يعني لمن النص يصير اكبر من الصندوق. زين, ليش دا اسأل عن هذا المتغير؟ لانه مستخدم داخل findCharPos فلهذا غير نعرف شنو هوة؟ زين, نرجع لـ findCharPos, هذا هو الكود:

  int findCharPos(point p)
  {
	auto Graphics g = new Graphics(host.window);   
	g.font = host.style.font;
	p.x -= area.origin.x;
	p.x += g.measureChars(buffer[0..firstChar]).x;
	int xp = 0;
	for(int l = 1; l <= buffer.length; ++l )
	{
	  int xt = g.measureChars(buffer[0..l]).x;
	  if( p.x < (xp + xt) / 2 )
		return l - 1;
	  xp = xt;
	}
	return buffer.length;
  }

فإذا, هو ياخذ نقطة .. بس هاي النقطة هي نسبة الى شنو؟ يعني relative to what? ما ادري بالحقيقة. بس خلي نشوف. اول شي يطرح من الـ x مالتهة الاصل مال area.origin .. لحظة, شنو هاي area.origin؟؟ هممم .. اني اعرف انه المكان rect مال widget اسمه place مو area, بس هذا الحجي داخل الـ widget class .. بس شنو .. الـ LineEditor مو فرع من الـ Widget, لهذا لو نروح نجيك .. ههههه هو نفسه!! اكو فنكشن اسمه place و هو يقوم بارجاع area!! شوف الغباء!! شبيك انت .. place هو property يعني بالاصل فنكشن .. بينما area هي متغير, يعني data field. المهم, الـ place هو بالنسبة الى مساحة النافذة, فإذا عندك نقطة, بعدين تطرح من الـ x مالتهة نقطة الاصل مال مربع, فانت بالحقيقة دتاخذ الفرق (المسافة) بينهة و بين نقطة الاصل, و هذا الشي يخليني اظن انه هاي النقطة p هي بالنسبة الى مساحة النافذة همينة. زين, بعدين ديضيف النتيجة مال measureChars للـ x مال p, بس هو بس ديقيس الحروف من اول حرف الى firstChar, و اللي يبدو لي انه ديشوف هاي الحروف اللي مو ظاهرة, شكد تاخذ مساحة؟ يلة هسة لازم اروح للجامع, بعدين عود نرجع.

رجعت, هسة جنت دا افكر .. نكدر همينة نباوع على شغلات مكتوبة بجافا و نشوف شلون يسووهة .. و لو يمكن تصير صعبة لانه ما عندي فكرة عن الاساس (البنية التحتية) اللي تعتمد عليها الـ guiـات ما جافا.

المهم, نرجع للفنكشن هذاك ابو الـ findCharPos, اذن الماوس ضغط على النقطة p و احداثياتها p.x, p.y و هي relative لمساحة النافذة مال برنامج. زين, راح نتعامل شوية وية p.x اول شي نطرح من عدهة الـ x مال origin مال textbox, يعني نخليهة الفرق بين النقطة p و الجانب الايسر للـ textbox, طبعا الجانب الايسر لانه البطيخة هنا مصممة علمود بس الحجي الانجليزي. (هممم .. هسة جتيني فكرة, ليش مو لمن نكتب النص عالشاشة, ناخذ فد جدول و نخزن بيه كل حرف وين انكتب, بعدين ندور بهذا الجدول على يا حرف موجود بفلان نقطة .. مو اسهل من كل هالهوسة؟؟). زين, نرجع للفنكشن, نلاحظ انه بعدين ضاف طول الحروف الغير مرئية الى p.x, و بعدين يبدي يسوي لووب, نلاحظ انه يدور على النص و يكعد كل شوية يقيس طول النص الى شيء معين. و يشوف .. هل النقطة تقع بين هذا الحرف و الحرف السابق؟ اذا اي, يرجع الحرف المناسب (اظن الحرف السابق).

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

زين, هسة المشكلة اللخة شنو هية؟

اذا صار عدنة نص طويل .. و كل شوية نكعد نضيف و نمسح و نحرر النص .. شلون راح ندبرهة؟؟ يعني نكدر عادي نمسح من string عادي و نضيفله و نسوي insert و كل هاي الشغلات .. بس اشو اني دا شوف انه هذي العملية مكلفة. ليش مو احسن انه نقسم النص الى blocks و كل بلوك يحتوي على حد معين من المساحة, و لمن تفيض هذه المساحة نطير جزء منه و نحوله على block اخرى .. خوش فكرة لو لاء؟؟

المشكلة انه بلكي صار عدنة هواية بلوكات؟؟ نفس الشي راح يتكرر. فنكدر نرتب البلوكات على شكل tree و في اطرافها نضع النص, بس اخاف الشغلة هيجي تصير كلش معقدة و مليوصة!!!

يلة, خلي نجرب اول شي نخلي النص كله بـ string واحد. عود قابل يعني شنو .. لو صار كلش جبير و صار حجمه 50 كيلو بايت .. شنو يعني؟ اتصور الكومبيوترات هسة تكدر تنسخ هذا القدر من الذاكرة في لمح البصر!! مو؟

#7
اقتباس
مدري شيسموه. زين شلون نسويهة؟

يا عيني على اللهجة العراقية (البغدادية ).. ;)

اذا واحد ما فاهم انا ممكن اترجم ..

:P

تحياتي للجميع ..

وربنا يوفقك اخي الشمري

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#8

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

#9
اقتباس
أنا اليوم قبل الافطار شفت موضوعك، وما عرفت حتى أرد!!

الآن بعد الافطار الحمد لله تمام...

لنبدأ على بركة الله.

ماذا هي خصائص التكست بوكس الذي ستبنيه؟

هل تعاملت مع ريتش تيكست بوكس؟ وما رأيك به؟

اخوي اسماعيل .. .. كل ما اريده صندوق نص مبسط وصغير جدا .

الهدف هو انك تتحكم به مثل ماتريد .. فقط .فلن يصل ابدا الى مستوى الrich box .

خصائصه :

تقدر تكتب فيه وتغير حجم الخط .. وتضيف اليه ميزة ترقيم السطور .

------

اقتباس
المشكلة هي انه لمن الماوس يضغط على مكان معين من صندوق الكتابة, لازم نحدد هذا المكان شنو هو بالنص, يعني لازم نطلع الـ index مال caret او المؤشر .. مدري شيسموه. زين شلون نسويهة؟ خلي نشوف هارمونيا شلون يسويها بسطر النصوص الواحد

بالظبط .. هذه المشكلة اللي صدمت فيها من اول كود ..

انا فكرت بكم فكرة لكن لم انفذ الى الان .

--

لااملك جهازي الشخصي الان .. بالرغم من اني سويت تطبيق حلو .. ( بصراحة سرقته من الmsdn ) ولكن المشكلة هي اني بعد ان اكتب ... لا استطيع ان اعمل تراجع ولا حذف ..واما الcaret فصار مجرد جرافكس ماله فائدة . .

سأضيف تطبيقي قريبا ان شاء الله .

--

المشاكل اللي واجهتها من اول دقيقة :

- مشكلة اعادة الرسم والاحتفاظ بالرسم :) .

- مشكلة تصميم الاداة بطريقة OOP وهذه رسبت فيها وبشهادة امتياز .

- مشاكل مع المصفوفات النصية ... يبدو اني سأعتمد على ال string الجاهز ..

سأقرا الملف اللي ارفقته يا حسن ... وبالنسبة لشخابيطك اللي كتبت فهي مميزة .. لكن شو معنى " همينة " :D .. فسروها لنا لانها تكررت كثير .

تم تعديل هذه المشاركة بواسطة الشمري في 15 أكتوبر 2006 في 00:54

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#10

همينة = ايضا .. او مرة اخرى (اذا جائت قبل فعل) و بالمصري: كمان

اشو = اشوف .. الاحظ .. يدل عادة على الاستغراب.

هسة = الان

(البحر المتدارك ) اضافه روفا p:

خوش فكرة لو لاء؟؟= فكرة جيدة اليس كذلك

كلش جبير = كل شيء كبير

عبالك طويلة و معقدة=تبدو طويلة ومعقدة

مال . مالة = التابع . التابعة بالسعودي واليمني حق بالمصري بتاع (ضمير ملكية) قاعد اتفلسف

تم تعديل هذه المشاركة بواسطة romanof في 16 أكتوبر 2006 في 22:39

#11

اضفت شخابيط جديدة ..

اقتباس
زين, هسة خلي نشوف, نريد نحلل و نصمم هذا المربع مال نصوص.

اول شي الواحد لمن يكتب فد شغلة, لازم نشوف الـ caret وين صايرة, و نـ insert النص هناك. الـ insertion يصير عالكتابة, اللي هي مراح تكون string عادي و انما فد اوبجكت خاص بيهة (تغليف يعني) نسميه Text او شي من هالقبيل. زين, نفس الشي بالنسبة للديليت.

النص راح يكون موجود بصندوق scrollable و هذا الصندوق يتابع مكان الـ scrolling, يعني لازم يحتفظ بالـ state مال scrollbar بحيث اذا ننطيه نقطة داخل مساحته, يحولها الى نقطة قيمتها هي relative للصندوق كله (و كأنه بدون scrolls يعني).

لمن نكتب الحروف, نشوف اول شي عرض الصندوق, بعدين نقرا النص كلمة كلمة و نحاول نكتبه بالسطر الحالي, اذا ماكو مساحة كافية, ننتقل للسطر الجاي, و نحتفظ بالـ indecies مال بدايات الاسطر في جدول معين.

نكدر نستخدم مكتبة ICU علمود ترتيب الحروف العربية .. بس طبعا من لغة D لازم اول شي نسوي لها فد wrapper بالـ C و نسويله همينة wrapper لاخ بالـ D للرابر مال سي.

لمن نضغط بالماوس على مكان معين بالصندوق, اول شي نطلب من الـ scrollable box انه يحدد لنا مكان النقطة الحقيقي نسبة الى الصندوق دون سكرولات, بعدين نستخدم طريقتي الخاصة لمعرفة الحرف المطلوب, و هذه الطريقة هي:

طبعا على فرض ان هذا المربع مال نصوص مالتنة يحتوي فقط plain text يعني بدون اي formatting و اذن كل الحروف لها نفس الطول, زين .. ناخذ طول الحرف, و على اساسه نحسب في اي سطر نحن الان. بعدين نروح على جدول الاسطر الي سجلناه و نطلع منه الحرف اللي يبدي هذا السطر .. بعدين نسوي الطريقة مال measureChars مدري شنو اللي يستخدمها هارمونيا.

اتصور شغلة الحروف العربية و الـ ICU شوية معقدة .. خلي اول شي نسوي بس بالحروف الانجليزية .. و بعدين نضيف دعم للحروف العربية.

بس من هسة نضيف خاصية للـ scrollable انه يبدأ إما من اليسار او اليمين .. علمود لمن نبدي نضيف الدعم مال عربي يكون اكو فد شي جاهز already.

اذن, اول شي نبدي بكتابة الـ scrollable, زين .. بعدين نحول على صندوق النصوص نفسه. بس شنو العلاقة بين الـ TextBox و بين الـ scrollable؟ هل هي علاقة inheritance ام composition؟ انا حاليا افضل اخليهة composition, يعني الـ TextBox يستخدم الـ scrollable و لا يرثه. و بالهالحالة لازم الـ scrollable يوفر لنا فد شي من نوع rect يمثل المساحة اللي نكدر نكتب عليهة.

زين, نجي عالسكرول افندي هذا ..

اول شي هو عبارة عن مساحة مربعة و فيها مكان من الجانب و من تحت لوضع scrollbar .. مساحة الصندوق الحقيقية لا يمكن ان تظهر كلها على الشاشة, لذلك اذا كانت مساحة الصندوق الحقيقية اكبر من المساحة المتاحة لرسمه على الشاشة, فإننا نرسم جزء من الصندوق فقط, و هذا الجزء يمكن تغييره من قبل المستخدم عن طريق تحريك الـ scrollbars هذه.

الصندوق له طول و عرض., اذا كان الطول اقل من المساحة المتاحة للرسم, لا نفعل شيء .. اذا كان اكبر, فإننا نقوم بتفعيل الـ scrollbar .. و لتحديد ماللذي نرسمه, نقوم بقراءة المكان اللي محطوطة بيهة اليدة مال السكرول بار و نحدد عن طريقهة اي جزء من الصندوق سيرسم.

نفس الشي طبعا يتكرر مع عرض الصندوق.

طبعا مكان الـ scrollbars لا يمكن ان يكون ثابت .. لانه اذا لم يكن هناك حاجة له فلن نرسمه, اما اذا كان له حاجة فسنرسمه. و لكن عندما نرسمه فإن المساحة المتاحة داخل النص سوف تقل اصلا, لان جزء من هذه المساحة سوف يكون مخصص للـ scrollbar. و اني كلت كبل شوية انه الـ scrollable هذا لازم يكون بيه فنكشن ينطي المساحة المخصصة للرسم, علمود لمن نستخدمه نعرف شنو الحدود اللي نكدر نرسم بيهة.

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

اتمنى يكون هناك شي مفهوم .. :lol:

#12

هسة خلينا من الحروف العربية وش لك بدوخة الراس .

بالنسبة لقيسات الحروف ومن هالكلام .. يوجد في الWinAPI دالة تعطيك ابعاد الحرف بالميكرومتر .. :P

ايضا بالنسبة لعمل اداة scroll زي اللي بالويندوز .. فهي جاهزة .. المشكلة كيف نعمل scroll للصندوق النصي ..

انا سبق ان نظرت لادوات gui للالعاب .. معمولة على الGL الاداة يتم رسمها بطريقة عادية ( خطوط ) .. تمثل ابعاد الاداة ..

لكن انت ما كلت لي ... وش مكتبة الجرافكس اللي تستخدمها ,, وهمينة .. كيف تكدر تستقبل الinput مال الكيبورد .. >> يبغى يتكلم عراقي بأي طريقة .

انا احس ان المشكلة الرئيسية هي بشيئين ::

- كيف نقدر نعثر على النص اللي على المشيرة ..

- كيف نعمل scrolling او ما ادري وش يسمونه .. للنص .

ايضا اتمنى اننا ما نعقد الكود بالoop يكفي نستخدم شوية OOP .. لانه حنا ما قاعدين نطور مكتبة .. كلها Text Box .

تم تعديل هذه المشاركة بواسطة الشمري في 16 أكتوبر 2006 في 20:57

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#13

بالنسبة لهارمونيا .. خلف الكواليس كل شي يتم بالوندوز win api و لكن انا بالنسبة الي فقط استقبل EventKey و EventPointer للماوس و الكيبورد. و كذلك الرسم عن طريق الوندوز من خلف الكواليس.

اقتباس
ايضا بالنسبة لعمل اداة scroll زي اللي بالويندوز .. فهي جاهزة .. المشكلة كيف نعمل scroll للصندوق النصي ..

هي جاهزة في هارمونيا ايضا

اقتباس
انا سبق ان نظرت لادوات gui للالعاب .. معمولة على الGL الاداة يتم رسمها بطريقة عادية ( خطوط ) .. تمثل ابعاد الاداة ..

هذا بالضبط ما يحدث في هارمونيا!! و لكن يمكنك ايضا رسم الصور بدل من مجرد خطوط.

اقتباس
انا احس ان المشكلة الرئيسية هي بشيئين ::

- كيف نقدر نعثر على النص اللي على المشيرة ..

- كيف نعمل scrolling او ما ادري وش يسمونه .. للنص .

بالضبط .. هذا هو اللي اني كعدت افكر بيه و اكتب عنه!

ممكن تبدي اول شي بحل المشكلة الاولى .. يعني افترض ان مربع النص حجمه ثابت و لن يكبر ابدا! و بالتالي لا حاجة الى scrolling و قم فقط بالبحث عن مكان النص من المؤشر .. caret او ما اعرف ايش يسموه.

بعدين لما تخلص من هذه النقطة تقدر تضيف الـ scrolling.

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

#14

هذا كود يمكن ينفع ,, جمعته من الmsdn .

زبدة الكود في الملف main.cpp ..

الكود حاولت تتبعه .. لكن يبدو لي أنه معقد شوي .. وتعقيد عالفاضي . أقدر أبني كود اسهل منه :) ,

TextBox.zip

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#15

حتى انا اعرف اشخبط . .

--------------------

المرحلة الاولى من الاداة هي أن تكون أداة من سطر واحد .

أولا:

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

void CreateEditBox(HDC hdc,RECT rect  )

{
	MoveToEx(hdc ,rect.x1,rect.y1,NULL);
	LineTo(hdc,rect.x2,rect.y1);
	LineTo(hdc,rect.x2,rect.y2);
	LineTo(hdc,rect.x1,rect.y2);
	LineTo(hdc,rect.x1,rect.y1);
}

ثانيا: نحن نريد أن نستقبل الحروف المدخلة من الكيبورد .. أنا سأستخدم الWinAPI ..

كل حرف نستقبله من الكيبورد لازم نحوله الى حالتين :

1 - نطبع النص على الشاشة ,, ثم نتحرك خطوة لليمين ... اذا كنا لم نصل لحافة الصندوق النصي.

2 – نضيف هذا الحرف الجديد الى مصفوفة من الحروف .. " مصفوفة نصية" .

3- عشان مشكلة اعادة الرسم .. ويمكن يمسح النص المكتوب .. فنقوم في حالة اعادة الرسم بطباعة جميع حروف المصفوفة .

Case WM_PAINT:

For(…..)
TextOut(…)
Break;

كل ما سبق سهل جدا .

لكن عندنا مشكلة ..

تحرير النص المكتوب ..

يعني نريد نعدل على النص اللي كتبناه ..

هنا مشكلة .. كيف نعرف النص الموجود تحت المشيرة ( Caret ) ,

أتوقع الحل هو كالتالي :

نوجد مصفوفة ذات بعدين :

Char string[100][100];

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

الحين لو فرضنا موقع المشيرة بالنسبة للاداة هو

 X = 1; 
Y= 0;

عندها نبحث في المصفوفة عن الحرف الموجود في

String[0][1] ;

لو أردنا اضافة حرف عند

X=1;
Y= 0;

نضيفه في هذا الموقع :

String[0][1];

لكن نزيح كل الحروف اللي بعد هالموقع الى الخانة التالية من المصفوفة ..

------------------

حلوة فكرة الشخابيط .. تطلع لك افكار .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#16

مشكلة :

عندي مشكلة بسيطة وهي بمسألة حساب موقع المشيرة..

أنا لا اريد حساب موقع المشيرة .. لان النتيجة ستكون غير مرغوبة مثلا

100 , 20 / 60 ,400 / 0,600 .. etc ...

فما اريده أن يكون موقع المشيرة بالنسبة لاداتنا :

x = [ 0 , EditBox . x  ]
y=0

باعتبار ان الاداة الان من سطر واحد فقط .

السؤال : كيف أحول من احداثيات المشيرة من احداثيات الويندوز الى احداثيات الاداة ,

تم تعديل هذه المشاركة بواسطة الشمري في 17 أكتوبر 2006 في 05:17

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#17

أخوي الشمري ماشاء الله نشاط

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

المهم سأحاول أقترح حل للمشكلة من واقع فهمي البسيط لها

الحين اللي فهمته إن ويندوز يعطيك إحداثيات بناءً على الشاشة فبكذا راح تكون بالمئات تقريباً

وأنت تبي تحولها إلى إحداثيات بناءً على الأداة

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

#18

يعطيكم العافية. :)

------------

شمري ، أنا ما فهمت اسلوبك في بناءالآداة، هل تريد رسمها من الصفر؟

ماذا عن بناء نافذة "إبن" تكون هي التكيت بوكس؟ سيوفر عليك كل الرسم والكثير من الدوال تُدعم في النافذة "الويندوزية".

أكرر انني لم افهم بالضبط ماذا تقصد برسم الصندوق بالخطوط!

لو كانت التكست بوكس الخاص بنا هو "نافذة" Child، فلن نواجه مشكلة في تحديد احداثي الفارة وهي ستبدأ من الزاوية العليا اليسرى للآداة (النافذة الخاصة بنا).

بالنسبة للكاريت Caret تلقي رسالة حرف WM_CHAR نقوم بالاتي :

1- نقوم برسم الحرف في المكان الحالي (عادي).

2- عداد اسمه مثلا CaretCounter أو xCaret سيزداد 1 ، وبهذا نعرف اننا في المرة القادمة سنرسم الحرف الثاني.

3- موقع الرسم الحالي هو عرض الحرف CharW مضروبا في العداد الذي يزيد مع كل حرف (في حالة انتهاء السطر مفهوم تصفير الاحداث الاكسي وزيادة الواي).

4- نحتفظ بالحرف في السلسلة المذكورة.

-----------

الكود تقريبا هكذا (لا املك فيجيوال سي حاليا):

case WM_CHAR :
			  string[yCaret][xCaret] = (char) wParam;							  

			  HideCaret (hwnd);		   //نخقفيها وقت الكتابة	 
			  hdc = GetDC (hwnd);   //روتيني :)			   

			  SelectObject (hdc,				
				   GetStockObject (SYSTEM_FIXED_FONT));				

			  TextOut (hdc, xCaret * CharW, yCaret * CharH,				 
					   & string[yCaret][xCaret], 1);				  

			  ShowCaret (hwnd);				
						 if (++xCaret == X_MAX)				
				   {				
				   xCaret = 0;				

				   if (++yCaret == Y_YMAX)				
						yCaret = 0;  //هنا سأعود لبداية الصفحة اذا امتلآت، سنغيره عندما ندعم سكرول			  
				   }				

							 return 0;

---------

بالنسبة للماوس لدي فكرة (كل ما ذكرته هو مجرد أفكار، وكذلك ما سأذكره)

لو ان الآداة هي نافذة، سيكون الامر أقل تعقيداً:

نحصل على القيمة الاكسية لموقع المؤشر (طبعا اذا كانت احداثية y تدل على انه على السطرالخاص بنا!) ... بما ان النص بدأ من 0,0 فإن بعد الحصول على احداثي X نقسمه على عرض الحرف.. فيعطينا قيمة تدلنا على رقم الحرف الذي نحن عنده!+كسور.. عندما نتخلص من الكسور نحصل على جواب لسؤالنا : عند أي حرف يقف الامؤشر....لنقل الحرف العاشر.. نضرب هذه القيمة بعرض الحرف وهناك نرسم الكاريت.

اذا قمت برسم النافذة يدويا فسيحدث الاتي:

1- تقوم بتحريك النقطة 0,0 الخاصة بالنافذة وتجعلها تكون زاوية الشكل الذي رسمته انت :

يعني :

;(SetWindowOrg(100,150

اذا فرضنا ان الشكل الذي رسمته انت بدأ من 100,150

-----------------------------

لا ادري اشعر انني كتبت الرد على عجل ولم اجرّب شيء ، ولم أخطط كثيرا لهذا اعذروني اذا "شطحت" بعيدا أو كنت في وادي وانتم في وادي آخر :)

تم تعديل هذه المشاركة بواسطة إسماعيل ابراهيم في 17 أكتوبر 2006 في 22:30

#19

أنا لازلت أكتب الكود .. وفيه تقدم بإذن الله .

وتشكر أخوي b.m.s و اخوي اسماعيل على هذه النصائح ,,,,

استفدت منها كثيرا ..

لكن لازلت متعقد من الcaret .. ما عليكم ..

اقتباس
شمري ، أنا ما فهمت اسلوبك في بناءالآداة، هل تريد رسمها من الصفر؟

نعم .. أريد رسمها من الصفر .. لاأريد إطلاقا استخدام الاداة TextBox التي أنشئها من الدالة CreateWindow

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

لا أريد الوصول إلى اداة مثل ادوات الويندوز الان ... ولكن كل م اريده حاليا text box صغير . لنستطيع أن نطوره لاحقا .

وسيكون الرسم على النافذة مباشرة ,, ان شاء الله

اقتباس
- نقوم برسم الحرف في المكان الحالي (عادي).

2- عداد اسمه مثلا CaretCounter أو xCaret سيزداد 1 ، وبهذا نعرف اننا في المرة القادمة سنرسم الحرف الثاني.

3- موقع الرسم الحالي هو عرض الحرف CharW مضروبا في العداد الذي يزيد مع كل حرف (في حالة انتهاء السطر مفهوم تصفير الاحداث الاكسي وزيادة الواي).

4- نحتفظ بالحرف في السلسلة المذكورة.

توجيهات ممتازة :) .. طبقت أغلبها .. وسأضيف الكود قريبا إن شاء الله .

أكيد أنكم لا تحبون كثرة الكلام كما تحبون رؤية الاكواد .. : ) .. لكن قلت اضيف هذا الرد ,

تم تعديل هذه المشاركة بواسطة الشمري في 18 أكتوبر 2006 في 23:55

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#20
الشمري كتب:
أكيد أنكم لا تحبون كثرة الكلام كما تحبون رؤية الاكواد .. : ) .. لكن قلت اضيف هذا الرد ,

أظن يا الشمري لو قبل لا تبدأ أكواد يكون في تصور كامل عن الآداة عشان نعرف رأسنا من ساسنا -_-

ويمكن نساعدك بالفكرة أو بالأكواد ;)

#21

معلش تحملني ولكني أجد من الأفضل والأجدى أن تعتمد على CreateWindow ثم باستخدام WindProc تقوم بكافة التغييرات التي تريد معالجتها بشكل خاص, إلا إذا كان في قصة راحت علي بالمشاركات الأولى :D

#22

نريد عمل اداة مثل text box الموجود في برنامج المفكرة ..

الهدف :

لان 90% من برامج تحرير النصوص تعتمد على text box خاص بها ..

وهذا يعطيك تحكم في الصندوق..

والهدف الاخر هدف تعليمي .

--

بالنسبة لكتابة الكود فتوقفت .. ممكن أكمل لاحقا .. بعد العيد ان شاء الله .. أو السنة الجاية :D .

حاليا أحب برمجة الالعاب وأحب أن انتج شيء فيها .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

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

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