كيفية تغيير نص جزء شريط الحالة من مؤشر ترابط في MFC؟
-
23-08-2019 - |
سؤال
لدي حوار في MFC مع CStatusBar.في موضوع منفصل، أريد تغيير جزء النص من شريط الحالة.لكن MFC يشكو مع التأكيدات؟كيف يتم ذلك؟رمز المثال سيكون رائعا.
المحلول
يمكنك إرسال رسالة خاصة إلى نافذة الإطار الرئيسية و"مطالبتها" بتحديث شريط الحالة.سيحتاج مؤشر الترابط إلى مقبض النافذة الرئيسي (لا تستخدم كائن CWnd لأنه لن يكون آمنًا لمؤشر الترابط).إليك بعض نماذج الشفرة:
static UINT CMainFrame::UpdateStatusBarProc(LPVOID pParam);
void CMainFrame::OnCreateTestThread()
{
// Create the thread and pass the window handle
AfxBeginThread(UpdateStatusBarProc, m_hWnd);
}
LRESULT CMainFrame::OnUser(WPARAM wParam, LPARAM)
{
// Load string and update status bar
CString str;
VERIFY(str.LoadString(wParam));
m_wndStatusBar.SetPaneText(0, str);
return 0;
}
// Thread proc
UINT CMainFrame::UpdateStatusBarProc(LPVOID pParam)
{
const HWND hMainFrame = reinterpret_cast<HWND>(pParam);
ASSERT(hMainFrame != NULL);
::PostMessage(hMainFrame, WM_USER, IDS_STATUS_STRING);
return 0;
}
الكود من الذاكرة حيث لا أستطيع الوصول إلى المترجم هنا في المنزل، لذا أعتذر الآن عن أي أخطاء.
بدلا من استخدام WM_USER
يمكنك تسجيل رسالة Windows الخاصة بك:
UINT WM_MY_MESSAGE = ::RegisterWindowsMessage(_T("WM_MY_MESSAGE"));
اجعل ما سبق عضوًا ثابتًا في CMainFrame
على سبيل المثال.
إذا كان استخدام موارد السلسلة أمرًا أساسيًا جدًا، فاطلب من مؤشر الترابط تخصيص السلسلة على الكومة وتأكد من حذفها من خلال وظيفة تحديث CMainFrame، على سبيل المثال:
// Thread proc
UINT CMainFrame::UpdateStatusBarProc(LPVOID pParam)
{
const HWND hMainFrame = reinterpret_cast<HWND>(pParam);
ASSERT(hMainFrame != NULL);
CString* pString = new CString;
*pString = _T("Hello, world!");
::PostMessage(hMainFrame, WM_USER, 0, reinterpret_cast<LPARAM>(pString));
return 0;
}
LRESULT CMainFrame::OnUser(WPARAM, LPARAM lParam)
{
CString* pString = reinterpret_cast<CString*>(lParam);
ASSERT(pString != NULL);
m_wndStatusBar.SetPaneText(0, *pString);
delete pString;
return 0;
}
ليست مثالية، لكنها البداية.
نصائح أخرى
ربما هذا يمكن أن يساعدك: كيفية الوصول إلى عناصر واجهة المستخدم من سلسلة رسائل في MFC.
لا أقوم بترميز C++/MFC بنفسي ولكني واجهت مشكلة مماثلة في C# والتي تُعرف باسم تحديث واجهة المستخدم الرسومية عبر الخيوط.
يجب عليك استخدام رسالة (إما مع إرسال أو PostMessage) لإعلام مؤشر ترابط واجهة المستخدم بضرورة تحديث نص شريط الحالة.لا تحاول تحديث عناصر واجهة المستخدم من سلسلة عمليات، فمن المؤكد أن هذا سيسبب لك الألم.