Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[WinAPI, MDI] Okienka nie są odświeżane

Ostatnio zmodyfikowano 2013-11-10 15:50
Autor Wiadomość
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:


C/C++
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
P-95758
Monika90
» 2013-11-09 13:21:40
Pewnie dlatego, że pędzel tła masz ustawiony na NULL:
wMain.hbrBackground = 0;
P-95760
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....
P-95764
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:

C/C++
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
   
}
P-95766
Monika90
» 2013-11-09 14:09:00
C/C++
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:
C/C++
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.
P-95771
berkov
Temat założony przez niniejszego użytkownika
» 2013-11-09 14:26:54
ok.. usunalem WS_EX_MDICHILD
oraz dodalem do petli:
C/C++
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
P-95775
Monika90
» 2013-11-09 14:54:10
C/C++
if( !IsDialogMessage( hNONMDI, & Komunikat )
W twoim programie hNONMDI to uchwyt do przycisku.

Dodaj styl WS_CLIPSIBLINGS
C/C++
STYLE DS_3DLOOK | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CHILD
P-95782
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!!!
P-95787
« 1 » 2
  Strona 1 z 2 Następna strona