Мерцание полосы прокрутки ListView - PullRequest
0 голосов
/ 01 июня 2011

Я пишу свою первую программу с графическим интерфейсом, используя только чистый WinAPI.Но я столкнулся с какой-то странной проблемой.

В форме есть 2 элемента ListView для вывода некоторых значений.Когда полоса прокрутки появляется во втором ListView, все дочерние объекты в форме исчезают.И полоса прокрутки этого ListView мигает.И когда я нажимаю на этот ListView все вернуться к нормальной жизни.Я не знаю, что делать.

Но эта проблема относится только ко второму элементу ListView, hListViewCh в форме.С первым элементом все в порядке.

Вот код:

case WM_CREATE:
    {
    GetClientRect(hWnd, &Rect);

    h_Chk1 = CreateWindow(TEXT("button"), TEXT("Graphic"),
             WS_VISIBLE | WS_CHILD | BS_CHECKBOX,
             Rect.right - 550, 
     300  + 10, 
     100, 
     20,
     hWnd, (HMENU)0xCB01, (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), NULL);
        h_Chk2 = CreateWindow(TEXT("button"), TEXT("Diagram"),
             WS_VISIBLE | WS_CHILD | BS_CHECKBOX,
             Rect.right - 550, 
     300  + 35, 
     100, 
     20,
     hWnd, (HMENU)0xCB02, (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), NULL);
        CheckDlgButton(hWnd, 0xCB01, BST_UNCHECKED);
    CheckDlgButton(hWnd, 0xCB02, BST_UNCHECKED);

            hListViewCh = CreateWindow(
                WC_LISTVIEW, 
                _T("MyList"),
                LVS_REPORT|WS_CHILD|WS_VISIBLE,
                Rect.right - 265,
                377,
                     250,
                200,
                hWnd, (HMENU)listViewCh, (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), NULL);
            //--
            LVCOLUMN lvColumn = {0};
            lvColumn.mask = LVCF_FMT|LVCF_WIDTH|LVCF_TEXT;
            lvColumn.fmt = LVCFMT_CENTER;
            lvColumn.pszText = "№";
            lvColumn.cx = 30;
            ListView_InsertColumn(hListViewCh, 0, &lvColumn);
            lvColumn.pszText = "Property";
            lvColumn.cx = 70;
            ListView_InsertColumn(hListViewCh, 1, &lvColumn);
            lvColumn.pszText = "Value";
            lvColumn.cx = 120;
            ListView_InsertColumn(hListViewCh, 2, &lvColumn);
            //--
         hListView = CreateWindow(
          WC_LISTVIEW,
          _T("Set of variate values"),
          LVS_REPORT|WS_CHILD|WS_VISIBLE,
          Rect.right - 550,
          Rect.top   +  15,
          535,
          275,
          hWnd,
          (HMENU)listView,
          (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE),
          NULL);
            //--
            lvColumn.mask = LVCF_FMT|LVCF_WIDTH|LVCF_TEXT;
            lvColumn.pszText = "No";
            lvColumn.fmt = LVCFMT_CENTER;
            lvColumn.cx = 43;
                            ListView_InsertColumn(hListView, 0, &lvColumn);
            //--
            lvColumn.pszText = "[ a[i-1]      ,         a[i] )";
            lvColumn.cx = 151;
            ListView_InsertColumn(hListView, 1, &lvColumn);
            //--
            lvColumn.pszText = "xi";
            lvColumn.cx = 85;
            ListView_InsertColumn(hListView, 2, &lvColumn);
            //--
            lvColumn.pszText = "ni";
            ListView_InsertColumn(hListView, 3, &lvColumn);
            //--
            lvColumn.pszText = "V";
            ListView_InsertColumn(hListView, 4, &lvColumn);
            //--
            lvColumn.pszText = "EV";
            ListView_InsertColumn(hListView, 5, &lvColumn);
            break;
}

В WM_PAINT есть несколько функций перерисовки, позволяющих ListViews двигаться с окном при максимизации.

        //-- LISTVIEW POSITION
        SetWindowPos(hListViewCh, NULL,\
                            Rect.right - 265,
                            312,
                            250,
                            200,
                            SWP_NOSIZE);
        //-- LISTVIEW POSITION
        SetWindowPos(hListView, NULL,\
                            Rect.right - 550,\
                            Rect.top   +  15,\
                            535,\
                            340,\
                            SWP_NOSIZE|SWP_NOZORDER);
        //--

1 Ответ

3 голосов
/ 01 июня 2011

Изменение размера дочерних окон в WM_PAINT просто неправильно, и я подозреваю, что это большая часть ваших проблем.

Код для позиционирования дочерних окон должен быть запущен в ответ на сообщение WM_WINDOWPOSCHANGED.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...