首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

未引用參數處理、任務欄系統選單擴展與命令路由機制

     編輯:關於VC++

探討三個實用的 C++/MFC 技術細節:未引用參數抑制警告、向任務欄按鈕右鍵選單添加自訂命令、MFC 系統命令路由機制。

一、抑制「未引用正式參數」警告

最高警告等級 /W4 會報告未使用的參數(C4100)。兩種常見抑制方法:

1. UNREFERENCED_PARAMETER 宏

#define UNREFERENCED_PARAMETER(P) (P)
int SomeFunction(int arg1, int arg2)
{
    UNREFERENCED_PARAMETER(arg2); // 展開為 "arg2;",無副作用,無代碼生成
    return arg1 + 5;
}

適用於必須符合 API 簽名(如 MFC OnSize(UINT nType, int cx, int cy))但不使用某參數的情況。

2. 註釋參數名

void CMyWnd::OnSize(UINT /* nType */, int cx, int cy) { ... }

使參數無名,編譯器不再警告。但若參數在 _DEBUG 區塊(如 ASSERT)中被使用,Release 建構時會再次觸發警告,此時必須用宏。

3. #pragma warning 控制


#pragma warning(push)
#pragma warning(disable: 4100)
void SomeFunction(int arg1, int arg2) { ... }
#pragma warning(pop)

適用於大範圍抑制,MFC 大量使用此法。


二、向任務欄按鈕右鍵選單添加自訂命令

任務欄按鈕右鍵選單即視窗的系統選單(同標題列圖示右鍵或 Alt+Space)。

系統選單

圖 1:系統選單

透過 GetSystemMenu(FALSE) 取得選單指標,AppendMenu 添加項目。但 MFC 預設不處理系統選單命令(屬 WM_SYSCOMMAND 非 WM_COMMAND)。

三、CSysCmdRouter:將系統命令路由至標準命令機制

自訂類 CSysCmdRouter 繼承 CSubclassWnd,子類化主框架,攔截 WM_SYSCOMMAND:

  • 內建系統命令(ID ≥ 0xF000)直接傳遞給 Windows。
  • 自訂命令轉發為 WM_COMMAND,進入 MFC 標準命令路由(可由 View、Document、App 等處理)。

同時攔截 WM_INITMENUPOPUP,清除 bSysMenu 標誌,使 ON_UPDATE_COMMAND_UI 對系統選單項也生效(啟用/停用、打勾)。

使用方法

int CMainFrame::OnCreate(...)
{
    CMenu* pMenu = GetSystemMenu(FALSE);
    pMenu->AppendMenu(MF_STRING, ID_MYCMD1, "My Command 1");
    pMenu->AppendMenu(MF_STRING, ID_MYCMD2, "My Command 2");

    m_sysCmdHook.Init(this); // 啟用路由
    return 0;
}

之後即可用標準 ON_COMMAND/ON_UPDATE_COMMAND_UI 處理 ID_MYCMD1/2。

任務欄選單效果

圖 3:任務欄選單效果


花絮:Ctrl+Alt+Del 由來

IBM 工程師 David J. Bradley 設計。需兩手操作防誤觸,原為開發人員秘密重啟鍵,後成「三指敬禮」喚出任務管理器。

本文配套原始碼含 CSysCmdRouter 完整實作與測試程式 TBMenu。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved