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

مشكلة في الحدث OnHScroll

بدأه Abboodd في 3 مايو 2010 · 5 رد · 528 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

إخواني،

أثناء مضيي في تعلم MFC مع VC++6 وصلت إلى فصل يتحدث عن أشرطة التمرير، في صنف النافذة الرئيسية أستقبل الرسالة WM_HSCROLL بالحدث ON_WM_HSCROLL والذي يوجهها إلى الدالة:

afx_msg OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);

المشكلة أنه عند محاولة تغيير قيمة شريط التمرير فإنه لا يتغير مع أنني وضعت كل شيء لازم، وبحثت كثيراً عن الحل ولم أجده.

إليكم الشفرة الكاملة للملف mainfrm.cpp والذي يحوي الشفرة المشكلة:

#include "mainfrm.h"

#define IDC_BUTTON_QUIT 100
#define IDC_CS_FAH		101
#define IDC_CS_CEL		102
#define IDC_SB_DEGREE	103
const int MIN_RANGE= 0;
const int MAX_RANGE= 100;

BEGIN_MESSAGE_MAP(C_MainFrame, CFrameWnd)
	ON_BN_CLICKED(IDC_BUTTON_QUIT, OnButtonQuitClick)
	ON_WM_HSCROLL()
END_MESSAGE_MAP()


C_MainFrame::C_MainFrame()
{
	Create(NULL, "F2C", WS_OVERLAPPEDWINDOW, CRect(0, 0, 208, 208));

	CRect r;
	GetClientRect(&r);

	m_csFah= new CStatic;
	m_csFah->Create("Fahrenheit = 32", WS_CHILD | WS_VISIBLE |WS_BORDER, CRect(0, 0, r.right, 50), this, IDC_CS_FAH);

	m_csCel= new CStatic;
	m_csCel->Create("Celsieus = 0", WS_CHILD | WS_VISIBLE |WS_BORDER, CRect(0, 51, r.right, 100), this, IDC_CS_CEL);

	m_buttonQuit= new CButton;
	m_buttonQuit->Create("Quit", WS_CHILD | WS_VISIBLE |WS_BORDER, CRect(0, 131, r.right, 180), this, IDC_BUTTON_QUIT);

	m_sbDegree= new CScrollBar;
	m_sbDegree->Create(WS_CHILD | WS_VISIBLE | SBS_HORZ, CRect(0, 101, r.right, 130), this, IDC_SB_DEGREE);
	m_sbDegree->SetScrollPos(32, TRUE);
}


void C_MainFrame::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
	int pos= pScrollBar->GetScrollPos();

	switch (nSBCode)
	{
	case SB_LINEUP:
		pos++;
		break;
	case SB_LINEDOWN:
		pos--;
		break;
	case SB_PAGEUP:
		pos+= 10;
		break;
	case SB_PAGEDOWN:
		pos-= 10;
		break;
	case SB_TOP:
		pos= MIN_RANGE;
		break;
	case SB_BOTTOM:
		pos= MAX_RANGE;
		break;
	case SB_THUMBPOSITION:
		pos= nPos;
		break;
	default:
		return;
	}
	if (pos < MIN_RANGE)
		pos= MIN_RANGE;
	else if(pos > MAX_RANGE)
		pos= MAX_RANGE;
	pScrollBar->SetScrollPos(pos, TRUE);

	if (pScrollBar == m_sbDegree)
	{
		SetDlgItemText(IDC_CS_FAH, "Fahrenheit = " + (CString) pos);
		SetDlgItemText(IDC_CS_CEL, "Celsieus = " + (CString) ((pos - 32)*5/9));
	}
}

مشكلة أخرى تظهر، وهي في السطرين اللذين يحويان SetDlgItemText، إنهما لا يقومان بعملهما بالشكل المناسب وأجهل السبب.

أرجو مساعدتي وتوضيح الأمور لي.

ولكم جزيل الشكر :)

هذه الجملة خاطئة  :wacko: 


#2

السلام عليكم

من الأفضل تعريف هذه العناصر في resource.h مع البقية

#define IDC_BUTTON_QUIT 100

#define IDC_CS_FAH 101

#define IDC_CS_CEL 102

#define IDC_SB_DEGREE 103

عند القيام بعملية debug هل يصل إلى هذا الأمر أم لا؟

if (pScrollBar == m_sbDegree)

#3

جزاك الله خيراً :)

بالنسبة للتعريفات ففعلاً يجب وضعها في resource.h، لكن الكاتب لم يكن قد وصل إلى التحدث عن ملفات المصادر بعد :)

بالنسبة إلى وصوله إلى سطر المقارنة، فهو يصل إليه بالفعل وينفذ ما تحته، الغريب أن قيمة المتغير pos لا تتغير أبداً عن الصفر...

والأغرب أني قد عدلت على هذه الشفرة في البداية من عندي، ولكن حين لم تعمل نسخت شفرة الكاتب كما هي ووضعتها ولم تعمل، ثم نسخت شفرات أخرى من مواقع الإنترنت وجربتها أيضاً ولم تعمل!!

إذا رغبت رفعت لك المشروع مضغوطاً.

ولك جزيل الشكر.

هذه الجملة خاطئة  :wacko: 


#4

أرجو المساعدة يا إخواني

هذه الجملة خاطئة  :wacko: 


#5

السلام عليكم

بهذا الكود لا تقم بتغير مكانscrollbar إنما فقط تسند له نص .

اقتباس
if (pScrollBar == m_sbDegree)

{

SetDlgItemText(IDC_CS_FAH, "Fahrenheit = " + (CString) pos);

SetDlgItemText(IDC_CS_CEL, "Celsieus = " + (CString) ((pos - 32)*5/9));

}

إذا أردت أن يكون هناك تعديل بماشر كما تريد، يجب تعريفها في الدالة MESSAGE MAP و تعرف الدالة على أنجا من نوع afx_msg

كانت قد وضعت مكتبة أكوادMFC و فيها عدة أمثلة و لا أعرف أين تم نقلها !!!

#6

جزاك الله خيراً أخي.

لكنني قمت بكل ذلك

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

على كل سأعيد البحث في الأمر قريباً بإذن الله

جزاك الله كل خير :)

هذه الجملة خاطئة  :wacko: 


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