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

أريد توضيح تنفيذ الدالة SetFont

مغلق
بدأه eias في 18 أكتوبر 2005 · 15 رد · 991 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

أولا:بالتأكيد فإن دالة SetFont تقوم بتغيير الخط أو بالأحرى تتحكم به..ولكن للأسف لم أعرف ما هي بارمترات هذه الدالة..

يعني البارمتر الثاني نكتبهTrue لامشكلة ولكن الأول ما هو يعني pFont ..

ثانيا: ما هي الدالة CreateCaret و كيف أستخدمها ... لها علاقة بالصور كما يبدو

#2
BOOL CreateCaret(

    HWND hWnd,	// handle to owner window 
    HBITMAP hBitmap,	// handle to bitmap for caret shape
    int nWidth,	// caret width 
    int nHeight  // caret height 
   );

هذه هى الدالة creatcarte وهى لرسم صورة من النوع bitmap

وظيفة الدالة هى تحديد صورة ما على الفورم تقريبا

اما الدالة setfont يسبقها الرمز ده :

WM_SETFONT 
wParam = (WPARAM) hfont;            // handle of font 
lParam = MAKELPARAM(fRedraw, 0);    // redraw flag

.

Parameters

hfont

Value of wParam. Handle to the font. If this parameter is NULL, the control uses the default system font to draw text.

fRedraw

Value of lParam. Specifies whether the control should be redrawn immediately upon setting the font. Setting the fRedraw parameter to TRUE causes the control to redraw itself

تم تعديل هذه المشاركة بواسطة hamada hassan ali في 18 أكتوبر 2005 في 15:09

_____________________________

C Language && Windwos_API

_____________________________

#3

اخي الكريم انا مبرمج مبتدىء و لست بيل غيتس :lol: ^.^

يعني الحقيقة اتكركبت بهذا الكود ..

بالنسبة للCreateCaret لماذا سبقناها باBOOL مع أنها غير خاضغة للTrue أو Flase و هل ممكن تعطيني كود يحمل صورة مثلا من دليل ما اختره انت لأنك لم تكتب لي إلا ما كنت أسأل لأفهمه يعني أسماء هذه البارمترات ...لنقول في

d:\ei.Bmp

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

#4

:)

بالنسبة للدالة Setfont هذه اول مرة اسمع فيها ؟؟؟ ... انت متأكد انها من دوال api ..

اما Carets .. فماله تلك العلاقة ... الوطيدة :) ... مع الخطوط ... لكن على العموم عطني يومين كذا .. حتى ننزل كم درس عن Carets .

هو على العموم كلام مو مهم :)

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#6

السلام عليكم

بالنسبة للدالة Setfont هى احد دوال CWnd يعنى تقدر تستخدمها مع اى كائن من اصل CWnd

تستخدم هذه الدالة كما هو واضح من الاسم لتحديد الخط و كل كائن يستعمل هذا الخط فى تعديل شكله

على سبيل المثال عندك CStatic على dialog و المطلوب كتابة الزاوية بالرمز اللاتينى ثيتا فعليك تحويل الخط إلى symbol

لعمل ذلك استنسخ كائن من CFont و بعدين استعمل Setfont و عند اعادة الرسم سيظهر الخط الجديد

و تكون النتيجة بالشكل التالى

#7

CStatic *pWnd=GetDlgItem(IDC_ANGLE);

CFont *pFont=new CFont();

pFont->CreatePointFont(120, "Symbol"); // size 12

pWnd->SetFont(pFont);

و هذه هى الروابط الخاصة بالدالتين المستخدمتين

http://msdn.microsoft.com/library/default....tepointfont.asp

http://msdn.microsoft.com/library/default....a3a.setfont.asp

و اسف اذا ظهر العرض بشكل سئ. هذه اول مرة استعمل اداة الكتابة

#8
CStatic *pWnd=GetDlgItem(IDC_ANGLE);
CFont *pFont=new CFont();
pFont->CreatePointFont(120, "Symbol"); // size 12
pWnd->SetFont(pFont);

هكذا افضل

_____________________________

C Language && Windwos_API

_____________________________

#9

شكراً على المساعدة و سأحاول التمرين

#10

شكرا لكم إخواني الكرام

PointerVC و حمادة حسان علي

..بس الحقيقة الكود فيه خطأ ..ولكن رب رمية من غير رامي :lol:

قمت باتباع ما قالته لي اللغة و صلحت الكود فأصبح كما يلي :

CWnd *pWnd=GetDlgItem(IDC_BUTTON3);
CFont *pFont=new CFont();
pFont->CreatePointFont(120, "Symbol"); // size 12
pWnd->SetFont(pFont);

