Moving Grip
-
Hi,
wie kann ich einen Bereich definieren, mit dem ich das Fenster verschieben kann?Mfg Ominion
-
ich weis leider nicht ob das funktioniert aber ein versuch wäre es wert
WM_LBUTTONDOWN abfangen wenn sich der cursor in deinem defininierten bereich befindet(point in rect) dann movewindow() mit der differenz zwischen gespeichert und aktueller pos.
-
ich habs befürchtet, dass ich das so machen muss...naja, erstmal danke
Mfg Ominion
-
Einfacher:
switch(uiMessage) { case WM_NCHITTEST: // Wenn Maus im Grip-Bereich return HTCAPTION; // Ansonsten Weiterleitung an DefWindowProc break; ... }Weitere mögliche Rückgabewerte von WM_NCHITTEST siehe
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/mouseinput/mouseinputreference/mouseinputmessages/wm_nchittest.aspWalter Z
-
ich habe das jetzt so probiert:
case WM_NCHITTEST: x = LOWORD (lParam); y = HIWORD (lParam); if (x >= 0 && x <= 200 && y >= 0 && y <= 100) return HTCAPTION; break;wenn ich jetzt aber in mein label klicke und das fenster ziehen will, klappt das nicht. auch nicht wenn ich in das main-fenster klicke und ziehe. was mache ich falsch?
Mfg Ominion
-
*push*
-
Die Koordinaten in lParam beziehen sich auf den Bildschirm.
Die Prüfung x >= 0 && x <= 200 dürfte also im wahrsten Sinn des Wortes danebenliegen.Walter Z
-
Das klappt auch nicht, wenn ich mein fenster am oberen rand erstelle

Mfg Ominion
-
*push*
-
*push* in der hoffnung, dass jemand eine idee hat, weil das wirklich wichtig ist.
Mfg Ominion
-
*pop*
Hauptfenster verschieben mit Klick im Client-Bereich :
// hWnd -> Handle vom Hauptfenster case WM_LBUTTONDOWN : { ReleaseCapture (); SendMessage (hWnd,WM_SYSCOMMAND,SC_MOVE + HTCAPTION,0); break; }Falls "label" ein Child ist und eine eigene "WinProc" hat :
// hWnd -> Handle von "label" case WM_LBUTTONDOWN : { ReleaseCapture (); SendMessage (GetParent (hWnd),WM_SYSCOMMAND,SC_MOVE + HTCAPTION,0); break; }Einen Bereich kannst Du Dir via lParam je nach Bedarf selbst definieren.
*EDIT* Schreibfehler korrigiert
-
es klappt immer noch nicht

long __stdcall LoadProc (HWND hLoad, unsigned int message, unsigned int wParam, long lParam) { HDC hDC; PAINTSTRUCT ps; HANDLE hBitmap; int x, y = 0; switch (message) { case WM_CREATE: InitCommonControls(); WaxEngBMPField = CreateWindow ("Static", NULL, WS_CHILD | WS_VISIBLE | SS_BITMAP, 0, 0, 500, 300, hLoad, (HMENU)4, WaxEngLoadHinstance, NULL); //<-- bedeckt das ganze Fenster, klappt aber auch nicht, wenn es das nicht tut hBitmap = LoadImage (GetModuleHandle (NULL), "start_screen.bmp", IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR | LR_LOADFROMFILE); SendMessage (WaxEngBMPField, STM_SETIMAGE, (WPARAM) IMAGE_BITMAP, (LPARAM)(HANDLE) hBitmap); st = CreateWindow (PROGRESS_CLASS, NULL, WS_CHILD | WS_VISIBLE | PBS_SMOOTH, 15, 240, 470, 20, hLoad, (HMENU) 1, WaxEngLoadHinstance, NULL); SetTimer (hLoad, 1, 1, NULL); SendMessage (st, PBM_SETRANGE, 0, MAKELPARAM (0, 500)); SendMessage (st, PBM_SETSTEP, (WPARAM) 1, 0); SendMessage (st, PBM_SETBARCOLOR, 0, RGB (46, 50, 146)); SendMessage (st, PBM_SETBKCOLOR, 0, RGB (128, 131, 226)); return 0; case WM_PAINT: hDC = BeginPaint (hLoad, &ps); SetBkMode (hDC, TRANSPARENT); EndPaint (hLoad, &ps); return 0; case WM_TIMER: switch (wParam) { case 1: if (SendMessage (st, PBM_GETPOS, 0, 0) >= 500) PostQuitMessage (0); else SendMessage (st, PBM_STEPIT, 0, 0); break; } return 0; case WM_SYSCOMMAND: switch (wParam) { case SC_SCREENSAVE: case SC_MONITORPOWER: return 0; } return 0; //HIER SOLL ES GETAN WERDEN case WM_LBUTTONDOWN: ReleaseCapture (); SendMessage (hLoad, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0); return 0; case WM_DESTROY: PostQuitMessage (0); return 0; } return DefWindowProc (hLoad, message, wParam, lParam); }das ist die Prozedur vom Fenster...
Mfg Ominion
EDIT:habe den Fehler gefunden. WM_SYSCOMMAND hatte ich ja überschrieben bzw. selbstdefiniert. Danke an alle, klappt jetzt endlich wie gewünscht
EDIT: jetzt klappt es auch mit WalterZ's Lösung, danke an euch beide, das hat mir sehr geholfen!
