2017-08-07 18 views
0

我有一個文本列表視圖並對它有完全的控制權,就像一個夢一樣。LVS_REPORT中沒有LVN_GETINFOTIP通知文本單元格的列表視圖

除了我沒有得到WM_NOTIFY的任何LVN_GETINFOTIP通知。我收到所有其他通知消息,但不是LVN_GETINFOTIP。

我花了一段時間一直谷歌搜索和嘗試任何我能找到的。有些網站表示,從Vista開始它的工作原理不同,但沒有什麼不同。我不在乎它是否在Win10之前能夠運行(可以與之共存),如果它在Win7之前運行則根本不在意。

我真的不知道什麼阻止了LVN_GETINFOTIP消息?

switch (((LPNMHDR)lParam)->code) 
    { 
    case LVN_GETINFOTIP: 


CreateListView(
    0, 
    LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP | LVS_EX_LABELTIP, 
    0, 
    3 * TAB_HIGHT, 
    OwnWindowWidth, 
    OwnWindowHight - (OBJ_WINDOW_HIGHT + (3 * TAB_HIGHT)), 
    hWnd, 
    (HMENU)IDC_MAIN_LISTVIEW, 
    (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE)); 

static HWND CreateListView(
    DWORD dwAddStyle, 
    DWORD dwAddExtendedListViewStyle, 
    int X, 
    int Y, 
    int nWidth, 
    int nHeight, 
    HWND hWndParent, 
    HMENU IdListWiew, 
    HINSTANCE hInst) 
{ 
    HWND hWndListView; 
    INITCOMMONCONTROLSEX icex; 

    memset(&icex, 0, sizeof(INITCOMMONCONTROLSEX)); 

    // Ensure that the common control DLL is loaded. 

    icex.dwSize = sizeof(INITCOMMONCONTROLSEX); 
    icex.dwICC = ICC_LISTVIEW_CLASSES; 
    InitCommonControlsEx(&icex); 

    // Create the list-view window in report view with label 
    // editing enabled. 

    hWndListView = CreateWindowEx(WS_EX_ACCEPTFILES, WC_LISTVIEW, L"", 
     WS_CHILD | LVS_REPORT | WS_VISIBLE | WS_BORDER | WM_NOTIFY | dwAddStyle, 
     X, Y, nWidth, nHeight, 
     hWndParent, IdListWiew, hInst, NULL); 
    if (hWndListView == NULL) 
     return NULL; 
    ListView_SetExtendedListViewStyle(hWndListView, dwAddExtendedListViewStyle); 

    return hWndListView; 
} 
+1

'WM_NOTIFY'這不是窗口樣式。 – RbMm

+0

我知道'LVN_GETINFOTIP'的作用,因爲我在自己的ListView中使用它。您是否啓用了ComCtrl32 v6?爲什麼您將擴展樣式直接傳遞給'ListView_SetExtendedListViewStyle()'而不是'CreatewindowEx()'?你應該在改變樣式時使用'ListView_SetExtendedListViewStyle()',因爲ListView擴展樣式不能用'SetWindowLong/Ptr()'改變' –

+0

WM_NOTIFY是沒有樣式的,並且沒有區別去除它,爲什麼它在那裏我不'不知道。幾年前試圖做這項工作,並放棄了。 –

回答

0

自己發現了錯誤!

我曾經使用過的ListViews的示例代碼隱藏了第一列,所以我無法獲取任何TVN_GETINFOTIP,因爲沒有任何東西可以懸停(第0列的寬度爲0)。我設法通過減少測試程序中的代碼來發現這一點,並仔細閱讀它。有點尷尬,我問。但這是編碼生活。

我現在有一個非常簡潔的示例代碼,如果要使用的報告ListView 160lines。 (我寧願這個問題被刪除)。

#include <windows.h> 
#include <CommCtrl.h> 
#include <wchar.h> 

#define IDC_MAIN_LISTVIEW  100 
#define MAIN_LISTFIELDS 9 
#define MAIN_LISTLINES 78 
int  iMainFieldsWidth[MAIN_LISTFIELDS] = { 50, 60, 78, 70, 100, 50, 50, 121, 112 }; 
WORD wMainFieldsAlign[MAIN_LISTFIELDS] = { LVCFMT_RIGHT,LVCFMT_LEFT, LVCFMT_LEFT,LVCFMT_LEFT,LVCFMT_LEFT, LVCFMT_RIGHT, LVCFMT_RIGHT, LVCFMT_LEFT, LVCFMT_LEFT }; 
WCHAR *pMainFieldsHeader[MAIN_LISTFIELDS] = { L"zero",L"one",L"Two",L"Three",L"Four",L"five",L"six",L"seven",L"eight" }; 
LRESULT WINAPI MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) 
{ 
    CREATESTRUCT MainWindowCreateStruct; 
    WNDCLASS wc; 
    MSG msg; 
    HWND hWnd; 
    if (!hPrevInstance) 
    { 
     wc.lpszClassName = L"AppClass"; 
     wc.lpfnWndProc = MainWndProc; 
     wc.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW; 
     wc.hInstance = hInstance; 
     wc.hIcon = LoadIcon(hInstance, L"1"); 
     wc.hCursor = LoadCursor(NULL, IDC_ARROW); 
     wc.hbrBackground = (HBRUSH)(COLOR_ACTIVEBORDER + 1); 
     wc.lpszMenuName = L"AppMenu"; 
     wc.cbClsExtra = 0; 
     wc.cbWndExtra = 0; 

     RegisterClass(&wc); 
    } 

    memset(&MainWindowCreateStruct, 0, sizeof(CREATESTRUCT)); 
    hWnd = CreateWindowEx(WS_EX_ACCEPTFILES, L"AppClass", 
     L"LvTest", 
     WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, 
     CW_USEDEFAULT, 
     CW_USEDEFAULT, 
     CW_USEDEFAULT, 
     CW_USEDEFAULT, 
     NULL, 
     NULL, 
     hInstance, 
     &MainWindowCreateStruct 
    ); 

    ShowWindow(hWnd, nCmdShow); 

    // Main message loop: 
    while (GetMessage(&msg, NULL, 0, 0)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 

    return 0; 
} 

LRESULT WINAPI MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    switch (msg) 
     { 
     case WM_CREATE: 
      { 
      // Create the list-view window in report view with label 
      // editing enabled. 

      HWND hLvWnd = CreateWindowEx(WS_EX_ACCEPTFILES, WC_LISTVIEW, L"", 
       WS_CHILD | LVS_REPORT | WS_VISIBLE | WS_BORDER, 
       0, 0, 1000, 500, 
       hWnd, (HMENU)IDC_MAIN_LISTVIEW, (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE), NULL); 
      if (hLvWnd == NULL) 
       return 0; 
      ListView_SetExtendedListViewStyle(hLvWnd, LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP | LVS_EX_LABELTIP); 

      ListView_DeleteAllItems(hLvWnd); 
      { 
      LVCOLUMN lvc; 
      int iCol = 0; 

      memset(&lvc, 0, sizeof(LVCOLUMN)); 

      while (ListView_DeleteColumn(hLvWnd, 0)); // Nonvisual left column 

                 // Initialize the LVCOLUMN structure. 
                 // The mask specifies that the format, width, text, and 
                 // subitem members of the structure are valid. 

      lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; 
      // Add the columns. 
      for (iCol = 0; iCol < MAIN_LISTFIELDS; iCol++) 
       { 
       lvc.iSubItem = iCol; 
       lvc.pszText = pMainFieldsHeader[iCol]; 
       lvc.cchTextMax = MAX_PATH; 
       lvc.iImage = 0; 
       lvc.iOrder = 0; 
       lvc.cx = iMainFieldsWidth[iCol];  // width of column in pixels 
       lvc.fmt = wMainFieldsAlign[iCol]; // alignment of column 

       if (ListView_InsertColumn(hLvWnd, lvc.iSubItem, &lvc) == -1) 
        return 0; 
       } 
      } 
      { 
      LVITEM lvI; 
      DWORD index = 0; 

      memset(&lvI, 0, sizeof(LVITEM)); 

      // Some code to create the list-view control. 
      // Initialize LVITEM members that are common to all 
      // items. 
      lvI.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE | LVIF_INDENT; 
      lvI.state = 0; 
      lvI.stateMask = 0; 

      // Initialize LVITEM members that are different for each item. 
      for (index = 0; index < MAIN_LISTLINES; index++) 
       { 
       lvI.iItem = index; 
       lvI.iImage = 0; // Icon 
       lvI.iIndent = 0; 
       lvI.iSubItem = 0; 
       //  lvI.lParam = (LPARAM) &rgPetInfo[index]; 
       lvI.pszText = LPSTR_TEXTCALLBACK; // sends an 
                // LVN_GETDISPINFO 
                // message.          
       if (ListView_InsertItem(hLvWnd, &lvI) == -1) 
        return 0; 
       } 
      } 
      } 
     break; 
     case WM_DESTROY: 
      PostQuitMessage(0); 
      break; 
     case WM_NOTIFY: 
      switch (((LPNMHDR)lParam)->code) 
       { 
       case LVN_GETINFOTIP: 
        if (lParam) 
         { // This is only working it looks, or actually the LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP | LVS_EX_LABELTIP of the CreateWindowEx isn't, would be nice to have 
         LPNMLVGETINFOTIP pGetInfoTip = (LPNMLVGETINFOTIP)lParam; 
         wcscpy(pGetInfoTip->pszText, L"This is an InfoTip Text\nand it takes newlines", pGetInfoTip->cchTextMax); 
         } 
        break; 
       case LVN_GETDISPINFO: 
        if (lParam) 
         { 
         NMLVDISPINFO *plvdi = ((NMLVDISPINFO *)lParam); 
         if ((plvdi->hdr.hwndFrom == GetDlgItem(hWnd, IDC_MAIN_LISTVIEW)) && (plvdi->item.iSubItem<MAIN_LISTFIELDS) && plvdi->item.cchTextMax) 
          wcsncpy(plvdi->item.pszText, pMainFieldsHeader[plvdi->item.iSubItem], plvdi->item.cchTextMax); 
         } 
        break; 
       default: 
        break; 
       } 
      break; 
     default: 
      return(DefWindowProc(hWnd, msg, wParam, lParam)); 
     } 
    return 0; 
} 
相關問題