SendMessage



  • Hallo zusammen, ich bin es wieder mal!

    Beim auftarten des Programms wird die www.google.ch URL angezeigt.
    Wenn ich nun im Menu den Eintrag Forum anwähle (ID_FORUM), so sollte der Wert von cURL (www.irgendeinforum.ch) an die WinMain bzw, an

    pIwb->Navigate(strBuffer,0,0,0,0); übergeben werden.
    

    Ich versuche schon den ganzen Tag dies mit SendMessage zu lösen, komme aber nicht mehr weiter.

    Mit

    SetWindowText(hWnd, cURL);
    

    kann ich den Text der cURL an das Fenster senden.

    Auf das Wochenende und vielen dank für die Hilfe,
    Sotares

    #include <windows.h>
    #include <exdisp.h>
    #include "resource.h"
    
     char cURL[100];
     HWND container;
    
     /***************************************************************************/
     LRESULT CALLBACK WndProc( HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam )
     {   
         HMENU hMenu;
    
         switch(messg)
         {
    		case WM_CREATE:
    		{
    		char x[100]="www.google.ch";
    		strcpy(cURL, x); 
    		}
    
               case WM_COMMAND:
    	   hMenu = GetMenu (hWnd);
    
    			switch(LOWORD (wParam))
    			{
    				case ID_FORUM:
    				char y[100]="www.irgeneinforum.ch";
    				strcpy(cURL, y);
    				//SendMessage ??
    				break;
    			}			 
    
    	case WM_SIZE:
                 MoveWindow(container,0,0,LOWORD(lParam), HIWORD(lParam),1);
                 break;
    
            case WM_CLOSE:
                 DestroyWindow(hWnd);
                 break;
    
            case WM_DESTROY:
                 PostQuitMessage( 0 );
                 break;
    
            default:
                 return( DefWindowProc( hWnd, messg, wParam, lParam ) );
         }
         return 0;
    
     /***************************************************************************/
     }
     /********************* Funktion WinMain ************************************************/
     int WINAPI WinMain( HINSTANCE hInst,HINSTANCE hPreInst,LPSTR lpszCmdLine, int nCmdShow )
     {
         WNDCLASS wc;
         char NomClasse[] = "container";
         wc.style = CS_HREDRAW | CS_VREDRAW;
    	 wc.lpszClassName	= NomClasse;
         wc.hInstance		= hInst;
         wc.lpfnWndProc     = WndProc;
         wc.hCursor			= LoadCursor( 0, IDC_ARROW );
         wc.hIcon			= LoadIcon( hInst, MAKEINTRESOURCE (IDI_ICON));
    	 wc.lpszMenuName	= MAKEINTRESOURCE(IDR_MENU1);
    	 wc.hbrBackground	= 0;
         wc.style			= 0;
         wc.cbClsExtra		= 0;
         wc.cbWndExtra		= 0;
    
         if (!RegisterClass(&wc)) return 0;
    
         HWND hWnd = CreateWindow(
    		 NomClasse,
    		 "container Activex",WS_OVERLAPPEDWINDOW,
    		 0,0,800,575,0,NULL,hInst,0);
    
    	 ShowWindow(hWnd, nCmdShow );
         UpdateWindow( hWnd );
    
         HINSTANCE hDLL = LoadLibrary("atl.dll");
         typedef HRESULT (WINAPI *PAttachControl)(IUnknown*, HWND,IUnknown**);
         PAttachControl AtlAxAttachControl = (PAttachControl) GetProcAddress(hDLL, "AtlAxAttachControl");
         RECT rect;
         GetClientRect(hWnd,&rect);
         container=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT","",WS_CHILD | WS_VISIBLE,0,0,rect.right,rect.bottom,hWnd,0,0,0);
         CoInitialize(0);
         IWebBrowser2 *pIwb;
         CoCreateInstance(CLSID_WebBrowser,0,CLSCTX_ALL,IID_IWebBrowser2,(void**)&pIwb);
         AtlAxAttachControl(pIwb,container,0);
    
    	 WCHAR strBuffer[100];
    	 MultiByteToWideChar(CP_ACP, 0, cURL, -1, strBuffer, sizeof(strBuffer));
    
         pIwb->Navigate(strBuffer,0,0,0,0);
    
         MSG Msg;
         while( GetMessage(&Msg, 0, 0, 0))
         {
             TranslateMessage( &Msg );
             DispatchMessage( &Msg );
         }
    
         pIwb->Release();
         CoUninitialize();        
         FreeLibrary(hDLL);
         return( Msg.wParam);
     }
    


  • Du Pfosten 😃
    Die WinMain ist doch kein Event Handler. Events handelt man in der WndProc bzw. noch besser gleich eigenen Event Handler Funktionen. Du musst den Kontext schon der WndProc mitteilen, dann kannst du in der WndProc schön selbst pDings->Navigate() aufrufen. Eine halbwegs einfache Methode ist über Set/GetWindowLongPtr().



  • Hallo hustbaer,
    ich habe den Code ein wenig abgeändert und es läuft alles zu meiner Zufriedenheit!

    #include <windows.h>
    #include <exdisp.h>
    #include "resource.h"
    
    HWND container;
    
    HINSTANCE hDLL = LoadLibrary("atl.dll");
    typedef HRESULT (WINAPI *PAttachControl)(IUnknown*, HWND,IUnknown**);
    PAttachControl AtlAxAttachControl = (PAttachControl) GetProcAddress(hDLL, "AtlAxAttachControl");
    RECT rect;
    IWebBrowser2 *pIwb;
    
    void SelectURL (char URL[100])
    {
    char cURL[100];
    strcpy(cURL, URL);
    WCHAR strBuffer[100];
    MultiByteToWideChar(CP_ACP, 0, cURL, -1, strBuffer, sizeof(strBuffer));
    pIwb->Navigate(strBuffer,0,0,0,0);
    }
    
     /***************************************************************************/
     LRESULT CALLBACK WndProc( HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam )
     {  
         HMENU hMenu;
    
    	 PAINTSTRUCT ps;
    	 HDC hdc;
    
         switch(messg)
         {
    
    		case WM_CREATE:
    			{
    			GetClientRect(hWnd,&rect);
    			container=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT","",WS_CHILD | WS_VISIBLE,0,0,rect.right,rect.bottom,hWnd,0,0,0);
    			CoInitialize(0);
    			CoCreateInstance(CLSID_WebBrowser,0,CLSCTX_ALL,IID_IWebBrowser2,(void**)&pIwb);
    			AtlAxAttachControl(pIwb,container,0);
    
    			SelectURL("www.google.ch");
    			break;
    			}
    
                case WM_COMMAND:
    			hMenu = GetMenu (hWnd);
    
                switch(LOWORD (wParam))
                {
                    case ID_URL1: {
    					SelectURL("www.yahoo.ch");
    					} break;
    
    				case ID_URL2: {
    					SelectURL("www.google.ch");
    					} break;
    
                }             
    
    		case WM_PAINT:
    			{
    			 hdc = BeginPaint (hWnd, &ps);
    			 EndPaint (hWnd, &ps);
    			 break;
    			}
    
    		case WM_SIZE:
                 MoveWindow(container,0,0,LOWORD(lParam), HIWORD(lParam),1);
    			 break;
    
    		case WM_CLOSE:
                 DestroyWindow(hWnd);
                 break;
    
    		case WM_DESTROY:
                 PostQuitMessage( 0 );
                 break;
    
            default:
                 return( DefWindowProc( hWnd, messg, wParam, lParam ) );
         }
         return 0;
    
     /***************************************************************************/
     }
     /********************* Funktion WinMain ************************************************/
     int WINAPI WinMain( HINSTANCE hInst,HINSTANCE hPreInst,LPSTR lpszCmdLine, int nCmdShow )
     {
         WNDCLASS wc;
         char NomClasse[] = "container";
         wc.style = CS_HREDRAW | CS_VREDRAW;
         wc.lpszClassName    = NomClasse;
         wc.hInstance        = hInst;
         wc.lpfnWndProc     = WndProc;
         wc.hCursor            = LoadCursor( 0, IDC_ARROW );
         wc.hIcon            = LoadIcon( hInst, MAKEINTRESOURCE (IDI_ICON));
         wc.lpszMenuName    = MAKEINTRESOURCE(IDR_MENU1);
         wc.hbrBackground    = 0;
         wc.style            = 0;
         wc.cbClsExtra        = 0;
         wc.cbWndExtra        = 0;
    
         if (!RegisterClass(&wc)) return 0;
    
         HWND hWnd = CreateWindow(
             NomClasse,
             "container Activex",WS_OVERLAPPEDWINDOW,
             0,0,800,575,0,NULL,hInst,0);
    
         ShowWindow(hWnd, nCmdShow );
         UpdateWindow( hWnd );
    
         MSG Msg;
         while( GetMessage(&Msg, 0, 0, 0))
         {
             TranslateMessage( &Msg );
             DispatchMessage( &Msg );
         }
    
         pIwb->Release();
         CoUninitialize();        
         FreeLibrary(hDLL);
         return( Msg.wParam);
     }
    

    Dein Vorschlag mit einem eigenen Event-Handler werde ich mal anschauen.
    (Ich arbeite erst seit einer Woche mit WinApi)

    Mit freundlichn Grüsssen,
    "Der Pfosten", Sotares



  • Ok, jetzt verwendest du halt ne globale Variable. Bei ganz einfachen kleinen Programmen ist das OK - soll das Teil irgendwann grösser werden, vielleicht sogar mehrere Browser-Fenster unterstützen würde ich es eher anders machen, wie gesagt eben über SetWindowLongPtr().

    Und das mit den "event handlern" -- ich meinte bloss den Code der sich ums abarbeiten von Events kümmert in eine eigenen Funktion packen, im Prinzip sehr ähnlich deiner SelectURL Methode. Damit man die ganze "Logik" auf WndProc rausbekommt, und WndProc sich nurmehr ums "verteilen" der Messages an die "handler" kümmert, also im einfachsten Fall zu einem grossen switch-case zusammenschrumpft, wo jeder case bloss "return Handler(...);" macht.


Anmelden zum Antworten