Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не прорисовывается ListView в дочернем диалоге 
:(
    Опции темы
feodorv
Дата 2.8.2011, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Здравствуйте!

Есть диалог, в котором находится Tab, к которому прикручен дочерний диалог с ListView. Всё работает, только наблюдается странный эффект: если кликнуть мышью (неважно, левой или правой кнопкой) в области ListView, затем свернуть окно, а затем восстановить его, то ListView не прорисовывается (он как бы пропадает), при этом другие элементы дочернего диалога перерисовываются нормально.

Если мышью в области ListView не кликать (или кликать в области заголовка ListView), то эффект не проявляется, и всё здОрово. Голову сломал, чтобы понять, как это всё исправить...

Минималистский код, в котором проявляется эффект: 

Код

#include <windows.h>
#include <commctrl.h>
#include "resource.h"

static HINSTANCE hProgramInstance;

enum
{
  LVT_TAB_DIALOG1 = 0,
  LVT_TAB_DIALOG2,
  LVT_TAB_DIALOG3,
  LVT_TAB_DIALOG_LAST
};

static HWND lvtDialogs[LVT_TAB_DIALOG_LAST];
static HWND lvtCurDialog;

static INT_PTR CALLBACK lvtTabDialogProc(
   HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
  return FALSE;
}

struct lvt_tabdialog_s
{
  const char *header;
  DLGPROC proc;
  WORD resource;
};

static struct lvt_tabdialog_s lvtTabDialogs[LVT_TAB_DIALOG_LAST] =
{
  {
    "Tab #1",
    lvtTabDialogProc,
    IDD_DIALOG_TAB1,
  },
  {
    "Tab #2",
    lvtTabDialogProc,
    IDD_DIALOG_TAB2,
  },
  {
    "Tab #3",
    lvtTabDialogProc,
    IDD_DIALOG_TAB3,
  }
};

static BOOL lvtDialogInit( HWND dialog )
{
  HWND tab = GetDlgItem( dialog, IDC_TAB);
  int i;

/* Tab dialogs */
  for( i = 0; i < LVT_TAB_DIALOG_LAST; i++)
  {
    struct lvt_tabdialog_s *t = &lvtTabDialogs[i];
    TCITEM item;

    ZeroMemory( &item, sizeof(TCITEM));
    item.mask = TCIF_TEXT;
    item.pszText = (char *) t->header;
    if( TabCtrl_InsertItem( tab, i, &item) < 0 )
    {
      //azLog( lvtLog(), dialog, AZ_LOG_EVENT_EX( LVT_LOG_AREA_DIALOG, AZ_LOG_LEVEL_ERROR, 1,
      //  LVT_LOG_CONFEVENT_DIALOG_ERROR), 0, "lvtDialogInit::TabCtrl_InsertItem()");
      return FALSE;
    }

    if( (lvtDialogs[i] = CreateDialog( hProgramInstance,
          MAKEINTRESOURCE(t->resource), dialog, t->proc)) == NULL )
    {
      //azLog( lvtLog(), dialog, AZ_LOG_EVENT_EX( LVT_LOG_AREA_DIALOG, AZ_LOG_LEVEL_ERROR, 1,
      //  LVT_LOG_CONFEVENT_DIALOG_ERROR), GetLastError(), "lvtDialogInit::CreateDialogParam()");
      return FALSE;
    }
  }

  ShowWindow( lvtCurDialog = lvtDialogs[0], SW_SHOWNORMAL);
  return TRUE;
}

static void lvtDialogChange( HWND dialog )
{
  HWND tab = GetDlgItem( dialog, IDC_TAB);
  int num;

  if( lvtCurDialog != NULL )
  {
    ShowWindow( lvtCurDialog, SW_HIDE);
    lvtCurDialog = NULL;
  }

  if( (num = TabCtrl_GetCurSel( tab )) >= 0 && num < LVT_TAB_DIALOG_LAST )
    ShowWindow( lvtCurDialog = lvtDialogs[num], SW_SHOWNORMAL);
}

static void lvtDialogEnd( HWND dialog, INT_PTR nResult)
{
  int i;

  lvtCurDialog = NULL;
  for( i = 0; i < LVT_TAB_DIALOG_LAST; i++)
    if( lvtDialogs[i] != NULL )
    {
      DestroyWindow( lvtDialogs[i] );
      lvtDialogs[i] = NULL;
    }

  EndDialog( dialog, nResult);
}

static INT_PTR CALLBACK lvtDialogProc(
    HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
  switch( uMsg )
  {
    case WM_NOTIFY:
    {
      NMHDR *nm = (LPNMHDR) lParam;
      if( nm->code == TCN_SELCHANGE && nm->idFrom == IDC_TAB )
      {
        lvtDialogChange( hwnd );
        return TRUE;
      }
      break;
    }

    case WM_COMMAND:
      switch( HIWORD(wParam) )
      {
        case BN_CLICKED:
          switch( LOWORD(wParam) )
          {
            case IDOK:
            case IDCANCEL:
              lvtDialogEnd( hwnd, LOWORD(wParam));
              SetWindowLong( hwnd, DWL_MSGRESULT, 0);
              return 0;
          }
      }
      break;

    case WM_INITDIALOG:
      if( !lvtDialogInit( hwnd ) )
        lvtDialogEnd( hwnd, IDCANCEL);
      else
        return TRUE;
      break;
  }

  return FALSE;
}

int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
  INITCOMMONCONTROLSEX ic;

  hProgramInstance = hInstance;

  ZeroMemory( &ic, sizeof(INITCOMMONCONTROLSEX));
  ic.dwSize = sizeof(INITCOMMONCONTROLSEX);
  ic.dwICC = ICC_WIN95_CLASSES | ICC_INTERNET_CLASSES;
  if( !InitCommonControlsEx( &ic ) ) return -1;

  DialogBox( hProgramInstance, MAKEINTRESOURCE(IDD_DIALOG_LVTAB), NULL, lvtDialogProc);

  return 0;
}


