Разработка информационно-поисковой системы, страница 11

            RemoveMenu (hMenu, IDM_W00 + i, MF_BYCOMMAND);

      /* отрисовка главного окна */

      ShowWindow (hMainWnd, (int)s_info.wShowWindow);

      return 1;

}

/* вывод сообщения об ошибке */

void error_msg(const TCHAR * msg)

{

      MessageBox (hMainWnd, msg, app_name, MB_OK + MB_ICONERROR);

}

/* установка названия и размеров колонок для заданного окна */

void set_columns(const HWND hListWnd, const COLUMN * data)

{

      int i=0;

      LVCOLUMN lvc;

      lvc.mask = LVCF_TEXT + LVCF_WIDTH;

      while (data[i].length)

      {

            lvc.cx = data[i].length;

            lvc.pszText = data[i].text;

            ListView_SetColumn (hListWnd, i++, &lvc);

      }

      /*

      ** Установка ширины ненужных колонок в 0

      */

      lvc.mask = LVCF_WIDTH;

      lvc.cx = 0;

      while (i < columns)

            ListView_SetColumn (hListWnd, i++, &lvc);

}

/* добавление ряда элементов в список */

void add_listview_row(const HWND hWnd, const int count, TCHAR ** data)

{

      LV_ITEM lvi;

      lvi.mask = LVIF_TEXT + LVIF_PARAM;

      lvi.iItem = 0;

      lvi.iSubItem = 0;

      lvi.pszText = (LPSTR)data[0];

      lvi.lParam = 0;

      lvi.iItem = (int) SendMessage (hWnd, LVM_INSERTITEM, 0, (LPARAM)&lvi);

      lvi.mask = LVIF_TEXT;

      for (int i = 1; i < count; i++)

      {

            lvi.iSubItem = i;

            lvi.pszText = (LPSTR)data[i];

            SendMessage (hWnd, LVM_SETITEM, 0, (LPARAM)&lvi);

      }

      LVWnd_t * wnd = (LVWnd_t*) GetWindowLong (hWnd, GWL_USERDATA);

      if (wnd)

            wnd->rows++;

}

/* возврат номера элемента списка, на котором находится фокус ввода */

int get_focused_item(const HWND hWnd)

{

      return (int)SendMessage(hWnd, LVM_GETNEXTITEM, (WPARAM)-1, LVNI_FOCUSED);

}

/* возврат ID выделенного элемента списка */

int get_selected_item_id(int * item_id, const HWND hWnd)

{

      LV_ITEM lvi;

      TCHAR buf[256];

      lvi.iItem = get_focused_item(hWnd);

      if (lvi.iItem != -1)

      {

            lvi.iSubItem = 0;

            lvi.mask = LVIF_TEXT;

            lvi.pszText = buf;

            lvi.cchTextMax = sizeof(buf);

            SendMessage(hWnd, LVM_GETITEM, 0, (LPARAM)&lvi);

            return (*item_id = atoi(buf));

      }

      return lvi.iItem;

}

/*  добавить элемент в окно выбора значения */

void add_combo_item(const HWND hWnd, const TCHAR * text, int data)

{

      int index = (int)SendMessage(hWnd, CB_ADDSTRING, 0, (LPARAM)text);

      SendMessage(hWnd, CB_SETITEMDATA, index, data);

}

/* функция, вызываемая при сортировке результатов поиска */

int CALLBACK compare_func(LPARAM param1, LPARAM param2, LPARAM param_sort)

{

      TCHAR buf1[256], buf2[256];

      LV_ITEM lvi;

      lvi.mask = LVIF_TEXT;

      lvi.pszText = buf1;

      lvi.cchTextMax = sizeof(buf1);

      lvi.iSubItem = (int)param_sort;

      SendMessage (hResultsListWnd, LVM_GETITEMTEXT, param1, (LPARAM)&lvi);

    lstrcpy (buf2, buf1);

      SendMessage (hResultsListWnd, LVM_GETITEMTEXT, param2, (LPARAM)&lvi);

      return lstrcmp((LPCTSTR)buf1, (LPCTSTR)buf2);

}

/*  сортировка элементов в списке по 1 колонке */

void sort_column(const HWND hWnd, const int column_id)

{

      LV_ITEM lvi;

      TCHAR ** data;

      LV_COLUMN lvc;

      lvc.mask = LVCF_WIDTH;

      int cols = 0, i, j;

      lvi.mask = LVIF_TEXT;

      lvi.cchTextMax = 256;

      while (ListView_GetColumn(hWnd, cols, &lvc)) cols++;

      int cnt = ListView_GetItemCount(hWnd);

      data = (TCHAR**)malloc(sizeof(int)*cnt*cols);

      for (i=0; i<cnt; i++)

            for (j=0; j<cols; j++)

      {

            data[i*cols + j] = (TCHAR*)malloc(256);

            lvi.iItem = i;

            lvi.iSubItem = j;

            lvi.pszText = (TCHAR*)data[i*cols + j];

            ListView_GetItem(hWnd, &lvi);

      }

      TCHAR * tmp;

      bool exchange = true;

      while (exchange)

            for (i=1, exchange=false; i<cnt; i++)

                  if (lstrcmp(data[(i-1)*cols + column_id], data[i*cols + column_id])>0)

                  {

                        for (j=0; j<cols; j++)