2012-10-25 27 views
6

Sử dụng Visual Studio 2010 và làm việc với Ứng dụng MFC SDI. Tôi có một đối tượng CMFCToolbar thuộc sở hữu của Khung chính.Nút CMFCToolbar ReplaceButton() khiến nút biến mất

Khi tài liệu trong ứng dụng này được tạo, MainFrame gọi hàm để thay thế một trong các nút trong đối tượng CMFCToolbar bằng CMFCToolbarMenuButton. Nội dung của nút menu được điền thông tin từ tài liệu. Việc tạo menu luôn hoạt động. Cuộc gọi đến ReplaceButton luôn thành công. Nhưng có một triệu chứng trực quan về cuộc gọi mà tôi chưa tìm ra.

Bất kỳ lúc nào ReplaceButton được gọi, nút này biến mất. Không chỉ là nó không được rút ra, nó không thể nhấp được. Nó tạm thời biến mất. Tôi giả định điều này là bởi vì có một tham chiếu lơ lửng đến nút cũ, mà tôi vừa phá hủy với các cuộc gọi đến ReplaceButton.

Tôi đã thử gọi Invalidate(), RecalcLayout() để kích hoạt vẽ lại nhưng chưa hoạt động. Phương pháp đáng tin cậy duy nhất tôi có để có được nút để hiển thị là tái kích thước cửa sổ ứng dụng bằng tay hoặc bằng cách un-docking/re-docking thanh công cụ. Tôi cho rằng có một số loại làm mới mức thấp hơn xảy ra trong những tình huống này, nhưng tôi không biết cách kích hoạt nó theo cách thủ công.

Có cách nào để đảm bảo nút của tôi được vẽ ngay lập tức không?

Edit: mẫu mã

Count = m_Doc->...->GetCount(); 
for (Index = 0; Index < Count; ++Index) 
{ 
    Caption.Format(L"%s", m_Doc->...->GetName()); 
     m_pLayerMenu->AppendMenu(MF_ENABLED | MF_STRING, LAYER_DROP_SEED+Index, Caption.GetData()); 
} 
m_wndBrushBar.ReplaceButton(ID_BRUSH_TERRAIN, 
    CMFCToolBarMenuButton(ID_BRUSH_TERRAIN, *m_pLayerMenu, GetCmdMgr()->GetCmdImage(ID_BRUSH_TERRAIN))); 

Cập nhật:

Calling m_wndBrushBar.AdjustLayout() dường như ổn định hành vi thị giác của các nút này CMFCToolbar. Vì vậy, đó là một giải pháp một phần. Một phần vì những điều sau:

Thật khó để biết hành vi trực quan thực sự là gì. Nó chỉ ra rằng tất cả các thiết lập trực quan/tiểu bang được lưu trữ trong Registry với các đối tượng MFC, và nó có thể giữ trạng thái của các đối tượng được tạo động mà thực sự thay đổi hành vi khởi động của ứng dụng.

Tôi đã xóa các giá trị đăng ký dưới

Current User -> "Local App-Wizard Generated Applications" -> [My App Name]. Thực hiện điều này một số lần, chỉ để tìm hiểu hành vi thực sự của ứng dụng của tôi là gì. Cảm thấy như tôi đang thiếu một số kiến ​​thức cơ bản với phiên bản hiện tại của MFC. Rất nhiều lỗi phát sinh từ thỏa thuận đăng ký.

Có cách nào để ngăn cài đặt đăng ký cho một số đối tượng nhất định hoặc tắt hoàn toàn hành vi này không? Nếu không, tôi đoán quá trình tắt máy của tôi sẽ phải là một LOT triệt để hơn với việc đặt lại tất cả các yếu tố hình ảnh. Các giá trị đăng ký dường như bỏ qua, ghi đè hoặc bỏ qua mã khởi động của tôi. Tôi có thể mã như thế nào tôi muốn một đối tượng để xem xét khởi động, nhưng nếu có giá trị trong registry, nó không tốt.

+0

Đây là một câu hỏi hay. Bạn có thể thêm một số mã nguồn có liên quan không? – dpassage

Trả lời

0

Bạn đã phát hiện ra một khía cạnh đôi khi gây phiền nhiễu cho mã CMFC. Đó là, khái niệm về một không gian làm việc. Không gian làm việc quản lý khái niệm trạng thái ứng dụng. Tôi cũng vậy, đã có những vấn đề như bạn mô tả. Tuy nhiên, bạn có thể linh hoạt để quản lý cách các đối tượng đó được tái tạo bằng cách ghi đè các phương thức LoadState() và SaveState().

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