Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > WinAPI
Перезагрузить страницу Не прорисовывается ListView в дочернем диалоге
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
feodor feodor вне форума
Новичок
 
Сообщений: 1
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 30.07.2011
По умолчанию Не прорисовывается ListView в дочернем диалоге - 30.07.2011, 06:19

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

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

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

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

c Код:
#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( HI_LOG_AREA_DIALOG, AZ_LOG_LEVEL_ERROR, 1,
      //  HI_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( HI_LOG_AREA_DIALOG, AZ_LOG_LEVEL_ERROR, 1,
      //  HI_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;
}

Ресурс:

c Код:
//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

Подозреваю, что сделал что-то не так, но что не так - не прозреваю((( Посоветуйте, пожалуйста, что-нибудь)))
Вложения
Тип файла: zip proj.zip (3.3 Кб, 19 просмотров)
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как в диалоге отловить нажатие клавиш Num + / Num - Sash&#39;Ok&#33; Visual C++ 1 15.09.2006 16:51
Прозрачная картинка на диалоге MFC Aracon Visual C++ 3 02.09.2006 19:36
PNG как отобразить картинку на диалоге Rickert Visual C++ 14 21.07.2006 06:17
Как запретить перерисовку прямоугольника в диалоге BabyBear Visual C++ 2 27.03.2006 13:48
Фон Picture Control в диалоге sag1979 Вопросы начинающих программистов 6 26.02.2006 23:06
Как вывести текст в диалоге AXeSS WinAPI 10 02.12.2005 15:54
Получение значений в модальном диалоге Jazzrock Prolog 10 26.04.2005 12:56
Четыре радиобутона в дочернем окне johny Visual C++ 8 17.11.2004 10:45
Tab Order создание в диалоге Garik Visual C++ 0 04.11.2004 18:09
Создание анимации в диалоге Anonymous Visual C++ 2 15.01.2004 13:23
Как на диалоге отобразить таблицу Anonymous Visual C++ 1 18.11.2003 13:13
Обмен данными в диалоге Anonymous Visual C++ 3 14.05.2003 18:03



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов