j'ai ce bug à chaque fois que j'execute mon programme
c'est sans gravité , si je fais continue le programme marche derriere, mais j'aimerais bien le supprimer
merci beaucoup
http://img32.imageshack.us/img32/8262/bugvwl.png
j'ai ce bug à chaque fois que j'execute mon programme
c'est sans gravité , si je fais continue le programme marche derriere, mais j'aimerais bien le supprimer
merci beaucoup
http://img32.imageshack.us/img32/8262/bugvwl.png
Et c'est quoi le bug ? On doit le deviner ?
Raymond
Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi
CafuroCafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
e-verbeUn logiciel de conjugaison des verbes de la langue française.
Ma page personnelle sur DVP.
si tu veux j'ai ça :
si je clique ignorer derrier ça marche
mais si je pouvais supprimer ce bug ce serait bien
l'erreur vient peut-etre du cursor d'après le message sur la 1ere image
les seuls appel dans mon programme sont
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 ON_WM_SETCURSOR() //dans le begin message map ... HCURSOR CLEMonitorDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } ........ BOOL CLEMonitorDlg::PreTranslateMessage(MSG* pMsg) { // Hide the tooltip on keyboard and mouse button events HIDE_TOOL_TIP_ON_KB_AND_MB_EVENTS(m_ttce) // Double clicking in node list if (pMsg->hwnd == m_lstNode.GetSafeHwnd()) { // Left double-clicking copies the list entry to the Update fields // and the node id field if (pMsg->message == WM_LBUTTONDBLCLK) { int n = m_lstNode.GetCurSel(); if (n >= 0) { m_nNodeId = m_lstNode.GetItemData(n); } } } return CDialog::PreTranslateMessage(pMsg); } //----------------------------------------------------------------------------- /** \brief Handles tool tip text for all controls * * The macros used in this function is defined in the class CToolTipCtrlEx. * The text macros is defined in the header file ToolTipText.h */ //----------------------------------------------------------------------------- BOOL CLEMonitorDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { BEGIN_TOOL_TIP_MAP(m_ttce) { REG_TOOL_TIP(m_ttce, m_frmSendMessage, pWnd, TIP_SEND_MESSAGE) REG_TOOL_TIP(m_ttce, m_frmMessageLog, pWnd, TIP_LOG_MESSAGE) REG_TOOL_TIP(m_ttce, m_frmNodeList, pWnd, TIP_NODE_LIST) REG_TOOL_TIP(m_ttce, *m_pCmbComPort, pWnd, TIP_CMB_COM_PORT) } END_TOOL_TIP_MAP(m_ttce) return CDialog::OnSetCursor(pWnd, nHitTest, message); }
salut,
déjà 1er problème, le source affiché dans le debugger ne correspond pas à une version MFC42 (VC6) -> la classe _AFX_MOUSEANCHORWND n'existait pas à cette époque
ensuite, le call stack indique que c'est dans CScrollView::OnPrepareDC()
et là, il y a un certain nombre d'ASSERT ... procure toi les bons sources MFC
@+
merci
le projet est compilé en VC++6, mais j'ai utilisé le debugger de VS2005
sinon si l'erreur vient du CScrollView::onpreparedc
c'est bizarre parce que je lance effectivement une CScrollView à l'initDialog du dialogue principal
comme ça
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 //CCreateContext pContext; CWnd* pFrameWnd = this; pContext.m_pCurrentDoc = new CMyDocument; pContext.m_pNewViewClass = RUNTIME_CLASS(CMyVw); pView =(CMyVw *) ((CFrameWnd*)pFrameWnd)->CreateView(&pContext); ASSERT(pView); pView->ShowWindow(SW_NORMAL); CRect rectWindow; //GetWindowRect(rectWindow); rectWindow.top=400; rectWindow.bottom=800; rectWindow.left=10; rectWindow.right=410; pView->MoveWindow(rectWindow);
par contre ma CScrollView ne (re)définit pas de OnPrepareDC
est-ce que ASSERT(pView) appelle OnPrepareDC?
c'est dans VIEWSCRL.CPP ligne 134, comme indiqué dans la boite de dialogue
reste à consutler les sources MFC (les bons, ceux de VC6) pour voir pourquoi ...
@+
apparemment je dois mettre utilise onPreparedc et faire un setscrollsize dedans
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 #ifdef _DEBUG if (m_nMapMode == MM_NONE) { TRACE0("Error: must call SetScrollSizes() or SetScaleToFitSize()"); TRACE0("\tbefore painting scroll view.\n"); ASSERT(FALSE); << ligne 134 return; } #endif //_DEBUG
je met à jour la scroll size dans le onDraw(CDC* pDC)
c'est bizarre de devoir refaire ça dans on prepare dc
et ce probleme je l'ai que en Debug
void CMyVw::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
Le SetScrollSize() peut aussi être fait dans OnInitialUpdate()
Raymond
Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi
CafuroCafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
e-verbeUn logiciel de conjugaison des verbes de la langue française.
Ma page personnelle sur DVP.
OnPrepareDC est appelé juste avant OnDraw ...je met à jour la scroll size dans le onDraw(CDC* pDC)
c'est bizarre de devoir refaire ça dans on prepare dc
c'est pas dans OnDraw qu'il faut appeler cette fonction, mais dans OnInitialUpdate(), comme le dis ram-0000 et à chaque fois que tu as besoin de changer la taille de la zone de défilement.
@+
le setscrollsize etait deja dans le onInitialUpdate
sinon bon j'ai enlevé le setscrollsize du onDraw c'est vrai que ça doit ralentir le programme
mais en fait ma scrollView est zoomé par un click droit et dezoomé par click gauche
au depart j'avais mis le setScrollSize dans le setMapMode, maintenant il est dans les click droit/gauche, mais à chaque onDraw , setMapMode est appelé et ça adapte le viewPort , alors que le zoom change seulement par 1 click.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 void CMyVw::OnDraw(CDC* pDC) { SetMapMode(pDC); DrawGrid(pDC); //pDC->BitBlt(0,0,m_nBmpWidth,m_nBmpHeight,&m_MemDC,0,0,SRCCOPY); pDC->SelectStockObject(BLACK_BRUSH); if (m_refCnt) for (int i=0;i<m_refCnt;i++) pDC->Rectangle(m_ref[i].x*10-5,m_ref[i].y*10-5,m_ref[i].x*10+5,m_ref[i].y*10+5); pDC->SelectStockObject(GRAY_BRUSH); if (m_blindCnt) for (int j=0;j<m_blindCnt;j++) pDC->Rectangle(m_blind[j].x*10-5,m_blind[j].y*10-5,m_blind[j].x*10+5,m_blind[j].y*10+5); } int CMyVw::SetMapMode(CDC* pDC) { int previousMode = pDC->SetMapMode(MM_ISOTROPIC); pDC->SetWindowExt(100,100); //pDC->SetViewportOrg(CPoint(0,0)); pDC->SetViewportExt(10*m_zoomFactor,10*m_zoomFactor); return previousMode; } // CMyVw message handlers void CMyVw::OnLButtonDown(UINT nFlags, CPoint point) { m_zoomFactor+=2; SetScrollSizes(MM_TEXT,CSize(65*m_zoomFactor,65*m_zoomFactor)); Invalidate(TRUE); } void CMyVw::OnRButtonDown(UINT nFlags, CPoint point) { m_zoomFactor-=2; SetScrollSizes(MM_TEXT,CSize(65*m_zoomFactor,65*m_zoomFactor)); Invalidate(TRUE); }
Je sais pas comment allégé la fonction onDraw , il faudrait que je modifie une CDC en interne et que la dessine
ce serait sympa de m'aider pour faire ça, parceque c'est sur qu'actuellement le programme fait beaucoup d'operations inutiles, quoique je sais pas à quelle frequence est appelé onDraw, si elle est appelé à chaque evenement souris ou clavier, et bien ça va pour mon programme
merci beaucoup pour l'aide
Partager