Button verstecken.



  • Windows möchte gern wissen, dass es den vom Button vorher belegten Bereich neu zeichnen soll. Dazu mußt Du "InvalidateRect" nach "ShowWindow" aufrufen.

    Das Neuzeichnen wird aber erst ausgeführt, wenn das Programm seine aktuellen Aktivitäten (nämlich das Bearbeiten der aktuellen Windows-Message) beendet hat. Sollte Dein Programm nach InvalidateRect noch längere Aktivitäten durchführen, kannst Du mit "UpdateWindow" das sofortige Neuzeichnen erzwingen.



  • habe jetzt

    RECT rc;
    GetClientRect(hWnd,&rc);
    InvalidateRect(hWnd,&rc,true);
    UpdateWindow(hWnd);
    

    Das wird ausgeführt, wenn ich auf diesen Knopf drücke... aber immer noch das selbe, es passiert nichts. Der Knopf, der versteckt werden soll, ist immer noch sichtbar, reagiert blos auf keine Eingaben mehr.



  • Ist der Button auf ner Groupbox drauf oder so?



  • ja, das ist er:)



  • dann mach mal InvalidateRect aber mit dem Handle der Groupbox



  • naja, es funktioniert leider auch nicht.

    case WM_CREATE:
    hWndGroupBox_3=CreateWindowEx(0,"BUTTON","Auswählen und Bewegen"        ,BS_GROUPBOX|WS_CHILD|WS_GROUP|WS_VISIBLE,
    					5,282,rc.right-10,110 ,hWnd,(HMENU)0,global_hInst,0);
    hWnd_BtnIndice    = CreateImageBtn(10 ,222,40,40,hWnd,BS_AUTOCHECKBOX | BS_PUSHLIKE ,IDI_ICONINDICE    ,(HMENU)BTN_INDICE     );
    hWnd_BtnSelectP	  = CreateImageBtn(10 ,342,40,40,hWnd,BS_AUTOCHECKBOX | BS_PUSHLIKE ,IDI_ICONSELECTP   ,(HMENU)BTN_SELECTP    );
    hWnd_BtnSelectT	  = CreateImageBtn(52 ,342,40,40,hWnd,BS_AUTOCHECKBOX | BS_PUSHLIKE ,IDI_ICONSELECTT   ,(HMENU)BTN_SELECTT    );
    

    Soweit der Code für WM_CREATE.

    case WM_COMMAND:
    switch(LOWORD(wParam))
    {
    
    	case BTN_INDICE:
    	{	
    		...
    		ShowWindow(hWnd_BtnSelectP,SW_HIDE);
    		ShowWindow(hWnd_BtnSelectT,SW_HIDE);
    		RECT rc; 
    		GetClientRect(hWndGroupBox_3,&rc); 
    		InvalidateRect(hWndGroupBox_3,&rc,true); 
    		UpdateWindow(hWndGroupBox_3); 
    
    	}
    	...
    }
    

    so in etwa der Code, was passiert, wenn man klickt. für hWndGroupBox_3 könnte man auch hWnd, das Parenthandle einsetzen, das haut genausowenig hin.

    zum Näheren Verständnis noch der Code für CreateImageBtn(...):

    HWND CreateImageBtn(int x, int y ,int rx, int ry, HWND hWnd,DWORD dwStyle, int res, HMENU IDBtn)
    {
    	HANDLE hIcon;
    	HWND   hWndBtn;
    
    	hIcon   = LoadImage (GetModuleHandle (NULL), MAKEINTRESOURCE(res),IMAGE_ICON,0, 0,LR_DEFAULTCOLOR | LR_COPYFROMRESOURCE);
    	hWndBtn = CreateWindow("BUTTON", "", WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON|BS_ICON|dwStyle ,x, y, rx, ry, hWnd, IDBtn, global_hInst,  0);
    	SendMessage(hWndBtn, BM_SETIMAGE, (WPARAM) IMAGE_ICON,(LPARAM)(HANDLE) hIcon);
    	return hWndBtn;
    }
    

    hoffe auf ne gute Lösung, danke schonmal:)



  • Sorry hab mich vertan. Mach mal InvalidateRect auf das Parentfenster der Groupbox.



  • Ob ich das jetzt nun auf die Groupbox mache, oder nicht, es haut leider nicht hin, wie schon gesagt:

    für hWndGroupBox_3 könnte man auch hWnd, das Parenthandle einsetzen, das haut genausowenig hin.



  • Ich habe jetzt WM_PAINT dazugefügt:

    case WM_PAINT:
    {
    	PAINTSTRUCT ps;
    	RECT rc;
    	HDC hDc=BeginPaint(hWnd,&ps);
    	GetClientRect(hWnd,&rc);
    	FillRect (hDc, &rc, (HBRUSH)GetSysColorBrush(COLOR_BTNFACE));
    	EndPaint(hWnd,&ps);
    }
    

    InvalidateRect wird auf das Parentwindow angewendet. Durch das Löschen mit

    FillRect (hDc, &rc, (HBRUSH)GetSysColorBrush(COLOR_BTNFACE));
    

    Verschwinden jetzt endlich die Knöpfe. Jedoch blinken alle Elemente auf dem Fenster, die neu gezeichnet werden, bei jedem Ankommen von WM_PAINT. Kann man das irgendwie unterdrücken?





  • @Its not You
    Hab mir jetzt die

    case WM_ERASEBKGND:
    				return 1;
    

    eingebaut, arbeitet leider auch nicht. Es flackert immer noch.



  • Mir kommt das schon ziemlich blöd vor:

    Wenn wir nun z.B. mit InvalidateRect() ein WM_PAINT zum Neuzeichnen bekommen wollen löscht das System vor WM_PAINT die Clientarea.

    So Winapi.net
    Das Problem scheint bei mir zu sein, das das System genau das nicht tut...
    Ich meine damit das löschen der Clientarea. Deswegen mache ich ja:

    case WM_PAINT:
    {
        PAINTSTRUCT ps;
        RECT rc;
        HDC hDc=BeginPaint(hWnd,&ps);
        GetClientRect(hWnd,&rc);
        FillRect (hDc, &rc, (HBRUSH)GetSysColorBrush(COLOR_BTNFACE));
        EndPaint(hWnd,&ps);
    }
    

    Ich blick da einfach nicht mehr durch. Kann man das neuzeichnen der Clientarea auch anders erzwingen?

    MFG



  • Mir kommt das schon ziemlich blöd vor:

    Wenn wir nun z.B. mit InvalidateRect() ein WM_PAINT zum Neuzeichnen bekommen wollen löscht das System vor WM_PAINT die Clientarea.

    So Winapi.net
    Das Problem scheint bei mir zu sein, das das System genau das nicht tut...
    Ich meine damit das löschen der Clientarea. Deswegen mache ich ja:

    case WM_PAINT:
    {
        PAINTSTRUCT ps;
        RECT rc;
        HDC hDc=BeginPaint(hWnd,&ps);
        GetClientRect(hWnd,&rc);
        FillRect (hDc, &rc, (HBRUSH)GetSysColorBrush(COLOR_BTNFACE));
        EndPaint(hWnd,&ps);
    }
    

    Ich blick da einfach nicht mehr durch. Kann man das neuzeichnen der Clientarea auch anders erzwingen?

    MFG


Anmelden zum Antworten