jbs106 | olivthill a écrit :
Ah, ah, ah
Dans WM_PAINT, il faut récupérer le HDC via BeginPaint, par exemple
PAINTSTRUCT ps;
HDC hdc;
...
hdc = BeginPaint(hwnd, &ps);
...
EndPaint(hwnd, &ps); |
|
Voici mon code :
Code :
- LRESULT TDrawer::MsgPaint (WPARAM wParam, LPARAM lParam)
- {
- PAINTSTRUCT PS;
- RECT rect = {0, 0,Bitmap::GetWidth(),Bitmap::GetHeight()};
- HDC hdc = BeginPaint(m_hWnd,&PS);
- //HDC hdcNULL = GetDC(NULL);
- HDC hdcMem = CreateCompatibleDC(hdc);
- HBITMAP hBitmapOld = (HBITMAP) SelectObject(hdcMem, m_hBitmap);
- RECT rcClip;GetClipBox(hdcMem,&rcClip);
- FillRect(hdcMem, &rect,static_cast<HBRUSH>(GetStockObject (WHITE_BRUSH)));
- int nPos = this->m_ListElement.size();
- int iPos = 0;
- while(iPos<nPos) // Loop while aPos is not null
- {
- if(RectVisible(hdcMem,&this->m_ListElement[iPos]->GetBoundRect())) // If the element is visible...
- this->m_ListElement[iPos]->Draw(hdcMem,m_pSelected); // ...draw it
- iPos++;
- }
- //if(m_pTempElement)
- // m_pTempElement->Draw(hdcMem);
- StretchBlt(hdc, m_Origine.x, m_Origine.y, m_View.cx * m_Scale, m_View.cy * m_Scale, hdcMem,abs(m_OrigineView.x-m_Origine.x)/m_Scale,abs(m_OrigineView.y - m_Origine.y)/m_Scale , m_View.cx, m_View.cy, SRCCOPY);
- SelectObject(hdcMem, hBitmapOld); // Release
- DeleteDC(hdcMem);
- //ReleaseDC(NULL,hdcNULL);
- EndPaint(m_hWnd, &PS); // Utiliser hBitmap ensuite...
- return TRUE;
- }
|
Code :
- LRESULT TDrawer::MsgMouseMove (WPARAM wParam, LPARAM lParam)
- {
- HDC hdc,hdcMem;
- HBITMAP hBitmapOld;
- m_SecondPoint.x = (short) LOWORD(lParam);
- m_SecondPoint.y = (short) HIWORD(lParam);
- if(m_MoveMode)// If we are in move mode, move the selected element and return
- {
- hdc = GetDC(m_hWnd) ; SetROP2(hdc ,R2_NOT);
- hdcMem = CreateCompatibleDC(hdc); SetROP2(hdcMem ,R2_NOTXORPEN);
- hBitmapOld = (HBITMAP)SelectObject(hdcMem, m_hBitmap);
- MoveElement(hdcMem, m_SecondPoint); // Move the element
- this->m_bModified = TRUE;
- goto LibèreDC;
- }
- ClientToPixel(m_SecondPoint);
- if((GetCapture() == m_hWnd)&&(wParam & MK_LBUTTON))// Si le bouton gauche est enfoncé
- {
- hdc = GetDC(m_hWnd) ; SetROP2(hdc ,R2_NOT);
- hdcMem = CreateCompatibleDC(hdc); SetROP2(hdcMem ,R2_NOTXORPEN);
- hBitmapOld = (HBITMAP)SelectObject(hdcMem, m_hBitmap);
- if(m_pTempElement) // Si un élément temporaire est déjà défini
- {
- if(CURVE == this->GetElementType()) // Si c'est une courbe
- { SetROP2(hdcMem,R2_COPYPEN);
- (static_cast<ECurve*>(m_pTempElement))->DrawSegment(hdcMem,m_SecondPoint); // We are drawing a curve
- (static_cast<ECurve*>(m_pTempElement))->AddSegment(m_SecondPoint); // so add a segment to the existing curve
- goto LibèreDC;
- }
- m_pTempElement->Draw(hdcMem); // Redraw the old element so it disappears from the view
- delete m_pTempElement; // Delete the old element
- m_pTempElement = 0; // Reset the pointer to 0
- }
- m_pTempElement = CreateElement(); // Créer un element mais temporaire tant que l'utilisateur ne lache pas le button pour figer l'élément
- m_pTempElement->Draw(hdcMem); // Draw the element
- goto LibèreDC;
- }
- else // Si nous ne dessinons pas alors mise en surbrillance sous le pointeur d'un élément existant
- {
- VElement* pCurrentSelection = SelectElement(m_SecondPoint);// Existe-t-il un élément sous le pointeur?
- if(pCurrentSelection!=m_pSelected) // Si l'élément sous le pointeur est différent que l'ancien élément?(soit l'ancien ou un nouveau)
- {
- hdc = GetDC(m_hWnd) ; SetROP2(hdc ,R2_NOT);
- hdcMem = CreateCompatibleDC(hdc); SetROP2(hdcMem ,R2_NOTXORPEN);
- hBitmapOld = (HBITMAP)SelectObject(hdcMem, m_hBitmap);
- if(m_pSelected) // Si existance de l'ancien élément, est (toujours) de la couleur "surbrillance"
- { m_pSelected->Draw(hdcMem,m_pSelected); // En le dessinant de la couleur surbrillance, Nous effaçons ses pixels (NOTXORPEN)
- m_pSelected->Draw(hdcMem); // L'élément est dessiné de sa plume, son épaisseur et sa couleur d'origine
- }
- m_pSelected = pCurrentSelection; // Save elem under cursor
- if(m_pSelected) // Is there one?
- {
- m_pSelected->Draw(hdcMem);
- m_pSelected->Draw(hdcMem,m_pSelected);// Yes, so get it redrawn
- }
- goto LibèreDC;
- }
- }
- return DefMDIChildProc(m_hWnd,WM_MOUSEMOVE,wParam,lParam);
- LibèreDC:
- StretchBlt(hdc, m_Origine.x, m_Origine.y, m_View.cx * m_Scale, m_View.cy * m_Scale, hdcMem,abs(m_OrigineView.x-m_Origine.x)/m_Scale,abs(m_OrigineView.y - m_Origine.y)/m_Scale , m_View.cx, m_View.cy, SRCCOPY);
- SelectObject(hdcMem, hBitmapOld); // Release
- BOOL bOK = DeleteDC(hdcMem);
- bOK = ReleaseDC(m_hWnd, hdc);
- ::InvalidateRect(m_hWnd, NULL, TRUE);
- ::UpdateWindow(m_hWnd);
- return TRUE;
- }
|
|