نكمل ما بدأنا به في الدرس الاول
عد إلى مساحة العمل الخاصة بك والتي يوجد فيها IDD_VC1_DIALOG وأضغط Double Click
على بريدك الألكترونى ستفتح لك الصفحة الخاصة بكتابة الكود كما هو موضح بالشكل

قم بإلغاء عبارة
TODO:Add your control notification hand//
أو أتركها فهي مجرد ملاحظه ولا تؤثر على تنفيذ البرنامج ولكن وضعت لكي تنبه المبرمج إلى أماكن كتابة الأكواد أي أنها علامات إرشاديه فقط قم الآن بكتابة السطور الأتيه
(السطور الحمراء فقط)
---------------------------------------ملاحظه-------------------------------------------
( السطور الخضراء عبارة عن ملاحظات داخل البرنامج ولك حرية الاختيار في كتابتها أو لا)
يمكن تغيير أسم الموقع من
http://www.geocities.com/medlteam
إلى أي موقع تريده ونفس الشئ بالنسبة للبريد الألكترونى من
medlteam@yahoo.com
---------------------------------------------------------------------------------------
()void CVc1Dlg::OnUrl
}
HINSTANCE h = ShellExecute( NULL, "open","http://www.geocities.com/medlteam", NULL, NULL, SW_SHOWNORMAL);
(if ((UINT)h > 32
{
UrlVisited = TRUE;
Invalidate(); // repaint to show visited color
}
else
{
AfxMessageBox ("Unable to display web page.");
}
}
void CVc1Dlg::OnMail()
{
HINSTANCE h = ShellExecute( NULL, "open","mailto:medlteam@yahoo.com", NULL, NULL, SW_SHOWNORMAL);
if ((UINT)h > 32)
{
MailVisited = TRUE;
Invalidate(); // repaint to show visited color
}
else
{
AfxMessageBox ("Unable to open mail client.");
}
}
ومن الدالة الأبتدائيه للبرنامج قم بإضافة السطور التالية.
للوصول إلى الدالة الأبتدائيه قم بالنقر Double Click على IDD_VC1_DIALOG
وأبحث عن الدالة BOOL CVc1Dlg::OnInitDialog()
كما هو مبين في السطور التالية.
BOOL CVc1Dlg::OnInitDialog()
{
CDialog::OnInitDialog ()
Add "About..." menu item to system menu.
IDM_ABOUTBOX must be in the system command range
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
Set the icon for this dialog. The framework does this automatically
when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); Set big icon
SetIcon(m_hIcon, FALSE); Set small icon
TODO: Add extra initialization here
UrlVisited = FALSE;
MailVisited = FALSE;
return TRUE; return TRUE unless you set the focus to a control
}
والآن يجب تعريف المتغيرات.
من FileView كما هو موضح بالشكل

أضف تحت كلمة Protected هذا السطر BOOL UrlVisited,MailVisited;
كما هو موضح بالشكل السابق.
Ctrl+F5والآن قم بتنفيذ البرنامج وذلك بالضغط على
والآن يمكنك تجربة البرنامج بالضغط على رابطة البريد الألكترونى أو رابطة الصفحة أو الموقع الذي اختارته.
ولكن تذكر يجب أن تكون متصل بشبكة المعلومات الدولية
يتبقى لنا في هذا الدرس هو كيفية تغيير لون العنوان من اللون الأسود إلى اللون الأزرق المشهور به الروابط وكذلك تغييره بعد الضغط عليه وكذلك شكل مؤشر الفاره عند المرور على الرابط وهذا ما سنعرفه في السطور التالية.
لنعد الآن لباقي الموضوع
قم بالنقر على Ctrl+W لفتح ClassWizard وتأكد من أنك على CVc1Dlg بداخل Object IDs: ومن Message أختار WM_CTLCOLOR وأضغط على زر
Add Function وبهذا تكون قد أضفت هذه الدالة إلى الكود الخاص بك ولكن بدون تأثير لأنك لم تكتب الكود بعد أضغط على زر Edit Code
لتدخل إلى مساحة الكود وأضف الكود التالي بداخل الدالة
HBRUSH CVc1Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
كالأتي

