Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: WinAPI ::  Problem mit SetWindowLongPtr()  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
Barton
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.11.2010
Beiträge: 10
Beitrag 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: 645
Beitrag 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
Beitrag 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: 17163
Beitrag C++ Forumbot Forumbot 11:10:04 02.04.2012   Titel:              Zitieren

Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum WinAPI verschoben.

Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?


Dieses Posting wurde automatisch erzeugt.

_________________
Besuchen Sie unsere Bücherecke.
http://www.c-plusplus.de/bucher.php
Mit jeder Bestellung unterstützen Sie das Forum.
Jochen Kalmbach
Moderator

Benutzerprofil
Anmeldungsdatum: 11.11.2005
Beiträge: 12113
Beitrag Jochen Kalmbach Moderator 11:36:27 02.04.2012   Titel:              Zitieren

Wie sieht denn Deine WndProc aus?

_________________
Greetings
Jochen
(Microsoft MVP VC++) My blog about Win32 and .NET: http://blog.kalmbach-software.de/ (deutsch)
Martin Richter
Moderator

Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 14217
Beitrag Martin Richter Moderator 12:17:24 02.04.2012   Titel:              Zitieren

Evtl. DefWindowProc verwendet anstatt CallWindowProc?

_________________
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
Beitrag 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: 14217
Beitrag 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
Beitrag 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




Beitrag 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;
}
c++.de :: WinAPI ::  Problem mit SetWindowLongPtr()  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.