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?
-
vielleicht hilft http://www.winapi.net/index.php?inhalt=tipp4
-
@Its not You
Hab mir jetzt diecase 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