Здравствуйте
Впервые пишу программу с интерфейсом — форма на чистом 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++. Прикладные вопросы'
Здравствуйте, 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. О результатах отпишись.