| Autor |
Nachricht |
Barton
Mitglied
Benutzerprofil
Anmeldungsdatum: 16.11.2010
Beiträge: 10
|
Barton Mitglied
09:17:52 02.04.2012 Titel: |
Problem mit SetWindowLongPtr() |
Zitieren |
Hallo.
Ich bin gerade dabei ein kleines Windows-Programm zu schreiben und benutze dafür C++ und die WinAPI.
Nun erstelle ich mit CreateWindowEx ein Fenster und in diesem Fenster wieder mit CreateWindowEx ein Edit-Element.
Funktioniert soweit perfekt. Nun möchte ich die Window-Procedure des Elements auf eine eigene Funktion ändern, und verwende die SetWindowLongPtr()-Funktion, was auch soweit funktioniert, da diese zweite Funktion mir schön viele Messages ausgibt.
Allerdings tritt hierbei folgener Effekt auf:
Die Edit-Box ist plötzlich inaktiv/readonly?
Hier zwei Bilder:
Vor der Verwendung von SetWindowLongPtr()
Nach der Verwendung von SetWindowLongPtr()
Ich habe auch keinen Anhaltspunkt, da ich mit dem Edit-Element noch in keiner der beiden Funktionen arbeite. Ich erstelle es bloß.
Hat jemand von euch vielleicht eine Idee, weshalb sich dieses Element anders verhält obwohl im Code selbst nichts damit passiert? Eine Lösung wäre super.
Danke.
mfg
Barton |
Zuletzt bearbeitet von Barton am 09:18:35 02.04.2012, insgesamt 1-mal bearbeitet |
|
 |
KN4CK3R
Mitglied
Benutzerprofil
Anmeldungsdatum: 23.05.2007
Beiträge: 640
|
KN4CK3R Mitglied
09:29:47 02.04.2012 Titel: |
|
Zitieren |
die frage hättest du im WinAPI forum fragen müssen. lass dich von einem mod verschieben
greetz KN4CK3R |
_________________ http://www.oldschoolhack.de
|
|
 |
Barton
Mitglied
Benutzerprofil
Anmeldungsdatum: 16.11.2010
Beiträge: 10
|
Barton Mitglied
09:48:12 02.04.2012 Titel: |
|
Zitieren |
Oh, das hab ich leider nicht gesehen.
Ja dann bitte ich den Thread zu verschieben. |
|
|
|
 |
C++ Forumbot
Forumbot
Benutzerprofil
Anmeldungsdatum: 29.02.2004
Beiträge: 17121
|
C++ Forumbot Forumbot
11:10:04 02.04.2012 Titel: |
|
Zitieren |
|
 |
Jochen Kalmbach
Moderator
Benutzerprofil
Anmeldungsdatum: 11.11.2005
Beiträge: 12080
|
Jochen Kalmbach Moderator
11:36:27 02.04.2012 Titel: |
|
Zitieren |
|
 |
Martin Richter
Moderator
Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 14185
|
Martin Richter Moderator
12:17:24 02.04.2012 Titel: |
|
Zitieren |
|
 |
Barton
Mitglied
Benutzerprofil
Anmeldungsdatum: 16.11.2010
Beiträge: 10
|
Barton Mitglied
13:09:25 02.04.2012 Titel: |
|
Zitieren |
Hallo.
Das sind meine beiden WndProcs.
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
std::cout << "MainWndProc: " << message << std::endl;
switch(message)
{
case WM_CREATE:
{
break;
}
case WM_COMMAND:
{
break;
}
case WM_SIZE:
{
break;
}
case WM_DESTROY:
{
PostQuitMessage(0);
break;
}
default:
{
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
return 0;
}
LRESULT CALLBACK NewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
std::cout << "NewWndProc: " << message << std::endl;
switch(message)
{
case WM_CREATE:
{
break;
}
case WM_COMMAND:
{
break;
}
default:
{
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
return 0;
} | |
Die Elemente (Buttons, Textfelder, etc...) werden erst einwenig später erstellt.
Ich hab gerade eben in NewWndProc statt dem DefWindowProc folgendes probiert, hilft aber nicht...
| C++: | | return CallWindowProc(MainWndProc, hWnd, message, wParam, lParam); | | |
|
|
|
 |
Martin Richter
Moderator
Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 14185
|
Martin Richter Moderator
13:52:06 02.04.2012 Titel: |
|
Zitieren |
Du verstehst Subclassing ciht.
Wenn Du die WindowProc ersett bekommst Du die alte WindowProc, Deine Subclass Routine muss dann mit CallWindowProc die alte aufrufen. |
_________________ Martin Richter (MVP für C++) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
|
|
 |
Barton
Mitglied
Benutzerprofil
Anmeldungsdatum: 16.11.2010
Beiträge: 10
|
Barton Mitglied
14:12:59 02.04.2012 Titel: |
|
Zitieren |
Hallo.
Ich bekomme einen LONG_PTR zurück (die alte WndProc), bloß wie rufe ich diese mit der Information auf?
| C++: | | WINUSERAPI LRESULT WINAPI CallWindowProcW(WNDPROC, HWND, UINT, WPARAM, LPARAM) | |
Ich sehe da nirgends Platz für einen LONG_PTR?
Edit: Die Lösung scheint ein Cast des ersten Parameters auf WNDPROC zu sein. |
Zuletzt bearbeitet von Barton am 14:57:33 02.04.2012, insgesamt 2-mal bearbeitet |
|
 |
GillBates
Unregistrierter
|
GillBates Unregistrierter
18:21:18 02.04.2012 Titel: |
|
Zitieren |
Sowas vielleicht?
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | :
:
oldEditWindowProc = SetWindowLongPtr(hEdit, GWLP_WNDPROC, &NewWndProc);
:
:
:
LRESULT CALLBACK NewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
std::cout << "NewWndProc: " << message << std::endl;
switch(message)
{
case WM_CREATE:
{
break;
}
case WM_COMMAND:
{
break;
}
default:
{
return oldEditWindowProc(hWnd, message, wParam, lParam);
}
}
return 0;
} | | |
|
|
|
 |