كيفية تغيير نص جزء شريط الحالة من مؤشر ترابط في MFC؟

StackOverflow https://stackoverflow.com/questions/391125

سؤال

لدي حوار في 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) لإعلام مؤشر ترابط واجهة المستخدم بضرورة تحديث نص شريط الحالة.لا تحاول تحديث عناصر واجهة المستخدم من سلسلة عمليات، فمن المؤكد أن هذا سيسبب لك الألم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top