MFC 中 Picture Control (靜態控制項) 預設不接收點擊通知,需啟用 Notify 屬性並處理 STN_CLICKED 通知訊息,本文提供完整三步驟實作流程。
SS_NOTIFY 樣式)WM_COMMAND/STN_CLICKED 等通知訊息class CMainDlg : public CDialog {
public:
afx_msg void OnStnClickedPicWsus();
afx_msg void OnStnClickedPicVirusList();
afx_msg void OnStnClickedPicSoftList();
// ...
};
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) 實現圖片按鈕的熱追蹤效果:滑鼠進入高亮/邊框、離開恢復。
BN_CLICKED 而非 STN_CLICKED → 訊息映射失效掌握「屬性啟用 → 訊息映射 → 函數實作」三部曲,Picture Control 即刻變身圖片按鈕。