Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Нужно сделать на подобии TPaintBox


Автор: Ak47black 6.7.2007, 15:57
Здравствуйте.
Хочю спросить так как на Visual C++ сделать, так как не работал серьезно, как сделать чтото на подобии как в Delphi TPaintBox.
Если конкретней мне нужно получить указатель(bitamapа) и потом при помощи него рисовать на форме. Тоесть получить доступ к памяти которая хранит содержимое то что нарисовано на форме.
Или на форму чтото положить и от этого получить.
(Не работая с ресурсами)
Как-бы мне тут сделать?

Автор: yurec 6.7.2007, 16:06
можно взять СDC и им ( по нему ) ) рисовать

Автор: Ak47black 6.7.2007, 16:08
yurec, а как его заюзать, можешь пример кода привести

Автор: yurec 6.7.2007, 16:13
void CtestMFCView::OnMouseMove(UINT i_nFlags,CPoint i_point)
  {
  CPoint & pointStart = GetDocument()->m_mouseClickPointStart;
  CPoint & pointFinish  = GetDocument()->m_mouseClickPointFinish;
  if (0 != pointFinish.x)
    {
    if (MK_LBUTTON == i_nFlags)
      {
      CClientDC dc(this);
      dc.MoveTo(pointStart);
      COLORREF bkColor  = dc.GetBkColor();
      COLORREF penColor = RGB(200,0,0);
      CPen bkPen;
      bkPen.CreatePen(PS_SOLID,1,bkColor);
      dc.SelectObject(bkPen);
      dc.LineTo(pointFinish);
      CPen frontPen;
      frontPen.CreatePen(PS_SOLID,1,penColor);
      dc.SelectObject(frontPen);
      pointFinish  = i_point;
      dc.LineTo(pointFinish);
      pointStart  = pointFinish;
      }
    }
  }

Автор: Ak47black 6.7.2007, 16:17
Не тут чтото нето.
Мне нужно получить Pointer
И где сделать CtestMFCView::OnMouseMove я не представляю
Я юзаю Microsoft Visual Studio 2005 и просто создал Win32 app.
У меня простой каркас приложения.

Автор: yurec 6.7.2007, 16:19
MSDN:"Drawing in the Client Area
You use the BeginPaint and EndPaint functions to prepare for and complete the drawing in the client area. BeginPaint returns a handle to the display device context used for drawing in the client area; EndPaint ends the paint request and releases the device context. 

In the following example, the window procedure writes the message "Hello, Windows!" in the client area. To make sure the string is visible when the window is first created, the WinMain function calls UpdateWindow immediately after creating and showing the window. This causes a WM_PAINT message to be sent immediately to the window procedure. 

LRESULT APIENTRY WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    PAINTSTRUCT ps; 
    HDC hdc; 
 
    switch (message) 
    { 
        case WM_PAINT: 
            hdc = BeginPaint(hwnd, &ps); 
            TextOut(hdc, 0, 0, "Hello, Windows!", 15); 
            EndPaint(hwnd, &ps); 
            return 0L; 

        // Process other messages.  
    } 
} 
 
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
{ 
    HWND hwnd; 
 
    hwnd = CreateWindowEx( 
        // parameters 
        ); 
 
    ShowWindow(hwnd, SW_SHOW); 
    UpdateWindow(hwnd); 
 
    return msg.wParam; 
} 
"

Автор: Ak47black 6.7.2007, 16:22
yurec, я в курсе этого. Это нето что мне нужно.
Мне нужно получить указатель чтобы работать на прямую с памятью, а не с GDI.
К Scanlinам если по другому.

Автор: Earnest 6.7.2007, 16:43
А что ты будешь делать напрямую с памятю битмапа (если я правильно поняла)? Неужели по пикселам на экран выводить? Или по пикселам в битмапе рисовать? Не самая удачная идея. Объясни почетче, что именно тебе нужно, причем именно задачу, а не предполагаемый тобою способ решения.

Автор: Ak47black 6.7.2007, 16:52
Earnest, работаю с Video драйвером и от него хочю вывести.
Указатель нужен что-бы скопировать туда память с другого места которая содержит изображение.

Автор: yurec 6.7.2007, 17:32
The BitBlt function performs a bit-block transfer of the color data corresponding to a rectangle of pixels from the specified source device context into a destination device context. 

BOOL BitBlt(
  HDC hdcDest, // handle to destination DC
  int nXDest,  // x-coord of destination upper-left corner
  int nYDest,  // y-coord of destination upper-left corner
  int nWidth,  // width of destination rectangle
  int nHeight, // height of destination rectangle
  HDC hdcSrc,  // handle to source DC
  int nXSrc,   // x-coordinate of source upper-left corner
  int nYSrc,   // y-coordinate of source upper-left corner
  DWORD dwRop  // raster operation code
);

посмотри, может тебя похожая функция заинтересует

Автор: Ak47black 6.7.2007, 17:49
yurec, неа я знаю эти функции, но они не помогут.
Мне нужно получить указатель на изображение формы или на форму применить какойнибудь класс и от него получить указатель.
На языке Delphi это выглядит вот так
Код

var
  BitmapPointer: Pointer;
***
  BitmapPointer:= OutputBitmap.Picture.Bitmap.ScanLine[OutputBitmap.Picture.Bitmap.Height-1];

OutputBitmap - TImage;

Автор: Earnest 6.7.2007, 18:06
Ok, тогда вместо DDB-битмапа используй DIB-секцию. Все то же самое, можно выбирать в контекст и рисовать стандартными функциями, но у тебя будет также прямой доступ к памяти. См. CreateDIBSection

Добавлено через 3 минуты и 24 секунды
Однако, то, что в Дельфи от тебя прикрыто, придется делать самому.
Доступ непосредственно к экранной памяти, где лежит содержимое формы, ты никак не получишь. Ты должен создать ДИБ-секцию подходящего размера и совместимый контекст, скопировать туда форму (через BitBlt), и уж тогда делай с этой памятью что хочешь.

Автор: Ak47black 7.7.2007, 14:05
Цитата

Доступ непосредственно к экранной памяти, где лежит содержимое формы, ты никак не получишь.

Да я понимаю что тут только из ring 0 можно работать.
Лан потребность в использовании Visual C++ у меня щас отпала.

Earnest, Спасибо за ответы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)