Avatar billede tax Nybegynder
20. september 2001 - 09:22 Der er 12 kommentarer og
1 løsning

Overførsel af argumenter ved vinduebeskeder

Jeg er løbet ind i et problem:

Jeg kan ikke få overført en streng som argument lParam til et vindue.

Jeg har oprettet et MDI-framework, hvor jeg har et Childvindue, som jeg har givet en IDM_PUTSTRING under hovedbeskeden WM_COMMAND. Når childvinduet modtager denne kommando sendes en msg til childvinuets listbox, med LB_ADDSTRING.

Problemet er så at jeg ikke kan få min streng til at komme med igennem msg sendingerne.

Jeg starter med følgende (Fra et hvilketsomhelst vindue):

SendMessage(hwndChild, WM_COMMAND, IDM_LB_ADDSTR, (LPARAM)(LPCTSTR) TEXT(\"Log started!\"));

I childvinduet forsøger jeg at tage pointeren til strengen med i messagen til childvinduets listboxvindue:

(Jeg ved at messagen når hertil, da jeg kaster en messagebox her)

SendMessage(hWndMyListbox, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR) lParam);

Problemet er så at listboksen ikke kan læse strengen, fordi jeg farer vild i alle de typecastings.


Any help would be nice :)
Avatar billede jpk Nybegynder
20. september 2001 - 09:39 #1
Vil det sige, at du får strengen skrevet ud i din messagebox?
Avatar billede tax Nybegynder
20. september 2001 - 09:41 #2
Jep.
Avatar billede tax Nybegynder
20. september 2001 - 09:42 #3
Jeg har fundet ud af at problemet drejer sig om MDIvinduets lokale variable, dvs. handle til Listboxen. Compileren siger den ikke er initaliseret, selvom jeg ville mene det da den bliver initaliseret i WM_CREATE
Avatar billede jpk Nybegynder
20. september 2001 - 09:45 #4
Har du et handle til listboxen? (ikke en membervariabel eller...?)
Avatar billede tax Nybegynder
20. september 2001 - 09:51 #5
Handle til listboksen er gemt i childvinduets private variable. Problemet er at childvinduet er et MDI vindue, hvilket betyder at de private variable er placeret i en struct for enden af en longpointer.

Ved WM_CREATE genereres denne og gemmes i \"pLogData\". Jeg kan sagtens anvende denne lige efter at jeg har genereret den, men ikke i min \"IDM_LB_ADDSTR\" rutine. Den siger at jeg refererer til uninitialized variable.

Jeg vil mene at WM_CREATE bliver kørt før IDM_LB_ADDSTR???

Her er kilden til structen og messagehandleren for logvinduet..

Tak for interessen by the way :)


//Struct defines
typedef    struct tagLOGDATA //Private data for Log
{
    short cxClient ;
    short cyClient ;
    int iLinebuffer;
    HWND myLog;
}LOGDATA, * PLOGDATA ;


////////////////
LRESULT CALLBACK LogWndProc (HWND hwnd, UINT message,
                              WPARAM wParam, LPARAM lParam)
{
    static HWND hwndClient, hwndFrame ;
    PLOGDATA    pLogData ;

    switch (message)
    {
    case WM_CREATE:
              // Allocate memory for window private data
         
          pLogData = (PLOGDATA) HeapAlloc (GetProcessHeap (),
                                  HEAP_ZERO_MEMORY, sizeof (LOGDATA)) ;
         
          SetWindowLong (hwnd, 0, (long) pLogData) ;
         
         
         
          pLogData->myLog = CreateWindow (TEXT (\"listbox\"), NULL,
                              WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_BORDER ,
                              0, 0,
                              300,
                              300,
                              hwnd, NULL,
                              (HINSTANCE) hInst,
                              NULL) ;
       
       
        // Save some window handles
        hwndClient = GetParent (hwnd) ;
          hwndFrame  = GetParent (hwndClient) ;
       
        return 0;

           
    case WM_SIZE:            // If not minimized, save the window size
         
          if (wParam != SIZE_MINIMIZED)
          {
              pLogData = (PLOGDATA) GetWindowLong (hwnd, 0) ;
             
              pLogData->cxClient = LOWORD (lParam) ;
              pLogData->cyClient = HIWORD (lParam) ;
                //resize log vinduet

              MoveWindow(pLogData->myLog , 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
          }
         
          break ;        // WM_SIZE must be processed by DefMDIChildProc
         


         

    case WM_MDIACTIVATE:
          return 0 ;

    case WM_DESTROY:
          pLogData = (PLOGDATA) GetWindowLong (hwnd, 0) ;
          HeapFree (GetProcessHeap (), 0, pLogData) ;
          KillTimer (hwnd, 1) ;
          return 0 ;
   
    case WM_COMMAND:
       
        switch (LOWORD (wParam))
          {
          case IDM_LB_ADDSTR:
            MessageBox(NULL, (LPCTSTR)lParam, \"ewsældkwe\", MB_OK);
           
       
            SendMessage(pLogData->myLog, LB_ADDSTRING, 0, (LPARAM) TEXT(\"wefwef\"));

       
            //SendMessage(pLogData->myLog, LB_SETCURSEL, (WPARAM)(SendMessage(pLogData->myLog, LB_GETCOUNT, 0, 0))-1, 0);   
            break;
                                     
             
          default:            // Pass to active child...             
              break ;        // ...and then to DefFrameProc
          }
        return 0;
   
   
   
    }
          // Pass unprocessed message to DefMDIChildProc
   
    return DefMDIChildProc (hwnd, message, wParam, lParam) ;
}
Avatar billede tax Nybegynder
20. september 2001 - 09:55 #6
Jeg har gjort de private variable static, så vil det virke, men det er ikke en fed løsning i MDI.
Avatar billede jpk Nybegynder
20. september 2001 - 10:04 #7
Jeg går ud fra at du har checket returværdien fra HeapAlloc og at det er en gyldig pointer?

Har du checket at WM_DESTROY ikke bliver kaldt undervejs?
Avatar billede tax Nybegynder
20. september 2001 - 10:09 #8
Destroy bliver ikke kaldt før jeg slutter proggy og HeapAlloc er forskellig fra NULL
Avatar billede tax Nybegynder
20. september 2001 - 10:11 #9
Problem solved!!

Jeg skulle opdatere pLogData af en eller anden grund, før jeg bruger den. det kunne jeg læse i destroy proceduren!!!

Tak for hjælpen!!!


Kilde:
pLogData = (PLOGDATA) GetWindowLong (hwnd, 0) ;
Avatar billede jpk Nybegynder
20. september 2001 - 10:18 #10
Velbekomme...
Avatar billede tax Nybegynder
20. september 2001 - 10:50 #11
Kom med svar så du kan få points! :)
Avatar billede jpk Nybegynder
20. september 2001 - 10:57 #12
Jeg løste jo ikke problemet, så det ville vel også være forkert af mig at tage pointene...
Du kan jo poste din løsning og så acceptere den som svar.
Avatar billede tax Nybegynder
20. september 2001 - 11:02 #13
Man skal huske at når man arbejder med MDIvinduer at hente hver instans\'es lokale variable frem når man skal bruge dem, da MDI anvender samme messagehandler for alle vinduer af en instans.

Som regel gemmes de lokale variable i en struct, som man kan indhente via en windowpointer som følger med hvert MDI vindue.

Det tænkte jeg ikke lige på, men følgende kommando hjalp en hel del på problemet.

myStruct = (MYSTRUCT) GetWindowLong (hwnd, 0) ;


:)
Over and out
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester