Win32: Problem WM_NCHITTEST richtig zu überschreiben

02/12/2012 - 11:12 von Uwe Kotyczka | Report spam
In einer reinen Win32-Anwendung habe ich einen Dialog
mit WS_THICKFRAME.
Ich möchte, daß der Benutzer die Größe des Dialogs nur
am rechten Rand àndern kann.

Paul DiLascia schlàgt in einem Artikel, der es sogar
bis in die MSDN, die mit VC++6.0 kommt, geschafft hat,
vor, WM_NCHITTEST zu überschreiben. Er schreibt, daß
WM_NCHITTEST dafür sorgt, daß die richtigen Maus-Cursor
angezeigt wird, wenn man am Rand des Fensters zieht.

In dem Artikel geht es allerdings um MFC, wàhrend meine
Anwendung reines Win32 ist.

Ich habe also WM_NCHITTEST wie folgt überschrieben:

BOOL CALLBACK MyDlgProc(HWND hDlg, UINT uMessage, wParam wParam,
lParam lParam)
{
switch (uMessage)
{
...
case WM_NCHITTEST:
LRESULT ret = DefWindowProc(hDlg, uMessage, wParam,
lParam);
switch (ret)
{
case HTTOPRIGHT:
case HTRIGHT:
case HTBOTTOMRIGHT:
return HTRIGHT;

case HTTOP:
case HTTOPLEFT:
case HTLEFT:
case HTBOTTOMLEFT:
case HTBOTTOM:
return HTBORDER;

default:
//return FALSE;
return ret;
}
}
return FALSE;

}

HWND hDlg = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG_TEST),
0, (DLGPROC) MyDlgProc);
ShowWindow(hDlg, SW_SHOW);

Das funktioniert so allerdings nicht.

Um der Sache auf den Grund zu gehen habe ich zwei minimale
Anwendungen geschrieben, die einen modalen Dialog zeigen,
einmal in MFC und einmal in reinem Win32. In beiden Apps
habe ich WM_NCHITTEST überschrieben. Die beiden Projekte
sind unter http://home.arcor.de/kotyczka/download/Test.zip
zu finden. (Es ist nur 9 kB).

Die MFC App funktioniert wie erwartet, die Win32 App nicht.
Mit Spy++ sehe ich, dass in der MFC-App WM_NCHITTEST wie
erwartet behandelt wird. In der Win32 App sehe ich im Debugger,
daß WM_NCHITTEST mit den erwarteten Rückgabewerten aus
DefWindowsProc gefangen wird. Beobachte ich WM_NCHITTEST aber
in Spy++, zeigt sich jedoch, daß immer, wenn ich etwas _anderes_
als HTNOWHERE (Null) zurückgebe, dann sieht Spy++ HTNOWHERE.
Und gebe ich HTNOWHERE zurück, dann sieht Spy++ die erwarteten
Werte.

Ich denke mal, ich habe ein Verstàndnisproblem, wie ich in
Win32 WM_NCHITTEST richtig überschreiben muß. Könnte jemand
einen Blick auf meine beiden Miminalbespiele werfen um
zu sehen was ich falsch mache?

Übrigens, wenn ich modale statt nichtmodalen Dialogen
verwende, àndert das nichts an meinem WM_NCHITTEST Problem.

Kann mir jemand weiterhelfen?
 

Lesen sie die antworten

#1 Uwe Kotyczka
02/12/2012 - 11:53 | Warnen spam
Ich habe gerade in einer anderen Gruppe die richtige Antwort
bekommen. Statt

case HTTOPRIGHT:
case HTRIGHT:
case HTBOTTOMRIGHT:
return HTRIGHT;



muß es heißen:

case HTTOPRIGHT:
case HTRIGHT:
case HTBOTTOMRIGHT:
SetWindowLong(hDlg, DWL_MSGRESULT, HTRIGHT);
return TRUE;

Ähnliche fragen