Глючит ListView помогите пожалуйста! СРОЧНО!
От: soolitarY  
Дата: 31.05.11 18:22
Оценка:
Здравствуйте

Впервые пишу программу с интерфейсом — форма на чистом WinAPI. Столкнулся с такой проблемой:

На форме 2 ListView в них выводятся числовые данные, при появлении полосы прокрутки на одном из ListView все дочерние объекты на форме перестают отображаться. а скролл ListView сильно мерцает. при нажатии на этот ListView — всё проходит. Я уже не знаю что и делать. привожу создание объектов:


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 есть функции перерисовки, чтобы при расширении окон всё было красиво и двигалось с ними

            //-- 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);
            //--


Не представляю в чем проблема. ПОМОГИТЕ СРОЧНО!

02.06.11 11:38: Перенесено из 'C/C++. Прикладные вопросы'
c++ winapi
Re: Глючит ListView помогите пожалуйста! СРОЧНО!
От: ZegSoft Россия  
Дата: 31.05.11 19:01
Оценка: +1
Здравствуйте, soolitarY, Вы писали:

Y>Здравствуйте


Y>Впервые пишу программу с интерфейсом — форма на чистом WinAPI. Столкнулся с такой проблемой:


Y>На форме 2 ListView в них выводятся числовые данные, при появлении полосы прокрутки на одном из ListView все дочерние объекты на форме перестают отображаться. а скролл ListView сильно мерцает. при нажатии на этот ListView — всё проходит. Я уже не знаю что и делать. привожу создание объектов:



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

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

Y>в WM_PAINT есть функции перерисовки, чтобы при расширении окон всё было красиво и двигалось с ними

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


Y>Не представляю в чем проблема. ПОМОГИТЕ СРОЧНО!


А если убрать ресайзинг из OnPaint, проблема остается?
Не вникая в подробности кода, возникает интуитивное ощущение, что проблема именно в этом. Обычно, для ресайзинга элементов управления используют WM_SIZE. Честно говоря, возникает ощущение, что сейчас у тебя просто зацикливается функция OnPaint: WM_PAINT вызывает ресайзинг LISTVIEW, который в свою очередь вызывает опять WM_PAINT(так как часть диалогового окна изменяется). Попробуй перенести функции изменения размера в OnSize. О результатах отпишись.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.