2008-10-15 15 views
6

Điều này đang xảy ra trên Vista. Tôi đã tạo một dự án MFC dựa trên hộp thoại mới để kiểm tra điều này. Tôi đã thêm một điều khiển CEdit vào hộp thoại của mình. Tôi gọi SetLimitText để cho phép CEdit của tôi nhận được 100000 ký tự. Tôi đã thử cả:SetLimitText() trong một CEdit trong Vista không hoạt động

this->m_cedit1.SetLimitText(100000); 
UpdateData(FALSE); 

static_cast<CEdit*>(GetDlgItem(IDC_EDIT1))->LimitText(100000); 

tôi đặt các cuộc gọi trên InitDialog.

sau khi tôi dán 5461 ký tự vào CEdit của tôi, nó trở nên trống rỗng và không phản hồi. Bất kỳ ý tưởng nào về những gì gây ra điều này và cách giải quyết để có thể dán các chuỗi văn bản dài trong CEdit hoặc bất kỳ điều khiển nào khác?

lưu ý: 5461 là 0x1555 hoặc 1010101010101 ở dạng nhị phân, mà tôi thấy khá lạ.

nếu tôi dán 5460 ký tự, tôi không gặp vấn đề gì.

+0

Có toàn bộ ứng dụng treo hoặc chỉnh sửa hộp chỉ dừng hoạt động? – Aardvark

+0

Hộp chỉnh sửa chỉ dừng hoạt động. – rec

Trả lời

5

Tôi đã liên hệ với bộ phận hỗ trợ của microsof.

Mục tiêu là có khoảng 240000 ký tự trong một dòng dòng văn bản có thể chỉnh sửa.

Tôi có thể tạo lại sự cố trên Windows Vista (x64 và x32 cả hai) nhưng không trên Windows XP.

mã này hoạt động tốt trong XP:

BOOL ClongeditXPDlg::OnInitDialog() 
{ 
    CDialog::OnInitDialog(); 

    // 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 
    UINT limit = m_longEdit.GetLimitText(); 
    m_longEdit.SetLimitText(240000); 
    UINT limit2 = m_longEdit.GetLimitText(); 

    CString str; 
    str = _T(""); 
    for(int i = 0; i < 250000; i++) 
     str += _T("a"); 

    m_longEdit.SetWindowText(str); 

    return TRUE; // return TRUE unless you set the focus to a control 
} 

Nếu tôi sử dụng một điều khiển CRichEdit thay vào đó, khi tôi bấm "kết thúc" chìa khóa hoặc "quyền mũi tên" chìa khóa sau khi dán một chuỗi dài bên trong, i không thể thấy tất cả các ký tự trong Kiểm soát chỉnh sửa đa dạng. cố gắng cuộn qua ký tự cuối cùng có thể nhìn thấy tạo ra tiếng bíp. Phần còn lại của các ký tự ở đó, tôi biết điều này vì nếu tôi nhấp đúp vào Rich Chỉnh sửa và sao chép văn bản bằng cách sử dụng ctrl-c và sau đó dán nó vào văn bản trình chỉnh sửa, tôi có thể thấy các ký tự 240000 . Vì vậy, kiểm soát đang giữ số lượng ký tự phù hợp, nhưng các ký tự cuối cùng không thể xem được ngoại trừ trong trình chỉnh sửa bên ngoài, vì vậy, vẫn còn vấn đề ban đầu của tôi.

Sau đây là các câu trả lời bằng đại diện microsoft:

Vấn đề ở đây là một điều khiển sửa với một số lượng lớn các nhân vật trong nó không vẽ văn bản của nó.

Tôi đã thử đặt các ký tự khác nhau, và phát hiện ra rằng tôi có thể vừa với nhiều hơn 'l' hơn 'x' hơn 'm'.Vấn đề không trực tiếp là số lượng ký tự, nhưng có thể là số pixel. Nhân số lượng các ký tự hiển thị theo chiều rộng pixel của các ký tự trong phông chữ được chọn cho biết giới hạn là khoảng 32k pixel.

