berkov Temat założony przez niniejszego użytkownika |
[WinAPI, MDI] Okienka nie są odświeżane » 2013-11-09 12:48:29 Hey ho. Problem, czy ktos poradzi czemu okienka MDI jakby nie chcialy sie "odswiezac"? screenshot pod: int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{ info->version = 1.01; info->release = 20131106; WNDCLASSEX wMain; wMain.cbSize = sizeof( WNDCLASSEX ); wMain.style = CS_DBLCLKS; wMain.lpfnWndProc = WndProc_MAIN; wMain.cbClsExtra = 0; wMain.cbWndExtra = 0; wMain.hInstance = hInstance; wMain.hIconSm = LoadIcon( hInstance, MAKEINTRESOURCE( ICON_MAIN ) ); wMain.hIcon = LoadIcon( hInstance, MAKEINTRESOURCE( ICON_MAIN ) ); wMain.hCursor = LoadCursor( NULL, IDC_ARROW ); wMain.hbrBackground = 0; wMain.lpszMenuName = NULL; wMain.lpszClassName = mainclass; RegisterClassEx( & wMain ); wMain.lpfnWndProc = WndProc_CHILD; wMain.lpszMenuName =( LPCTSTR ) NULL; wMain.lpszClassName = childclass; RegisterClassEx( & wMain ); hMain = CreateWindowEx( 0, mainclass,( _bstr_t ) "App " +( _bstr_t ) info->version, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL ); if( hMain == NULL ) { MessageBox( NULL, "Blad CreateWindowEx - hMain!", "...", MB_ICONEXCLAMATION ); return 1; } ShowWindow( hMain, nCmdShow ); CLIENTCREATESTRUCT ccs; RECT okno; ccs.hWindowMenu = NULL; ccs.idFirstChild = ID_MDI_FIRSTCHILD; GetClientRect( hMain, & okno ); hMDIClient = CreateWindowEx( 0, "MDICLIENT",( LPCTSTR ) NULL, WS_CHILD | WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL, 100, 0, okno.right - 100, okno.bottom, hMain,( HMENU ) 0xCAC, hInstance,( LPSTR ) & ccs ); if( hMDIClient == NULL ) { MessageBox( NULL, "Blad CreateWindowEx - hMDIClient!", "...", MB_ICONEXCLAMATION ); return 1; } ShowWindow( hMDIClient, SW_SHOW ); hNew = CreateWindowEx( 0, "BUTTON", "Nowy", WS_CHILD | WS_VISIBLE, 5, 5, 90, 30, hMain,( HMENU ) ID_NEW, hInstance, NULL ); hNONMDI = CreateWindowEx( 0, "BUTTON", "NonMDI", WS_CHILD | WS_VISIBLE, 5, 40, 90, 30, hMain,( HMENU ) ID_NONMDI, hInstance, NULL ); hSort = CreateWindowEx( 0, "BUTTON", "Sort", WS_CHILD | WS_VISIBLE, 5, 75, 90, 30, hMain,( HMENU ) ID_SORT, hInstance, NULL ); while( GetMessage( & Komunikat, NULL, 0, 0 ) ) { if( !TranslateMDISysAccel( hMDIClient, & Komunikat ) ) { TranslateMessage( & Komunikat ); DispatchMessage( & Komunikat ); } } return 0; }
LRESULT CALLBACK WndProc_MAIN( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) { switch( msg ) { case WM_CLOSE: DestroyWindow( hwnd ); break; case WM_SIZE: { RECT okno; GetClientRect( hwnd, & okno ); SetWindowPos( hMDIClient, NULL, 100, 0, okno.right - 100 - 1, okno.bottom - 1, SWP_SHOWWINDOW ); } break; case WM_COMMAND: switch( wParam ) { case ID_NEW: { MDICREATESTRUCT mcs; HWND hChild; mcs.szTitle = "Nowe okno MDI"; mcs.szClass = childclass; mcs.hOwner = GetModuleHandle( NULL ); mcs.x = 20; mcs.y = 20; mcs.cx = 555; mcs.cy = 333; mcs.style = MDIS_ALLCHILDSTYLES | WS_SYSMENU | CS_DBLCLKS; hChild =( HWND ) SendMessage( hMDIClient, WM_MDICREATE, 0,( LONG ) & mcs ); if( !hChild ) { MessageBox( hwnd, "Nie udalo sie otowrzyc okienka MDI!", "A to szkoda...", MB_ICONEXCLAMATION | MB_OK ); } } break; case ID_SORT: SendMessage( hMDIClient, WM_MDITILE, MDITILE_HORIZONTAL, 0 ); break; case ID_NONMDI: { HWND hNONMDI; hNONMDI = CreateDialog( GetModuleHandle( 0 ), MAKEINTRESOURCE( IDD_KWP1 ), hMDIClient, WndProc_dKWP1 ); } break; default: { } break; } break; case WM_DESTROY: PostQuitMessage( 0 ); break; default: return DefFrameProc( hwnd, hMDIClient, msg, wParam, lParam ); break; } return 0; } LRESULT CALLBACK WndProc_CHILD( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) { switch( msg ) { case WM_CLOSE: DestroyWindow( hwnd ); break; case WM_CREATE: { hMDIEdit = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 0, 0, 400, 150, hwnd,( HMENU ) ID_MDI_EDIT, GetModuleHandle( NULL ), NULL ); hSave = CreateWindowEx( 0, "BUTTON", "Zapisz", WS_CHILD | WS_VISIBLE, 5, 160, 150, 30, hwnd,( HMENU ) ID_SAVE, GetModuleHandle( NULL ), NULL ); SetFocus( GetDlgItem( hwnd, ID_MDI_EDIT ) ); } break; case WM_COMMAND: switch( wParam ) { case ID_SAVE: break; default: { } break; } break; case WM_DESTROY: PostQuitMessage( 0 ); break; default: return DefMDIChildProc( hwnd, msg, wParam, lParam ); break; } return 0; }
kombinowalem juz ze stylami, z nadawaniem default wilkosci (CW_USEDEFAULT) i innymi parametrami przy tworzeniu okienek ale bez zadnego rezultatu.. nie mam juz pomyslu... b |
|
Monika90 |
» 2013-11-09 13:21:40 Pewnie dlatego, że pędzel tła masz ustawiony na NULL: wMain.hbrBackground = 0; |
|
berkov Temat założony przez niniejszego użytkownika |
» 2013-11-09 13:42:01 zmienilem..dodajac: wMain.hbrBackground =( HBRUSH ) COLOR_WINDOW;
ale w obszarze mdi okienka dalej sie nie odswiezaja....
|
|
berkov Temat założony przez niniejszego użytkownika |
» 2013-11-09 13:53:52 Sorry... wprowadzilem w blad.... podzialalo ale tylko na okienka MDI... Dialogi sie dalej nie odswiezaja: tak wyglada resources.rc: LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL IDD_KWP1 DIALOG 0, 0, 275, 114 STYLE DS_3DLOOK | WS_EX_MDICHILD | WS_CHILD | WS_VISIBLE CAPTION "KP / KW" FONT 8, "Verdana" { DEFPUSHBUTTON "Zapisz", IDC_kwp1_zapisz, 203, 84, 50, 14, WS_TABSTOP PUSHBUTTON "Anuluj", IDC_kwp1_anuluj, 147, 84, 50, 14, WS_TABSTOP COMBOBOX IDC_kwp1_tytul, 68, 27, 168, 100, CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP EDITTEXT IDC_kwp1_grosval, 68, 40, 63, 13, ES_AUTOHSCROLL | WS_TABSTOP COMBOBOX IDC_kwp1_type, 133, 40, 103, 32, CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP EDITTEXT IDC_kwp1_comment, 68, 53, 168, 22, ES_AUTOHSCROLL | WS_TABSTOP LTEXT "Tytul:", IDC_STATIC, 25, 27, 18, 8, SS_LEFT LTEXT "Kwota:", IDC_STATIC, 25, 40, 23, 8, SS_LEFT LTEXT "Uwagi:", IDC_STATIC, 25, 54, 23, 8, SS_LEFT LTEXT "Wprowadz KW/KP", IDC_STATIC, 13, 9, 62, 8, SS_LEFT }
|
|
Monika90 |
» 2013-11-09 14:09:00 STYLE DS_3DLOOK | WS_EX_MDICHILD | WS_CHILD | WS_VISIBLE
WS_EX_MDICHILD to jest rozszerzony styl, więc nie powinien być razem ze zwykłymi. Ma być tak: EXSTYLE WS_EX_MDICHILD STYLE DS_3DLOOK | WS_CHILD | WS_VISIBLE
Ale czy to pomoże, to nie wiem. Poza tym, w pętli komunikatów powinieneś wywoływać IsDialogMessage() dla każdego niemodalnego okna dialogowego. |
|
berkov Temat założony przez niniejszego użytkownika |
» 2013-11-09 14:26:54 ok.. usunalem WS_EX_MDICHILD oraz dodalem do petli: while( GetMessage( & Komunikat, NULL, 0, 0 ) ) { if( !IsDialogMessage( hNONMDI, & Komunikat ) && !TranslateMDISysAccel( hMDIClient, & Komunikat ) ) { TranslateMessage( & Komunikat ); DispatchMessage( & Komunikat ); } }
..niestety bez zmian..:-( za jakiekolwiek inne pomysly Monika bede wdzieczny :-) dziwne, nigdy nie mialem takiego problemu dopoki nie zaczalem sie bawic MDI. ... b |
|
Monika90 |
» 2013-11-09 14:54:10 if( !IsDialogMessage( hNONMDI, & Komunikat )
W twoim programie hNONMDI to uchwyt do przycisku. Dodaj styl WS_CLIPSIBLINGS STYLE DS_3DLOOK | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CHILD
|
|
berkov Temat założony przez niniejszego użytkownika |
» 2013-11-09 15:45:10 Monika, MASZ MISTRZA!
moge sie zapytac skad ty to wszystko wiesz? nigdy w zyciu bym na to nie wpadl!!! |
|
« 1 » 2 |