2008-08-13 41 views
6

Tôi đang phát triển một ứng dụng MFC và gần đây tôi đã tìm kiếm một phương pháp tốt để xóa biểu tượng khỏi thanh tiêu đề Windows, nhưng giữ nút đóng. Hai giải pháp ứng cử viên rõ ràng là tắt kiểu menu hệ thống hoặc sử dụng kiểu cửa sổ công cụ, nhưng tôi không muốn vô hiệu hóa menu hệ thống hoặc sử dụng thanh tiêu đề của cửa sổ công cụ bị thu nhỏ. Nhiều ứng dụng MFC có chức năng này, vì vậy tôi tự hỏi: Tôi có thiếu một số cách tiêu chuẩn để làm điều này?Xóa biểu tượng khỏi thanh tiêu đề Windows mà không bỏ qua nút đóng hoặc menu hệ thống?

Trả lời

2

Bạn có thể sử dụng WM_NCRBUTTONDOWN để phát hiện xem người dùng đã nhấp chuột phải vào chú thích và sau đó hiển thị menu hệ thống.

0

điều gì về việc thoát khỏi menu hệ thống và sau đó đặt nó trở lại ở một nơi khác của bạn (nói bên cạnh nút đóng, v.v ...)?

0

Nếu không có biểu tượng, phương pháp duy nhất tôi có thể tưởng tượng để người dùng truy cập menu hệ thống là thông qua nhấp chuột phải vào thanh tiêu đề.

Nếu đó là những gì bạn có trong tâm trí, bạn có thể xử lý WM_RBUTTONDOWN trên khung chính của bạn và sau đó tính toán nếu nhấp chuột phải là trên thanh tiêu đề.

int clickX = GET_X_LPARAM(lParam); 
int clickY = GET_Y_LPARAM(lParam); 

CRect frameRect; 
mainFrame.GetWindowRect(&frameRect); 

int titleBarHeight = GetSystemMetrics(SM_CYCAPTION); 

if (clickX >= frameRect.left && 
    clickX <= frameRect.right && 
    clickY >= frameRect.top && 
    clickY <= frameRect.top + titleBarHeight) 
{ 
    TrackPopupMenu(m_systemMenu); 
} 
4

Đặt WS_EX_DLGMODALFRAME kiểu mở rộng.

+0

Điều này đáng lẽ phải là câu trả lời. – c00000fd

2

Bạn có thể sử dụng biểu tượng hoàn toàn trong suốt.

0

Một mẫu mã trong Delphi mà loại bỏ biểu tượng:

const 
    WM_ResetIcon = WM_APP - 1; 

type 
    TForm1 = class(TForm) 
    procedure FormShow(Sender: TObject); 
    protected 
    procedure WMResetIcon(var Message: TMessage); message WM_ResetIcon; 
    end; 

implementation 

procedure TForm1.FormShow(Sender: TObject); 
begin 
    PostMessage(Handle, WM_ResetIcon, 0, 0); 
end; 

procedure TForm1.WMResetIcon(var Message: TMessage); 
const 
    ICON_SMALL = 0; 
    ICON_BIG = 1; 
begin 
    DestroyIcon(SendMessage(Handle, WM_SETICON, ICON_BIG, 0)); 
    DestroyIcon(SendMessage(Handle, WM_SETICON, ICON_SMALL, 0)); 
end; 

Một mã tương tự nên làm việc cho MFC. Về cơ bản, bạn chỉ cần WM_SETICON để NULL ở đúng nơi.

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