Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужно сделать на подобии TPaintBox 
V
    Опции темы
Ak47black
  Дата 6.7.2007, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Здравствуйте.
Хочю спросить так как на Visual C++ сделать, так как не работал серьезно, как сделать чтото на подобии как в Delphi TPaintBox.
Если конкретней мне нужно получить указатель(bitamapа) и потом при помощи него рисовать на форме. Тоесть получить доступ к памяти которая хранит содержимое то что нарисовано на форме.
Или на форму чтото положить и от этого получить.
(Не работая с ресурсами)
Как-бы мне тут сделать?
PM MAIL   Вверх
yurec
Дата 6.7.2007, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 4.7.2007

Репутация: нет
Всего: нет



можно взять СDC и им ( по нему ) ) рисовать
PM MAIL   Вверх
Ak47black
Дата 6.7.2007, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



yurec, а как его заюзать, можешь пример кода привести
PM MAIL   Вверх
yurec
Дата 6.7.2007, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 4.7.2007

Репутация: нет
Всего: нет



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;
      }
    }
  }
PM MAIL   Вверх
Ak47black
Дата 6.7.2007, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Не тут чтото нето.
Мне нужно получить Pointer
И где сделать CtestMFCView::OnMouseMove я не представляю
Я юзаю Microsoft Visual Studio 2005 и просто создал Win32 app.
У меня простой каркас приложения.
PM MAIL   Вверх
yurec
Дата 6.7.2007, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 4.7.2007

Репутация: нет
Всего: нет



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; 
} 
"
PM MAIL   Вверх
Ak47black
Дата 6.7.2007, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



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

Это сообщение отредактировал(а) Ak47black - 6.7.2007, 16:28
PM MAIL   Вверх
Earnest
Дата 6.7.2007, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



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


--------------------
...
PM   Вверх
Ak47black
Дата 6.7.2007, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Earnest, работаю с Video драйвером и от него хочю вывести.
Указатель нужен что-бы скопировать туда память с другого места которая содержит изображение.
PM MAIL   Вверх
yurec
Дата 6.7.2007, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 4.7.2007

Репутация: нет
Всего: нет



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
);

посмотри, может тебя похожая функция заинтересует
PM MAIL   Вверх
Ak47black
Дата 6.7.2007, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



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

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

OutputBitmap - TImage;

PM MAIL   Вверх
Earnest
Дата 6.7.2007, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



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

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


--------------------
...
PM   Вверх
Ak47black
Дата 7.7.2007, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Цитата

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

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

Earnest, Спасибо за ответы.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0495 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.