[Win32] WM_NOTIFY wil niet icm tree?

Pagina: 1
Acties:

  • MisterData
  • Registratie: September 2001
  • Laatst online: 20:35
Ik heb net een dialog gemaakt met een tree erin (IDC_ITEMLIST). So far so good, items toevoegen etc gaat allemaal goed. Totdat ik wil weten wanneer er wordt geklikt op een item. De docs vertellen mij dat ik WM_NOTIFY moet afvangen, en dat er dan in de lParam een pointer zit naar een NMHDR-structure (LPNMHDR). Echter, als ik met de debugger kijk wanneer die message wordt afgehandeld, blijkt mij lParam 1000 te zijn (toevallig ook nog het nummer achter IDC_ITEMLIST) terwijl ik een LPNMHDR verwacht :/

Ik gebruik MSVC++ 6.0 icm Windows 2000 (ik heb de laatste platform sdk, ik heb in de docs gekeken, ik heb gegoogeld, maar alles zonder resultaat...)

  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 30-07 16:33
Hoe ziet je dialogproc eruit?

Ik heb wel eens met een tabcontrol en WM_NOTIFY gewerkt, dat zag er dan zo uit:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
        switch(uMsg) {
                ... 
                case WM_NOTIFY: {
                        NMHDR *hdr = (NMHDR *)lParam;
                        
                        if(hdr->idFrom==...) {
                                if(hdr->code==...) {
                                        ...
                                }
                        }
                        return TRUE;
                }
 
        return FALSE;
}

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

post je code eens?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MisterData
  • Registratie: September 2001
  • Laatst online: 20:35
Ik zit nu op school, kan de code dus niet posten, maar het is iig zoiets:

C++:
1
2
3
4
5
6
7
8
...
case WM_NOTIFY :{
     LPNMDR hdr = (LPNMHDR)lParam; // werkt niet, lParam = 1000
    if(hdr->idFrom==IDC_ITEMLIST) { // access violation...
          MessageBox(hWnd, "blaat", "blaat" ,MB_OK);
}
return 0;
}


Dit werkt dus niet....

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Stomme vraag misschien, maar ben je niet toevallig de break; vergeten boven die case van WM_NOTIFY?

Professionele website nodig?


  • MisterData
  • Registratie: September 2001
  • Laatst online: 20:35
Curry684: Stomme vraag misschien, maar ben je niet toevallig de break; vergeten boven die case van WM_NOTIFY?
Als alles goed is niet....

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Daarom vraag ik het juist, het is de enige reden die ik me voor kan stellen waarom dit optreedt.

Professionele website nodig?


  • MisterData
  • Registratie: September 2001
  • Laatst online: 20:35
Ik had het WM_NOTIFY blokje gisteren al verwijderd uit m'n WndProc, vandaar dat ik het nu even opnieuw schrijf (met break erboven). Es even zien of het nu wel werkt...

edit: nope, nog steeds niet, even een opsomming van de debug-waardes die ik krijg bij een breakpoint net achter case WM_NOTIFY:
hdr: 1000
lParam: 1000
wParam: 1243688
msg: 78
Als 78 dus WM_NOTIFY is (en dat kan eigenlijk niet anders, want er staat wel degelijk een break voor de case WM_NOTIFY) dan kan ik niet anders concluderen dat er in die proc niets fout is :?

Code dan maar:

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
switch(msg) {
        case WM_CLOSE:
            dialog->CloseMessage(lParam,wParam);
            return TRUE;
            break;
        case WM_NOTIFY: {
            NMHDR* hdr = (NMHDR*)lParam;

            return TRUE;
            break;  
        }
        case WM_INITDIALOG:
            InitCommonControls();
            SetWindowText(hwnd,"Newstracker");

            // tree klussen
            SendDlgItemMessage(hwnd,IDC_ITEMLIST,TVM_SETIMAGELIST,0,(LPARAM)hImageList); 

            TVINSERTSTRUCT tvi;
            tvi.hParent=NULL;                               // top most level Item
            tvi.hInsertAfter=TVI_ROOT;                             // root level item attribute.
            tvi.item.mask=TVIF_TEXT; // attributs
            tvi.item.pszText="Druk op 'ververs' om nieuws op te halen";                             // item text 
            Parent = (HTREEITEM)SendDlgItemMessage(hwnd,IDC_ITEMLIST,TVM_INSERTITEM,0,(LPARAM)&tvi);

            return 0;
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            return TRUE;
            break;
        case WM_RBUTTONDOWN: {
            POINT pt;
            GetCursorPos(&pt);
            HMENU menu = LoadMenu(GetModuleHandle(NULL),MAKEINTRESOURCE(IDR_MENU));
            HMENU popup = GetSubMenu(menu,0);


            SetForegroundWindow(hwnd);
            int command = ::TrackPopupMenu(popup,TPM_RIGHTBUTTON,pt.x,pt.y,0,hwnd,NULL);
            ::SendMessage(hwnd,WM_COMMAND,WM_COMMAND,command);
            return TRUE;

            break;
            }
        case WM_COMMAND:
            // zooi wm_command handlers
                                                break;

        case WM_TRAYNOTIFY:
            dialog->TrayNotify(lParam,wParam);
            return TRUE;
            break;
        case WM_TIMER:
            dialog->TimerMessage();
            return TRUE;
            break;
        }       

[ Voor 115% gewijzigd door MisterData op 18-09-2003 16:34 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

Uhm, je draait lparam en wparam om overal in je code

een windowproc is zo:
C++:
1
LRESULT _stdcall WindowProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);


Dan is het nogal logisch dat lparam bij jou idd 1000 is, want dat is dus eigenlijk wparam, en volgens de documentatie van WM_NOTIFY is de wparam de id van je control :Y)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Damn net te laat, ik was hetzelfde aan het typen :D

Professionele website nodig?


  • MisterData
  • Registratie: September 2001
  • Laatst online: 20:35
OMG dat is wel heel erg dom dan *zichzelf voor kop slaat* B)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

Daar hebben ze een smiley voor: |:(
:P

Werkte de rest eigenlijk uberhaupt wel?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 30-07 16:33
Moet InitCommonControls() niet voor een aanroep van DialogBox*()/CreateDialog() ?

  • MisterData
  • Registratie: September 2001
  • Laatst online: 20:35
.oisyn schreef op 18 september 2003 @ 16:53:
Daar hebben ze een smiley voor: |:(
:P

Werkte de rest eigenlijk uberhaupt wel?
Ik had overal consequent lParam en wParam omgedraaid, zo bleek net :7
matthijsln schreef op 18 September 2003 @ 18:02:
Moet InitCommonControls() niet voor een aanroep van DialogBox*()/CreateDialog() ?
Volgens de tutorial die ik volgde over tree's iig niet, en het lijkt me dat het gewoon werkt zo (de tree werkt ook).

[ Voor 39% gewijzigd door MisterData op 18-09-2003 19:56 ]

Pagina: 1