Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.01.2010, 13:15   #1
Марин
 
Регистрация: 24.01.2010
Сообщений: 4
Радость BitBlt из памяти на экран

Не могу вывести из рамяти на экран битмапу помощью BitBlt.
На моём Windows Vista этот код даёт в результате чёрный квадрат, если меняю «raster operation code» , цвет квадрата, естественно, меняется.




Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.IO;


namespace Grafics_3
{
    public partial class Form1 : Form
    {
        Bitmap Campo = (Bitmap)Image.FromFile(@"Pl Plain V.png", true);
        [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
        private static extern int BitBlt(
          IntPtr hdcDest,     
          int nXDest,         
          int nYDest,         
          int nWidth,         
          int nHeight,        
          IntPtr hdcSrc,      
          int nXSrc,          
          int nYSrc,          
          System.Int32 dwRop);
 


        public Form1()
        {
            
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            IntPtr hdcScr = g.GetHdc(); 


            Graphics gImd = Graphics.FromImage(Campo);
            IntPtr hdcImD = gImd.GetHdc();

            
            BitBlt(hdcScr, 100, 100, 60, 60, hdcImD, 0, 0, SRCCOPY);

            g.ReleaseHdc(hdcScr);
            gImd.ReleaseHdc(hdcImD);
        
         }
     }

 }

Последний раз редактировалось Марин; 24.01.2010 в 18:35.
Марин вне форума Ответить с цитированием
Старый 24.01.2010, 15:13   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Странно, а g.DrawImage(Campo..... не прокатит ?
BOBAH13 вне форума Ответить с цитированием
Старый 24.01.2010, 18:32   #3
Марин
 
Регистрация: 24.01.2010
Сообщений: 4
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Странно, а g.DrawImage(Campo..... не прокатит ?
Вы правы, с помощью DrawImage работает безотказно , я только не пойму почему hdcImD битмапы Campo не находит?
Марин вне форума Ответить с цитированием
Старый 24.01.2010, 20:03   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Graphics gImd = Graphics.FromImage(Campo);
IntPtr hdcImD = gImd.GetHdc();
Меня терзают сомнения... кажется что hdcImD == null ? т.к. Campo это Gdiplus::Bitmap, а у GDI+ Bitmap он не формирует HDC к памяти, т.к. что проверьте, и вообще зачем так изощрятся ? Ведь и так тут явно вам дают graphics и bitmap
BOBAH13 вне форума Ответить с цитированием
Старый 24.01.2010, 20:49   #5
Марин
 
Регистрация: 24.01.2010
Сообщений: 4
По умолчанию

А может тогда подскажете каким образом я могу обратиться к моей битмапе в памяти, чтобы из двух изображений построить одно, до его вывода на экран?
Марин вне форума Ответить с цитированием
Старый 24.01.2010, 21:53   #6
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Ну к примеру так:

1. Создать Bitmap
2. Создать Graphics из bitmap (п.1)
3. Нарисовать на Graphics (п.2) Campo (или что угодно другое)
4. Создать Graphics окна (ну e.Graphics...)
5. Нарисовать bitmap (п.1)

Одна из вариаций... если надо еще круче и быстрее, то в версиях не для .NET Gdi+ дает LookBits для Bitmap, т.е. можно получить "прямой" доступ к памяти (DIB секции)

Вам решать, что Вам нужно.
BOBAH13 вне форума Ответить с цитированием
Старый 25.01.2010, 00:50   #7
Марин
 
Регистрация: 24.01.2010
Сообщений: 4
По умолчанию

Спасибо большое за помощь, всё работает даже у нас в Барселоне
Марин вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
BitBlt ZotaC Gamedev - cоздание игр: Unity, OpenGL, DirectX 14 16.01.2010 19:04
BitBlt на контекст DC и его альтернатива notHaker Мультимедиа в Delphi 7 03.12.2009 01:04
Вывести на экран шестнадцатиричное представление битового образа из памяти Kravnos Общие вопросы C/C++ 1 01.12.2009 23:49
вывод информации на экран о состоянии памяти на текущем диске А(assembler) alien9356 Фриланс 2 15.06.2009 15:41
Поддержка памяти в ХР uraura Windows 1 31.03.2009 10:46