HBRUSH CVc1Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
TODO: Change any attributes of the DC here
if ((pWnd->GetDlgCtrlID() == IDC_URL) || (pWnd->GetDlgCtrlID() == IDC_MAIL))
{
LOGFONT lf;
GetFont()->GetObject(sizeof(lf), &lf);
lf.lfUnderline = TRUE;
m_font.CreateFontIndirect(&lf);
pDC->SelectObject(&m_font);
if (((pWnd->GetDlgCtrlID() == IDC_URL) && (!UrlVisited)) || ((pWnd->GetDlgCtrlID() == IDC_MAIL) && (!MailVisited)))
pDC->SetTextColor (RGB(0,0,255)); blue
else
pDC->SetTextColor (RGB(128,0,128)); purple
m_font.DeleteObject();
}
TODO: Return a different brush if the default is not desired
return hbr;
}
ومن داخل vc1Dlg.h وتحت كلمة
protected أضف الأتي
CFont m_font;
والآن قم بترجمة البرنامج كما سبق وقم بتجربته ستجد أن لو الخط قد تغير إلى اللون الأزرق الشهير وعند النقر على أحد الروابط سيتغير لونه إلى اللون البنفسجي.
تتبقى لنا الآن خطوة تغيير شكل المؤشر إلى شكل اليد الشهير أو أي شكل تريده.
والآن يجب لنا أن نصمم شكل المؤشر

من قائمة Insert أختار Resource أو أضغط Alt+I ثم Alt+R

سيظهر لك مربع Insert Resource كما هو موضح بالشكل السابق أختار Cursor ثم أضغط New
وبهذا تكون قد أضفت مؤشر للمشروع ولكن ليس له شكل كما هو مبين في الشكل التالي.

ستجد على يمين الشاشة أدوات للرسم أبدأ بتصميم الشكل الذي يحلو لك أما أنا فقد كتبت حرف e وهو رمز Internet Explorer ولكن ليس لدينا الكود اللازم.
أدخل على ClassWizard والآن طبعا أنا أعرف جيدا أنك تعرف كيف تدخل عليه ومن داخله أبحث عن WM_SETCURSOR من قائمة Message الخاصة ب
CVc1Dlg ثم أضغط على Add Function ثم Edit Code ثم أضف الكود التالي
BOOL CVc1Dlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
TODO: Add your message handler code here and/or call default
Sets cursor to hand
if ((pWnd->GetDlgCtrlID() == IDC_URL) || (pWnd->GetDlgCtrlID() == IDC_MAIL))
{
::SetCursor(hHand);
return TRUE;
}
return CDialog::OnSetCursor(pWnd, nHitTest, message);
}
أضف التعريف التالىvc1Dlg.hومن داخل ملف
protected:
BOOL UrlVisited, MailVisited;
CFont m_font;
HCURSOR hHand;
HICON m_hIcon;
ومن الدالة الأبتدائيه للبرنامج قم بإضافة السطور التالية.
IDD_VC1_DIALOG علىDouble Click للوصول إلى الدالة الأبتدائيه قم بالنقر
وأبحث عن الدالة
BOOL CVc1Dlg::OnInitDialog()
كما هو مبين في السطور التالية
BOOL CVc1Dlg::OnInitDialog()
{
CDialog::OnInitDialog ()
Add "About..." menu item to system menu.
IDM_ABOUTBOX must be in the system command range
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
Set the icon for this dialog. The framework does this automatically
when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); Set big icon
SetIcon(m_hIcon, FALSE); Set small icon
TODO: Add extra initialization here
UrlVisited = FALSE;
MailVisited = FALSE;
hHand = ::LoadCursor(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDC_CURSOR1));
return TRUE; return TRUE unless you set the focus to a control
}
والآن قم بترجمة البرنامج وقم بتجربته وان شاء الله ستجده يعمل .