أنا لا أعرف ما الذي حصل ولكن الكود أصبح صحيح ...ولكن عفوا ..يعني أنتم أعطيتوني السمكة و لم تعطوني السنارة ..ما هو شرح هذا الكود.ما هي هذه المؤشرات التي عرفتم عنها .

#11

توضيح بسيط الى أن يقوم أحد الإخوه بتصحيحه

أولا الوظيفه SetFont من أحد الوظائف التي تقدمها ال CWnd Class

CWnd::SetFont

وهذه ال Class تعتبر تغليف للوظائف التي يمكن تنفيذها على أحد النوافذ مثل زر أمر مثلا

فنفس الوظيفه يمكن تنفيذها فقط بدوال الـ API وبالتحديد بالداله SendMessage مع الرساله WM_SETFONT

lResult = SendMessage( // returns LRESULT in lResult
  (HWND) hWndControl, // handle to destination control (UINT) 
  M_SETFONT, // message ID
  (WPARAM) wParam, // = (WPARAM) () wParam;
  (LPARAM) lParam ); // = (LPARAM) () lParam;

نرجع تاني للـ CWnd Class

يجب أولا انشائها للتعامل معها واستخدام وظائفها , ويجب تعيين النافذه المراد التعامل معها وهذا من خلال مقبض (Handle) هذه النافذه

CWnd *pWnd=GetDlgItem(IDC_BUTTON3);

أنشأت مؤشر لـ Object من النوع CWnd Class و أسميناه pWnd

يأخذ مقبض (Handle) النافذه (زر الأمر) من الداله GetDlgItem أحد دوال API وظيفتها تعيد مقبض النافذه

بهذا تم تعيين النافذه وتغليفها في Object من النوع CWnd Class

ننتقل الى تجهيز الخط

pWnd->SetFont(pFont, TRUE);

استخدمنا العلامه <- بدلا من . لأننا نتعامل مع المؤشر

ولكن هذه الوظيفه تحتاج مني مدخل عباره عن مؤشر لـ Object من النوع CFont Class وايضا تحتاج الى قيمه منطقيه من النوع BOOL لتوضح اذا كان سيقوم باعادة رسم النافذه أم لا

القيمه المنطقيه امرها سهل , TRUE أو FALSE

أما مؤشر ال.... نجيبه منين ؟

لهذا تم كتابة هذا السطر

CFont *pFont=new CFont();

مثله مثل السطر الأول مع تغيير نوع الـ Object الى النوع CFont Class وأسميناه pFont

بعدها نقوم باختيار نوع الخط وحجمه باستخدام الوظيفه CFont::CreatePointFont

pFont->CreatePointFont(120, "Symbol", NULL); // size 12

وهذا نكون أعددنا كل ما تحتاجه الداله SetFont ونستطيع استخدامها الآن

pWnd->SetFont(pFont, TRUE);

ان شاء الله تكون الأخطاء قليله لأني ما استخدمت هذه الداله أصلا :lol: كله من MSDN

تم تعديل هذه المشاركة بواسطة Asm4all في 20 أكتوبر 2005 في 19:26

#12

شكراً للأخ Asm4all على التوضيح

و فعلاً البرنامج فيه تعديل فى السطر الاول

و انا افضل عادة عمل تعديل نوع casting

CStatic *pWnd=(CStatic *)GetDlgItem(IDC_ANGLE);

حتى ستطييع عمل اى تعديلا ت قد تحتاجها

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

بالتوفيق للجميع

#14

Carets

هذا المصطلح يعني :

خط او شكل او صورة ... تومض ..

شاهد الصورة اللي اخذتها من MSDN

21_10_05_01_45_04_1129927504aaa.JPG

طبعا ما تقدر تسوي Caret لاكثر من نافذة .. لان Caret لايظهر الا للنافذة المفعلة on focus

اذا اردت تصنع Caret تستخدم دالة واحدة هي . CreateCaret

تفاصيل الدالة :

BOOL CreateCaret(

    HWND hWnd,  
    HBITMAP hBitmap,  
    int nWidth,  
    int nHeight   
   );

البارمتر الاول : مقبض النافذة اللي تريد يظهر فيه المؤشر اللي يومض .

2- مقبض الصورة اذا كنت تريد ان يكون المؤشر على شكل صورة .. اكتب NULL اذا كنت لا تريد صورة

3- عرض المؤشر

4- طوله .

لكن اين تريد موقعه ..

استخدم الدالة SetCaretPos

لتحديد الموقع ..

