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

VC Picture Control 點擊事件處理完整指南:從屬性設定到訊息映射

     編輯:關於VC++

MFC 中 Picture Control (靜態控制項) 預設不接收點擊通知,需啟用 Notify 屬性並處理 STN_CLICKED 通知訊息,本文提供完整三步驟實作流程。

步驟 1:資源編輯器啟用 Notify 屬性

  1. 選中 Picture Control 控制項
  2. 屬性視窗 → Notify = True (或 SS_NOTIFY 樣式)
  3. 此步驟使控制項發送 WM_COMMAND/STN_CLICKED 等通知訊息

步驟 2:頭文件宣告處理函數

class CMainDlg : public CDialog {
public:
    afx_msg void OnStnClickedPicWsus();
    afx_msg void OnStnClickedPicVirusList();
    afx_msg void OnStnClickedPicSoftList();
    // ...
};

步驟 3:CPP 文件添加訊息映射並實作


BEGIN_MESSAGE_MAP(CMainDlg, CDialog)
    ON_STN_CLICKED(IDC_PIC_WSUS, &CMainDlg::OnStnClickedPicWsus)
    ON_STN_CLICKED(IDC_PIC_VIRUSLIST, &CMainDlg::OnStnClickedPicVirusList)
    ON_STN_CLICKED(IDC_PIC_SOFTLIST, &CMainDlg::OnStnClickedPicSoftList)
    // ...
END_MESSAGE_MAP()

void CMainDlg::OnStnClickedPicWsus() {
    m_wsusDlg.ShowWindow(SW_SHOW);
    m_virusListDlg.ShowWindow(SW_HIDE);
    m_softListDlg.ShowWindow(SW_HIDE);
}

void CMainDlg::OnStnClickedPicVirusList() {
    m_virusListDlg.ShowWindow(SW_SHOW);
    m_wsusDlg.ShowWindow(SW_HIDE);
    m_softListDlg.ShowWindow(SW_HIDE);
}

void CMainDlg::OnStnClickedPicSoftList() {
    m_softListDlg.ShowWindow(SW_SHOW);
    m_wsusDlg.ShowWindow(SW_HIDE);
    m_virusListDlg.ShowWindow(SW_HIDE);
}

完整圖片載入與點擊整合範例


// OnInitDialog 中載入三張圖片
HBITMAP hBmpWsus = (HBITMAP)LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_BITMAP_WSUS), IMAGE_BITMAP, 0, 0, LR_LOADMAP3DCOLORS);
HBITMAP hBmpVirus = (HBITMAP)LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_BITMAP_VIRUS), IMAGE_BITMAP, 0, 0, LR_LOADMAP3DCOLORS);
HBITMAP hBmpSoft = (HBITMAP)LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_BITMAP_SOFT), IMAGE_BITMAP, 0, 0, LR_LOADMAP3DCOLORS);

CStatic* pPicWsus = (CStatic*)GetDlgItem(IDC_PIC_WSUS);
pPicWsus->ModifyStyle(0x0F, SS_BITMAP | SS_CENTERIMAGE);
pPicWsus->SetBitmap(hBmpWsus);

CStatic* pPicVirus = (CStatic*)GetDlgItem(IDC_PIC_VIRUSLIST);
pPicVirus->ModifyStyle(0x0F, SS_BITMAP | SS_CENTERIMAGE);
pPicVirus->SetBitmap(hBmpVirus);

CStatic* pPicSoft = (CStatic*)GetDlgItem(IDC_PIC_SOFTLIST);
pPicSoft->ModifyStyle(0x0F, SS_BITMAP | SS_CENTERIMAGE);
pPicSoft->SetBitmap(hBmpSoft);
// 注意:HBITMAP 需在對話方塊銷毀時 DeleteObject

關鍵技術點總結

環節關鍵點
屬性啟用Notify=True (SS_NOTIFY) 是接收點擊通知的前提
訊息宏ON_STN_CLICKED (非 BN_CLICKED,後者為 Button 專用)
函數簽名afx_msg void OnXxx() - 無參數、無回傳值
控制項 ID每個 Picture Control 需唯一 ID 對應各自處理函數
圖片居中SS_CENTERIMAGE 樣式實現垂直水平雙向置中

進階:滑鼠懸停/離開視覺回饋

結合 WM_MOUSEMOVE + TrackMouseEvent (參考 WM_MOUSEHOVER/WM_MOUSELEAVE) 實現圖片按鈕的熱追蹤效果:滑鼠進入高亮/邊框、離開恢復。

常見坑點

  • 忘記設定 Notify=True → 永不觸發點擊
  • 使用 BN_CLICKED 而非 STN_CLICKED → 訊息映射失效
  • 多個 Picture Control 共用同一處理函數 → 無法區分來源
  • HBITMAP 重複載入未釋放 → GDI 物件洩漏

掌握「屬性啟用 → 訊息映射 → 函數實作」三部曲,Picture Control 即刻變身圖片按鈕。

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