Window arretieren (mit COM)
-
Hallo alle zusammen,
Ich bin gerade dabei eine Anwendung zu proggen in c++ unter verwendung von COM. In dieser Anwendung befindet sich ein Control welches ich über Checkboxen Konfiguriere.
Es sollen folgende Properties zuschaltbar sein:
Titelleiste anzeigen //geht WS_CAPTION
Größe änderbar // geht WS_THICKFRAME
Schließbar // geht WS_SYSMENU
Verschiebbar // geht nicht ????geht nicht heißt es läßt sich nicht arretieren, sobald ich die Titelleiste einblende und draufklicke kann ich es verschieben. Ich möchte dies aber auch Locken können so daß der User es NICHT verschieben kann.
Kennt von euch wer ein Property, welches genau dies bewirkt
Im vorraus vielen Dank
Don
-
Füge dem Dialogfenster noch eine OnMove() Methode (Nachricht WM_MOVE) hinzu und hole dir mit GetWindowRect die aktuelle Position.
Dieses Rect übergibst du dann der
CDialog::OnMoving(nSide, MeinRect);
-
dann kann ich das Control ja aber doch bewegen nur das es halt wieder an die alte Pos zurück geht. Ich möchte aber das bewegen völlig abstellen.
gibts denn da kein Property???
-
WM_SYSCOMMAND mit SC_MOVE abzufangen.
Wenn das nicht geht. WM_NCHITTEST für das Fenster abfangen. Den deafult aufrufen und wenn der HTCAPTION returniert einfach HTNOWHERE draus machen.
-
Mache folgende 3 Schritte:
1. gehe in die *.h Datei deiner Dialogfeldklasse und füge im Messagemap Bereich folgenden Eintrag hinzu:
// Generierte Message-Map-Funktionen //{{AFX_MSG(CMyDlg) virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); afx_msg void OnMoving(UINT nSide, LPRECT lpRect); //<-- Funktion hinzufügen! //}}AFX_MSG DECLARE_MESSAGE_MAP()2. Danach gehst du in die *.cpp uns suchst dir den "BEGIN_MESSAGE_MAP" und "END_MESSAGE_MAP" Bereich deiner Klasse und fügst dort den Eintrag ON_WM_MOVING() hinzu.
//Messagemap von CMyDlg BEGIN_MESSAGE_MAP(CMyDlg, CDialog) //{{AFX_MSG_MAP(CPolymorphieTestDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_MOVING() //<-- hinzufügen //}}AFX_MSG_MAP END_MESSAGE_MAP()3. Danach brauchst du nur noch folgende Funktion schreiben:
void CMyDlg::OnMoving(UINT nSide, LPRECT lpRect) { GetWindowRect(lpRect); CDialog::OnMoving(nSide, lpRect); }Voila, das Fenster lässt sich nicht mehr verschieben.
-
Wenn ich GetWindowRect(lpRect) in On Moving ausführe bekomme ich eine Speicherzugriffs Verletzung und das Prog schmiert ab...
Gruß Don
-
Das Problem hierbei ist einfach dein Beschreibung ist für die MFC und meine Anwendung ist COM.
Aber trotzdem Danke für die Hilfe...
-
DonGhandi schrieb:
Das Problem hierbei ist einfach dein Beschreibung ist für die MFC und meine Anwendung ist COM.
Aber trotzdem Danke für die Hilfe...
sorry

-
Kein Problem

kennt sich hier denn keiner mit COM aus????
-
Scheinbar nicht, aber ich editiers mal in den Betreff, vielleicht schaut dann einer rein.

-
estartu schrieb:
Scheinbar nicht, aber ich editiers mal in den Betreff, vielleicht schaut dann einer rein.

Danke

-
Hi,
Ok fals es noch jemanden interessiert, ich hab das Prob gelöst. Und zwar mit der Message WM_WINDOWPOSCHANGING, die liefert im LWert einen Pointer auf die Struct WINDOWPOS. Über diesen Zeiger hab ich dann das Flag SWP_NOMOVE gesetzt.
lpwp = (LPWINDOWPOS) lParam; lpwp->flags |= SWP_NOMOVE;Und siehe da das Fenster läßt sich nicht mehr verschieben, nochmal Danke an alle die sich die Mühe gemacht haben.
Don