[VC++] ClientToScreen: stukje code in boek klopt niet?

Pagina: 1
Acties:

  • Boy
  • Registratie: November 2001
  • Laatst online: 16-05 16:54

Boy

www.byoscoop.nl

Topicstarter
Ik ben bezig in het boek 'Teach yourself Visual C++ 6.0 in 21 days'.

Hier staat de volgende code in voor een popup menu:

code:
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
void CMenusDlg::OnContextMenu(CWnd* pWnd, CPoint point) 
{
    // TODO: Add your message handler code here
    
    // Declare local variables
    CMenu *m_lMenu;  // A pointer to the menu
    CPoint m_pPoint; // A copy of the mouse position

    // Copy the mouse position to a local variable
    m_pPoint = point;

    // Convert the position to a screen position
    ClientToScreen(&m_pPoint);

    // Get a point to the window menu
    m_lMenu = GetMenu();

    // Get a point to the first submenu
    m_lMenu = m_lMenu->GetSubMenu(0);

    // Show the Popup Menu
    m_lMenu->TrackPopupMenu(TPM_LEFTALIGN + TPM_LEFTBUTTON, 
        m_pPoint.x, m_pPoint.y, this, NULL);

}


Wanneer ik nu rechterklik, krijg ik een popup BUITEN het programmascherm, ver van de cursor vandaan.
Laat ik de ClientToScreen functie weg (dus dat de point-coordinaten ongewijzigd blijven) dan is ie wel goed.
Volgens het boek is deze functie nodig om te weten dat de popup op de goede plek terecht komt, maar het lijkt averechts te werken..

Het boek zal het vast niet fout hebben, maar waar doe ik het dan fout?

Naar de bioscoop? => gebruik de app op Byoscoop.nl


Verwijderd

Bekijk onderste example best eens:
http://msdn.microsoft.com...rces/menus/usingmenus.asp


Ipv TPM_LEFTALIGN | TPM_LEFTBUTTON staat er bij jou TPM_LEFTALIGN + TPM_LEFTBUTTON wat mij niet direct de bedoeling is van bitwise parameters

  • Boy
  • Registratie: November 2001
  • Laatst online: 16-05 16:54

Boy

www.byoscoop.nl

Topicstarter
Verwijderd schreef op maandag 17 januari 2005 @ 20:18:
Bekijk onderste example best eens:
http://msdn.microsoft.com...rces/menus/usingmenus.asp


Ipv TPM_LEFTALIGN | TPM_LEFTBUTTON staat er bij jou TPM_LEFTALIGN + TPM_LEFTBUTTON wat mij niet direct de bedoeling is van bitwise parameters
Zo staat het in het boek, en ik heb het ook eens gewijzigd in & en |, maar dat maakt geen verschil uit (wat ook vrij vreemd is?)

Maar het ClientToScreen verkloot het nog steeds, terwijl het volgens het boek zou het juist beter moeten werken op deze manier. Begrijp het sowieso niet, want het relatieve punt wat point is voordat het geconverteerd wordt (relatief ten opzichte van het active programma scherm) moet toch gewoon goed werken, waarom moet het geconverteerd worden naar een absoluut punt van het beeld?

Naar de bioscoop? => gebruik de app op Byoscoop.nl


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 18:18

.oisyn

Moderator Devschuur®

Demotivational Speaker

Wat is er mis met het lezen van de documentatie?

CMenu::TrackPopupMenu
CWnd::OnContextMenu

Volgens de documentatie van TrackPopupMenu moeten de coördinaten in screenspace zijn, en volgens de documentatie van OnContextMenu krijg je de muiscoördinaten ook in screenspace. Een transformatie is dus niet nodig.
Zo staat het in het boek, en ik heb het ook eens gewijzigd in & en |, maar dat maakt geen verschil uit (wat ook vrij vreemd is?)
De | operator doet hetzelfde als een + als de operanden geen overeenkomstige bits gezet hebben (aangezien 0 | 1 = 1 en 0 + 1 = 1, alleen bij een dubbele 1 overflowt die bit bij een optelling, bij een or blijft ie gewoon 1)

[ Voor 3% gewijzigd door .oisyn op 17-01-2005 20:57 ]

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.


  • Boy
  • Registratie: November 2001
  • Laatst online: 16-05 16:54

Boy

www.byoscoop.nl

Topicstarter
.oisyn schreef op maandag 17 januari 2005 @ 20:57:
Wat is er mis met het lezen van de documentatie?

CMenu::TrackPopupMenu
CWnd::OnContextMenu

Volgens de documentatie van TrackPopupMenu moeten de coördinaten in screenspace zijn, en volgens de documentatie van OnContextMenu krijg je de muiscoördinaten ook in screenspace. Een transformatie is dus niet nodig.


[...]

De | operator doet hetzelfde als een + als de operanden geen overeenkomstige bits gezet hebben (aangezien 0 | 1 = 1 en 0 + 1 = 1, alleen bij een dubbele 1 overflowt die bit bij een optelling, bij een or blijft ie gewoon 1)
Inderdaad, nu begrijp ik het weer (is weer een tijdje geleden :) )

0 + 1 = 1, 0 | 1 = 1 en ook 1 | 1 = 1 dan. Maar 1+1 = 10 (dit was voor mezelf ter bevestiging, so correct me if I'm wrong)

Maar dan nog over dat ClientToScreen : Dit staat dus inderdaad verkeerd in het boek volgens jou? Dat zou dan al de 4e fout zijn die ik vind, maar die andere 3 waren meer functionele spelfouten...

Naar de bioscoop? => gebruik de app op Byoscoop.nl