BOOL SetCaretPos(

    int X,  
    int Y   
   );

واضحة .

مثال تطبيقي :

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{


  switch (message)
  {
  case WM_SETFOCUS:
  	{

    CreateCaret(hwnd,  NULL, 10 ,10 );     
        SetCaretPos(100,100);
        ShowCaret(hwnd);

  	}
  	break;

لاحظ ... اذا وقع الحدث WM_SETFOCUS يعني اذا صارت النافذة تحت الاضواء :)

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

ولاحظ ايضا الدالة

ShowCaret(hwnd);

هذه تظهر caret وتمرر لها مقبض النافذة التي تريد ان يظهر عليها هذا caret .

مثال 2:

وضع صورة ...

سأفرض انك تعرف كيف تحمل صورة .. وكيف تتعامل معها ...

الان سنجعل caret على هيئة صورة ...

مثال /

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{



	HBITMAP image = LoadBitmap(hi,MAKEINTRESOURCE(IDB_BITMAP1) ); 



  switch (message)
  {
  case WM_SETFOCUS:
  	{

    CreateCaret(hwnd,  image, 10 ,10 );     
        SetCaretPos(100,100);
        ShowCaret(hwnd);

  	}
  	break;

المثال بالمرفقات . .

وهذه بعض التلميحات ..

الدالة :

HideCaret

تخفي المؤشر اللي يومض ..

صيغتها

BOOL HideCaret(

    HWND hWnd   
   );

تطلب مقبض النافذة اللي تريد اخفاء caret عنها

الدالة :

GetCaretPosتحصل على احداثيات caret .. وتخزنه لك في التركيب POINT .. سبق ان تكلمنا عن هذ االتركيب في دروس ماضيه..

صيغتها :

BOOL GetCaretPos(

    LPPOINT lpPoint 
   );

مثال على استخدامها :

POINT pn; 

GetCaretPos(&pn); 

int x = pn.x; 
int y = pn.y;

الدالة :

DestroyCaret()

هذه تعدم caret :) يعني تزيله من الذاكرة ..

بعد ان تنتهي منه وتغلق برنامجك استدعي هذه الدالة .. اذا احببت :)

طبعا مالها بارمترات ومن نوع void

يفضل تستدعي هذه الدالة اذا راح التفعيل من نافذتك يعني اذا حدث الحدث WM_KILLFOCUS

case WM_KILLFOCUS:  
   
    DestroyCaret(); 

    break;

الدالة :

SetCaretBlinkTime

هذه تحدد زمن كل ومضة ( سرعتها)

وتطلب الدالة السابقة بارمتر واحد هو رقم تحدده انت ... وهو عبارة عن الزمن بين كل ومضة واخرى بالملي سكوند ... يعني جزء من الثانية على ما اظن :)

مثال

SetCaretBlinkTime(100);

واذا اردت ان تعرف الزمن تستخدم الدالة GetCaretBlinkTime

مثال

   UINT A=GetCaretBlinkTime();

هنا ترجع لك الزمن بين كل ومضة واخرى ..

تنبيه !

اذا غيرت سرعة الوميض .. فان نظام الويندوز بكامله سيتأثر بالسرعة اخترتها انت ..

يعني ما ينطبق على برنامجك ينطبق على البرامج الاخرى حتى لو اغلقت برنامجك .

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

الخلاصة ..

الدوال التي تستخدمها هي .

CreateCaret

DestroyCaretGetCaretBlinkTime

GetCaretPos

HideCaretSetCaretBlinkTime

SetCaretPos

ShowCaret

carets.zip

تم تعديل هذه المشاركة بواسطة الشمري في 21 أكتوبر 2005 في 23:38

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#16

أخي الكريم الشمري الحقيقة درس رهيب و رائع و مفهوم و قد قمت بتعديله لينطبق على ال MFC فأصبح الكود :

void CALShamrTestDlg::OnButton14() 
{
	POINT A;
	A.x =10;
	A.y =100;

HBITMAP image = LoadBitmap(0,"G:\Documents and Settings\Eias Nabhan\Desktop\carets\bitmap1.BMP" ); 
 CreateCaret(0);
 SetCaretPos(A);
ShowCaret();

}

ولكن في هذا الكود خطا واحد وهو الصورة أقصد أنت أنك ظنك كان بمكانه :lol: (لم أحمل صورة من قبل ) الصورة لم تظهر لأني استبدل الكلمة ب 0 :D

..بس الشرح كان رائع فعلا ...خصوصا ال SETFOCUSيعني أفضل من ان نضعها في الدالة Main.و سأطبقه في دروس الApi القادمة

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

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