Файл ресурса:

Код

//Microsoft Developer Studio generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// Russian resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)
#ifdef _WIN32
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
#pragma code_page(1251)
#endif //_WIN32

/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

IDD_DIALOG_TAB1 DIALOG DISCARDABLE  10, 66, 412, 182
STYLE DS_CONTROL | WS_CHILD
FONT 8, "MS Sans Serif"
BEGIN
    CTEXT           "HEADER #1",IDC_STATIC_HEADER1,7,9,396,23,SS_SUNKEN
END

IDD_DIALOG_LVTAB DIALOG DISCARDABLE  0, 0, 432, 303
STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU |
    WS_THICKFRAME
FONT 8, "MS Sans Serif"
BEGIN
    CONTROL         "Tab1",IDC_TAB,"SysTabControl32",WS_TABSTOP,7,51,418,206
END

IDD_DIALOG_TAB2 DIALOG DISCARDABLE  10, 66, 411, 182
STYLE DS_CONTROL | WS_CHILD
FONT 8, "MS Sans Serif"
BEGIN
    CTEXT           "HEADER #2",IDC_STATIC_HEADER2,7,7,397,27,SS_SUNKEN
END

IDD_DIALOG_TAB3 DIALOG DISCARDABLE  10, 66, 412, 182
STYLE DS_CONTROL | WS_CHILD | WS_BORDER
FONT 8, "MS Sans Serif"
BEGIN
    CONTROL         "List1",IDC_LIST_VIEW,"SysListView32",LVS_REPORT |
                    LVS_SINGLESEL | LVS_OWNERDATA | LVS_NOSORTHEADER |
                    WS_BORDER | WS_TABSTOP,7,46,397,129
    CTEXT           "HEADER #3",IDC_STATIC_HEADER3,7,7,397,27,SS_SUNKEN
END


#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE DISCARDABLE
BEGIN
    "resource.h\0"
END

2 TEXTINCLUDE DISCARDABLE
BEGIN
    "#include ""afxres.h""\r\n"
    "\0"
END

3 TEXTINCLUDE DISCARDABLE
BEGIN
    "\r\n"
    "\0"
END

#endif    // APSTUDIO_INVOKED

#endif    // Russian resources
/////////////////////////////////////////////////////////////////////////////



#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//


/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED


Подозреваю, что сделал что-то не так, но что не так - не прозреваю((( Посоветуйте, пожалуйста, что-нибудь))) 

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  proj.zip 3,04 Kb


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Dem_max
Дата 2.8.2011, 07:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



попробуй убрать стиль LVS_OWNERDATA


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
feodorv
Дата 2.8.2011, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата
попробуй убрать стиль LVS_OWNERDATA 

Эх, убрал, эффект тот же(((


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
mekhanikus
Дата 6.8.2011, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вольноопределяющийся
*


Профиль
Группа: Участник
Сообщений: 186
Регистрация: 16.6.2008
Где: Спасск-Дальний

Репутация: 1
Всего: 1



Если ещё актуально.

Попробуй Tab сделать родителем ListView.
PM MAIL   Вверх
feodorv
Дата 6.8.2011, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(mekhanikus @ 6.8.2011,  00:41)
Если ещё актуально.

Попробуй Tab сделать родителем ListView.

Ещё как актуально!
Спасибо за совет))), только я его до конца не понял(((

Теоретически возможны два варианта:
1/ прописываем Tab родителем дочерних диалогов (при этом нарушается реакция на клавиши Tab и Shift-Tab, ну да и бог с ней))) Удивительно, на для тестового примера в этом случае эффект пропадает  smile Однако в реальной программе при клике на область ListView программа зависает, загрузка процессора 99%, с этим ещё предстоит разобраться  smile 
2/ прописываем ListView в главный (модальный) диалог, поверх таба и дочерних диалогов, первоначально прячем его, а при выборе нужной страницы таба показываем его, как буд-то он принадлежит дочернему диалогу. Здесь тоже предстоит возня с Тab/Shift-Tab, резайзингом и т.п., но попробовать стоит smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0726 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.