Button verstecken.



  • 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