سؤال

ملف MFC: WINCTRL4.CPP

(C: Program Files Microsoft Visual Studio 8 Vc Atlmfc Src Mfc)

CString CRichEditCtrl::GetSelText() const
{
    ASSERT(::IsWindow(m_hWnd));
    CHARRANGE cr;
    cr.cpMin = cr.cpMax = 0;
    ::SendMessage(m_hWnd, EM_EXGETSEL, 0, (LPARAM)&cr);
    CStringA strText;
    LPSTR lpsz=strText.GetBufferSetLength((cr.cpMax - cr.cpMin + 1)*2); 
    lpsz[0] = NULL;
    ::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpsz);
    strText.ReleaseBuffer();
    return CString(strText);
}

أواجه مشكلة غريبة ، عندما أسمي هذا ، فإنه يعيد فقط الحرف الأول من السلسلة المحددة. cr يتم تعيينه بشكل صحيح ولكن بعد ::SendMessage(m_hWnd, EM_GETSELTEXT,... السلسلة بأكملها غير موجودة.

رأيت سلوكًا مشابهًا في لي رمز مخصص بسبب WCHAR القضايا (شخصية ثنائية البايت التي تحتوي على صفر في بايت واحد) عندما CHAR كان متوقعا. ولكن هذا جزء من MFC/WIN32! هل من الممكن أن يضع ملف .rc شيئًا خاطئًا؟ هل هناك أسلوب خلق يتعلق بهذا؟ أو نظرًا لأننا ننشئ CFONT للتحكم المعني ، يمكننا الذي - التي المسمار؟

هل كانت مفيدة؟

المحلول

ليس هذا هو رمز مصدر MFC الصحيح ، هل قمت بتحريره؟ باستخدام CSTRINGA و LPSTR غير مناسب تمامًا ، يستخدم الكود الحقيقي CSTRING و LPTSTR بحيث يتم التعامل مع UNICODE بشكل صحيح. نعم ، كما تم نشر الرمز لن يعيد سوى حرف واحد.


ساعدت رؤية الإصدار. تم وصف الخطأ في هذا مقالة ردود الفعل. إذا لم تتمكن من الترقية بشكل معقول إلى VS2008 SP1 ، فيمكنك استخلاص الفصل الخاص بك من CrichedItCtrl واستبدال الوظيفة. علي سبيل المثال:

CString CRichEditCtrlFix::GetSelText() const
{
    ASSERT(::IsWindow(m_hWnd));
    CHARRANGE cr;
    cr.cpMin = cr.cpMax = 0;
    ::SendMessage(m_hWnd, EM_EXGETSEL, 0, (LPARAM)&cr);
    CString strText;
    LPTSTR lpsz=strText.GetBufferSetLength((cr.cpMax - cr.cpMin + 1) * 2);
    lpsz[0] = NULL;
    ::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpsz);
    strText.ReleaseBuffer();
    return CString(strText);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top