天天看點

ListCtrl的消息響應&MFC基礎

MFC是對Win32API的一個封裝.通過繼承體系大大友善了我們的使用,在建立一個MFC對話框程式的時候預設會生成兩個類

C___App

它是我們的應用程式類,繼承自 CWinApp 類,裡面的InitInstance就相當于WinMain,是一個入口函數.和 WinMain 一樣, 是被動調用的.

C___Dlg

它是我們的應用程式主視窗類,繼承自 CDialogEx 類

CDialogEx繼承自 CDialog 類

CDialog繼承自 CWnd 類

CWnd 是 MFC 中的視窗的基類.抽象了一些視窗的共性

在MFC中, 有很多 OnXXXX 的方法,他們都是被動調用的

比如, OnInitDialog, OnPaint等

它們表示在接收到XXXX消息的時候觸發

比如,

在 WM_PAINT 的時候, 會去執行 OnPaint 方法

在 WM_TIMER 的時候, 會去執行 OnTimer 方法

它們其實本質上都是回調函數

// 初始化ListCtrl的表頭

CRect rect = {  };
m_list.GetWindowRect(&rect);
INT nListWidth = rect.right - rect.left;

m_list.InsertColumn(, L"品名", LVCFMT_CENTER, nListWidth / );
m_list.InsertColumn(, L"數量", LVCFMT_CENTER, nListWidth / );
m_list.InsertColumn(, L"廠商", LVCFMT_CENTER, nListWidth / );
m_list.InsertColumn(, L"價值", LVCFMT_CENTER, nListWidth / );
           
// 設定listCtrl的樣式
// 整行選中 + 網格線
DWORD dwListStyle = m_list.GetStyle();
dwListStyle |= LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES;
m_listInfo.SetExtendedStyle(dwListStyle);
// 需要注意的是先擷取在添加,否則原有的樣式會被覆寫
           
// 在listCtrl中響應滑鼠右鍵消息,彈出一個菜單

//NM_RCLICK這個是listCtrl中的滑鼠右鍵消息

void CInventorManageSystemDlg::OnNMRClickList(NMHDR* pNMHDR, LRESULT* pResult)
{
    DWORD dwPos = GetMessagePos();
    CPoint point(LOWORD(dwPos), HIWORD(dwPos));
    CMenu Menu;
    if (Menu.LoadMenuW(IDR_MENU1))
    {
        CMenu *pSumMenu = Menu.GetSubMenu();
        if (pSumMenu)
            pSumMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, point.x, point.y, this);
    }
}

//裡面的菜單資源需要自己在資源視圖中添加
           
// 滑鼠左鍵的輕按兩下消息  NM_DBLCLK

void CInventorManageSystemDlg::OnNMDblclkList(NMHDR* pNMHDR, LRESULT* pResult)
{
    NM_LISTVIEW *pNMListCtrl = (NM_LISTVIEW *)pNMHDR;

    // 表示滑鼠輕按兩下了listCtrl中的某一行,在下面可以添加自己要處理的事件
    if (pNMListCtrl->iItem == -) 
        return;
    ...
}
           
// 彈出一個子視窗

//模态對話框顯示
CXXXDlg dlg;
dlg.DoModel();
//在使用模态對話框是主視窗處于阻塞狀态.需要子視窗實作OnOK 或 OnCancel

//非模态對話框顯示
CXXXDlg* dlg = new CXXXDlg;
dlg.Create(IDD_DIALOG_XXX);
dlg.ShowWindow(SW_SHOW);