câu trả lời khác từ microsoft:

tôi đã nghiên cứu sâu rộng về vấn đề này và muốn cập nhật cho bạn về sự tiến bộ hợp cụ thể.

Sự khác biệt chính giữa Sửa kiểm soát trên Vista và XP là rằng Edit kiểm soát trên Vista trước soạn glyphs của mình cho tốt hơn hỗ trợ quốc tế (trong nội bộ, nó kết thúc lên gọi ExtTextOut với ETO_GLYPH_INDEX và một mảng của glyphs chứ không phải là một chuỗi ký tự. này kết thúc tiết kiệm các chỉ số glyph thành một Metafile và do đó chạy vào giới hạn điểm ảnh 32k. Khi quá nhiều ký tự được cung cấp, ExtTextOut thất bại và rút ra gì cả. chỉnh sửa contr ol trên XP không giới hạn các hình ảnh glyph và do đó không có vấn đề này , nhưng cũng không xử lý các ký tự quốc tế .

Điều khiển chỉnh sửa trên XP sẽ cắt tại 32k, nhưng vì điều đó không có màn hình, nên không rõ ràng. Khi cuộn đến số , nó bắt đầu bằng ký tự hiển thị đầu tiên để phần hiển thị của điều khiển luôn sớm hơn 32k pixel.

Điều khiển RichEdit vẽ số bắt đầu, nhưng sau khi nhấn Kết thúc, chỉnh sửa xảy ra chủ yếu là không có màn hình. RichEdit 3.0 và 4.1 cho hành vi tương tự . Điều này có vẻ là giới hạn 32k pixel của RichEdit, dưới dạng nó vẽ văn bản của nó trên một bitmap ngoài màn hình trước khi hiển thị nó ở màn hình .

Xem xét các điểm này, hành vi là theo thiết kế. Bạn sẽ cần phải tạo kiểm soát của riêng bạn để có được hành vi hiển thị dưới dạng chuỗi lớn như 240000 trong một dòng.

và mới nhất:

tôi đã nghiên cứu sâu hơn về vấn đề này cho việc tìm kiếm bất kỳ trọng lượng nhẹ workaround khắc phục 32k pixel giới hạn, nhưng tiếc là có vẻ như không có cách giải quyết cho điều này.

Một vài lựa chọn thay thế mà chúng tôi đã thử là là RichEdit 3.0, RichEdit 4.1, sử dụng UniScribe, sử dụng phông chữ khác nhau, v.v.

Có thể, bạn sẽ cần phải tạo điều khiển tùy chỉnh của riêng bạn nếu bạn muốn hiển thị một có thể chỉnh sửa đơn dòng chuỗi vượt quá 32k giới hạn điểm ảnh trong Windows Vista.

0

Không nên có bất kỳ vấn đề nào với chỉ 6000 ký tự - có thể vấn đề ở đâu đó? Bạn có bất kỳ trình xử lý nào cho các sự kiện/thông báo đã thay đổi từ hộp văn bản không? Có lẽ họ đang treo lên?

+0

đây là một dự án mới được tạo ra đặc biệt cho việc này. Đó là một hộp thoại rõ ràng với một điều khiển CEdit, và các nút ok/hủy mặc định, và không có gì nhiều hơn nữa. Trong ứng dụng khác, tôi đã có thể dán 40000 ký tự, vì một số lý do số khác nhau. – rec

1

FYI - nếu văn bản chỉ đọc/dsiplay, bạn có thể thêm một số CR-LF vào chuỗi để sửa hiển thị văn bản. Có vẻ như hàm ExtTextOut hoạt động hơi khác khi các dòng mới. Vì nó là một dòng chỉnh sửa các dòng mới được tước để văn bản trông giống nhau - trừ khi bạn sao chép và dán nó, sau đó các linefeeds sẽ có trong chuỗi ...

Các vấn đề liên quan