WC_IPADDRESS



  • VCL mit ein wenig WinAPI.

    Habe mit SetWindowLong die Botschaftsbehandlungsroutine umgeleitet und wollte damit die Nachrichten abfangen.



  • Versuch es doch einfach mal ohne WS_GROUP. Wenn die anderen Komponenten alle den WS_TABSTOP haben, sollte es theoretisch klappen.

    P.S. Kann man WinApi in VCL-Code einbauen? Kenne mich da nicht aus.



  • WS_GROUP weglassen, ändert nichts.



  • Zeig mal ein minimales und kompilierbares Programm und wir lösen dein Problem...



  • Morgen Früh ca. 8:30 stellt ich den Quelltext hier rein.



  • So wie versprocher kommt jetzt Quellcode:
    Erstellt erst mal ein neues Project mit den Builder.

    In der Project.cpp muss in der WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

    INITCOMMONCONTROLSEX iccex; 
              iccex.dwSize = sizeof(iccex);
              iccex.dwICC  = ICC_INTERNET_CLASSES;
              InitCommonControlsEx(&iccex);
    

    Das sind Globale Variablen die in Unit1 deklariert werden müssen.

    WNDPROC g_wndprocOld;
       LRESULT CALLBACK NewWndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam);
     HWND hWndIPAdr;
    

    Das Nächste muss in die Unit1.cpp in Funktion

    __fastcall Form1::TForm1(TComponent* AOwner)
        : TForm(AOwner)
    {
    
    hWndIPAdr = CreateWindow(WC_IPADDRESS,  //erzeugen des IP Eingabefeldes
                              NULL,
                              WS_CHILD | WS_TABSTOP | WS_VISIBLE  ,
                              75, 144, 95, 21,
                              Form1->Handle,
                              NULL,NULL, NULL);
    
      SendMessage(hWndIPAdr  , WM_SETFONT, (WPARAM)(GetStockObject(DEFAULT_GUI_FONT)), MAKELPARAM(TRUE, 0));
      SendMessage(hWndIPAdr  , IPM_SETADDRESS, 0,MAKEIPADDRESS(192,168,0,8));
      g_wndprocOld = (WNDPROC)SetWindowLong(hWndIPAdr, GWL_WNDPROC, (long)NewWndProc); //Umlenken der Winproc vom IP Eingabefeld
    

    Das ist die neu Winproc des IP Feldes.

    LRESULT CALLBACK NewWndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
    {
      switch(iMsg){
        case WM_NOTIFY:
         // hier kann man nur die Message IPN_FIELDCHANGED abfangen
        break;
      }
      return  CallWindowProc((FARPROC)g_wndprocOld,hwnd,iMsg, wParam, lParam);
    }
    

    hoffe das, das erst mal reicht um ein lauffähiges Prog. zu erstellen.

    [ Dieser Beitrag wurde am 13.06.2003 um 09:26 Uhr von e=mc² editiert. ]



  • ich glaub das liegt daran weil du eine VCL Form benutzt



  • warum ersetzt du überhaupt die wndproc? die WM_NOTIFY nachricht kommt doch im parent fenster, also deiner form, an.



  • Das hat mit der VCL Form nichts zu tun, da die ja auch nur mit der WINAPI ein Fenster zeichnet, würde ich jetzt mal behaubten.



  • Original erstellt von e=mc²:
    Morgen Früh ca. 8:30 stellt ich den Quelltext hier rein.
    e=mc² erstellt 13.06.2003 09:24
    So wie versprocher kommt jetzt Quellcode:

    Is' bei Dir Sommer-Sommer-Zeit oder was?! 😉


Anmelden zum Antworten