Здравствуйте!
Есть диалог, в котором находится 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
|
Подозреваю, что сделал что-то не так, но что не так - не прозреваю((( Посоветуйте, пожалуйста, что-нибудь))) |