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

ممكن أطبق أكشن أبيض وأسود عند الخروج من البرنامج

بدأه أمناينلواد في 27 يونيو 2008 · 11 رد · 1,623 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

أتمنى أن يكون الجميع في تمام الصحة والعافية

هل يمكن لي أن أطبق الأكشن أبيض وأسود عندما أريد غلق البرنامج ويكون مع رسالة تؤكد لي غلق البرنامج

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

مع العلم أن رسالة تأكيد الخروج من البرنامج أعرف كيفية وضعها أما الباقي فأملي فيكم

شكرا لكم

تم تعديل هذه المشاركة بواسطة صلاح تشرونت في 27 يونيو 2008 في 16:50

#2

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

منذ مدة كتبت بعض الدوال لتحويل الصورة الملونة إلى أبيض و أسود (تدرج الرمادي) و قد جربت تطبيقها على سطح المكتب (Desktop) - بل الشاشة بأكملها - و قد نجح الأمر إلى حد ما و لكنه بحاجة إلى بعض التعديلات - ربما تقوم بها أنت أخ صلاح أو يساعدنا فيها أحد الأخوة في المنتدى، و خاصة في ثلاث نقاط:

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

2. منع عملية التحديث (Refresh أو Repaint) على الشاشة (ستلاحظ عند تجربة المثال أنه عند تحريك النافذة يتم استعادة الألوان في المناطق التي كانت مخفية وراء النافذة).

3. استعمال دوال API لإنشاء الصورة الرمادية بدل استعمال حلقة (Loop) للمرور على كل Pixel في الصورة و تحويلها لأنها ستكون أسرع (ستلاحظ وجود تأخير في تطبيق التحويل إلى الرمادي). كان لدي الكود باستعمال دوال API لكني لم أتمكن من إيجاده في زحمة الملفات على الحاسوب!

على أية حال هنا الفكرة، و يمكن تطويرها (لتطبيق المثال نحتاج إلى نموذج(Form) و زر(Button)):

// إجراء للحصول على قيم المكونات الثلاثة للون - الأحمر، الأخضر، الأزرق:
procedure GetColorComponents(AColor: TColor; var R, G, B: Byte);
var
	IntColorVal: Integer;
	HexColorVal: string;
begin
	IntColorVal := ColorToRGB(AColor);
	HexColorVal := IntToHex(IntColorVal, 6);
	R := StrToInt('$' + Copy(HexColorVal, 5, 2));
	G := StrToInt('$' + Copy(HexColorVal, 3, 2));
	B := StrToInt('$' + Copy(HexColorVal, 1, 2));
end;

// دالة للحصول على المكافئ الرمادي لنقطة ملونة:
function ColorToGray(AColor: TColor): TColor;
var
	R, G, B, GrayColorVal: Byte;
begin
	// الحصول على مكونات اللون الثلاثة:
	GetColorComponents(AColor, R, G, B);
	// حساب القيمة المتوسطة:
	GrayColorVal := (R + G + B) div 3;
	// الحصول على اللون الرمادي المكافئ:
	Result := TColor(RGB(GrayColorVal, GrayColorVal, GrayColorVal) or RGB(0, 0, 0));
	// في السطر يمكن حذف الجزء:
	// or RGB(0, 0, 0)
	// لكن يمكن استعماله لتطبيق قناع لوني، مثلاً:
	// or RGB(255, 0, 0)
	// يؤدي إلى صبغ الصورة باللون الأحمر - مع فرق في الدرجات طبعاً
end;

procedure TForm1.Button1Click(Sender: TObject);
var
	ScrnDC: HDC;
	ScrnBmp, GrayBmp: TBitmap;

	RowIdx, ColIdx: Integer;
	ColorVal: TColor;
begin
	Hide;	// إخفاء النافذة حتى لا يشملها تغيير اللون
	try
		// الحصول على المقبض الرسومي للشاشة:
		ScrnDC := GetDC(0);
		// إنشاء صورة نقطية لحفظ صورة الشاشة
		ScrnBmp := TBitmap.Create;
		// جعل حجم الصورة بحجم الشاشة:
		ScrnBmp.Width := Screen.Width;
		ScrnBmp.Height := Screen.Height;
		// جعل المقبض الرسومي للصورة يشير إلى المقبض الرسومي للشاشة
		// هذا يجعل الصورة التي أنشأناها تحتوي على صورة الشاشة:
		ScrnBmp.Canvas.Handle := ScrnDC;
		// إنشاء صورة نقطية لوضع الصورة الرمادية للشاشة عليها:
		GrayBmp := TBitmap.Create;
		GrayBmp.Width := Screen.Width;
		GrayBmp.Height := Screen.Height;

		// الحلقة التالية تمر على جميع نقاط صورة الشاشة و تحولها إلى مكافئها الرمادي ثم ترسمها على
		// الصورة الرمادية. إذا كانت الحلقة طويلة فربما يستحسن استعمال الإجراء
		// ProcessMessages.
		for ColIdx := 0 to ScrnBmp.Width - 1 do begin
			for RowIdx := 0 to ScrnBmp.Height - 1 do begin
				// الحصول على القيمة اللونية للنقطة:
				ColorVal := ScrnBmp.Canvas.Pixels[ColIdx, RowIdx];
				// تحويل النقطة إلى الرمادي و رسمها على الصورة الثانية:
				GrayBmp.Canvas.Pixels[ColIdx, RowIdx] := ColorToGray(ColorVal);
			end;
		end;
		// أخيراً رسم الصورة الرمادية الناتجة على الشاشة:
		BitBlt(ScrnDC, 0, 0, Screen.Width, Screen.Height, GrayBmp.Canvas.Handle, 0, 0, SRCCOPY);
	finally
		// تحرير الذاكرة من الصور النقطية:
		ScrnBmp.Free;
		GrayBmp.Free;
		// إعادة إظهار النافذة:
		Show;
	end;
end;

نرجو الاستفادة و السلام.

وَ قُلِ اعْمَلُوا فَسَيَرَى اللهُ عَمَلَكُمْ وَ رَسُولُهُ وَ الْمُؤْمِنُونَ

صدق الله العظيم

#3

شكرا جزيلا أخي على الرد

ولكن انا لم اتعامل قبل مع الألوان فأين اجد هذا المكون رغم بحثي المرير عليه ColorComponents

#4

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

الكود لا يحتاج إلى أي مكون، و إذا كنت تقصد GetColorComponents فهذا اسم أول إجراء في الكود! و يتم استدعاؤه من داخل الدالة ColorToGray. فقط انسخ الكود و قم بتجربته.

نرجو الاستفادة و السلام.

وَ قُلِ اعْمَلُوا فَسَيَرَى اللهُ عَمَلَكُمْ وَ رَسُولُهُ وَ الْمُؤْمِنُونَ

صدق الله العظيم

#5

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

فسؤالى الحالى هل انت تود هذه الألوان فى برنامجك فقط ؟ ام على كامل الشاشة ويتضمن ويندوز ؟

تم تعديل هذه المشاركة بواسطة Swift في 29 يونيو 2008 في 21:54

Comming Soon

#6

شكرا أخوتي على مروركم

يبدو يا أخي برنامجي فقط ولكن الشاشة تكون أبيض وأسود فمن الممكن ان تفتح قائمة ابدأ لا يهم ولكن الأكشن يكون مطبق

في الحقيقة جربت مثال الأخ ولكن لم تظهر لي نتيجة وأنا أحاول التعديل فيه لعلي أنجح

#7

حمل المرفق

مكون + مثال من برمجتى :cash:

بالتوفيق

Swift.rar

Comming Soon

#8

بارك الله فيك

جاري التحميل يا أخي العزيز

سأوافيك بالنتيجة المرضية ان شاء الله

#9

يا أخي ممكن تعدل لنا الملف

بارك الله فيك

#10

أعزرونى اخوانى على التأخير

مشغول بفرح عُرس اخى عقبالكم

اقتباس
يا أخي ممكن تعدل لنا الملف

بارك الله فيك

ما التعديل اخى وانا جاهز إن شاء الله

Comming Soon

#11

مبروك أخي على العرس ويارب يجعل بيوتكم وبيوت المسلمين كلها فرح

وأما عن التعديل :

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

دشكرا لك مرة أخرى

#12

أعتذر عن التأخير

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

أمين يارب العالمين

اقتباس
عندما أريد فتح المشروع تخرج لي رسالة خطأ بأن المسار غير صحيح و ملف unit غير موجو

اسف كان فى ملف معطوب أنا ارفقت لك المثال من جديد

Demo.rar

Comming Soon

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

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

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

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

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