C++ Can';t显示比CDC区域分辨率更高的位图

C++ Can';t显示比CDC区域分辨率更高的位图,c++,mfc,cdc,cbitmap,C++,Mfc,Cdc,Cbitmap,嗨,亲爱的古鲁和专业的程序员们 我不会从一个新手开始,对图像编程不太了解,但不幸的是,事实是:( 我试图显示一个位图指针*图像数据的分辨率图像 我试着在一个分辨率或大小为627x474的区域上绘制它 但是,重复尝试似乎不起作用。当我将创建的位图图像从*ImageData width and height更改为分辨率或大约627x474的大小时,它就起作用了 在尝试了各种论坛和谷歌的所有可能解决方案后,我真的不知道如何解决这个问题 pDC是CDC*,memDC是在早期方法中初始化的CDC 此处未初

嗨,亲爱的古鲁和专业的程序员们

我不会从一个新手开始,对图像编程不太了解,但不幸的是,事实是:(

我试图显示一个位图指针*图像数据的分辨率图像 我试着在一个分辨率或大小为627x474的区域上绘制它

但是,重复尝试似乎不起作用。当我将创建的位图图像从*ImageData width and height更改为分辨率或大约627x474的大小时,它就起作用了

在尝试了各种论坛和谷歌的所有可能解决方案后,我真的不知道如何解决这个问题

pDC是CDC*,memDC是在早期方法中初始化的CDC 此处未初始化的任何内容都是在其他方法中初始化的

这是我的密码,亲爱的谦卑的古鲁。请给我提供尤达和欧比万给卢克·天行者的指导

void DemoControl::ShowImage( void *ImageData )
{


    int Width; //Width of Image From Camera
    int Height; //Height of Image From Camera

    int m_DisplayWidth = 627 ;//width of rectangle area to display
    int m_DisplayHeight = 474;//height of rectangle area to display

    GetImageSize( &Width, &Height ) ; //this will return Width = 1392, Height 1032

    CBitmap bitmap;

    bitmap.CreateBitmap(Width,Height,32,1,ImageData);

    CBitmap* pOldBitmap = memDC.SelectObject((CBitmap*)&bitmap);

    pDC->BitBlt(22, 24, 627, 474, &memDC, 0, 0, SRCCOPY);

    memDC.SelectObject((CBitmap*)pOldBitmap);

    ReleaseDC(pDC);

}

好的,这是一些附加部分


我想我应该解释一下流程是如何进行的

(a) 一个类(比如DemoTestingDlg类)将如下所示将CDC传递给另一个类(比如DemoControl类)

(b) 在DemoControl类中

m_Demo = new DemoControl ; 

m_Demo->Initialisation( this, this->GetDC() ) ; 
bool DemoControl::初始化(CDemoTestingDlg m_FormControl,CDC m_StaticDisplay){

}

pDC和memDC在标题中也是如此:

CDC* pDC ; CDC memDC; 
(c) 如果假设捕获了图像,则图像指针将传递给DemoTestingDlg类,该类随后将调用Demo控件类中的showImage方法,这是我在问题中编写的方法。我这样做对吗

注意:如果它们的大小相同(我指的是CDC和位图),它确实会显示一个图像,因此我的印象是我的CDC指针传递正确

是您的朋友:)

编辑:好的,你如何得到pDC?什么时候调用函数?在油漆上还是图纸上

这是一个StretchBlt,我从覆盖的CStatic中的DrawItem调用中执行

HDC hBitmapDC   = CreateCompatibleDC( pDrawItemStruct->hDC );

HBITMAP hBitmap = GetBitmap();
HGDIOBJ hOld    = SelectObject( hBitmapDC, (HGDIOBJ)hBitmap );

StretchBlt( pDrawItemStruct->hDC, pDrawItemStruct->rcItem.left, pDrawItemStruct->rcItem.top, pDrawItemStruct->rcItem.right, pDrawItemStruct->rcItem.bottom,
            hBitmapDC, 0, 0, 4, 4, SRCCOPY );

SelectObject( hBitmapDC, hOld );
DeleteObject( hBitmapDC );
它不使用MFC类将4x4位图拉伸到更大的空间,但效果非常好。我的猜测是,您这样做不是为了响应WM_PAINT/WM_DRAWITEM和/或使用错误的DC

编辑重新编辑:然后是否从OnPaint或DrawItem调用内部调用DrawImage

我认为您最好不要缓存该CDC,并在每次希望绘制时传递CDC。

“从位图指针*分辨率为1392x1032的图像数据”

不,不是,它的尺寸是1392x1032。分辨率是每距离离散视觉单位的数量


正如上面提到的,您需要发布更多的代码。至少显示OnPaint()。您在哪里实例化CPaintDC?创建一个新项目并将所有代码放在其中,这样您就有了一个显示问题的最小测试集。如果您使用StretchBlt()代替当前使用的BitBlt(),您似乎大致上走在了正确的轨道上。

也尝试了StretchBlt,但不幸的是效果相同:(或者我误解了你的问题,或者你对StretchBlt做了一些错误。StretchBlt将把1392x1032图像渲染成627x424 DC…你得到了什么错误?我可以看到你尝试过的StretchBlt调用吗?pDC->StretchBlt(22,24627474,&memDC,0,0,宽度,高度,SRCCOPY);它不显示错误。与bitblt一样,当我将图像的宽度和高度设置为“宽度”和“高度”时,两者都没有返回图像(请参阅上面的值)。只有当我将宽度和高度设置为与CDC区域相同(627x474)时,图像才会显示。抱歉,我应该说没有显示错误。感谢GozI的回复。我认为我应该解释流程如何。1.一个类(比如DemoTestingDlg类)会将CDC如下传递给另一个类(比如DemoControl类)m_Demo=new DemoControl;m_Demo->initialization(this,this->GetDC());2.在DemoControl类bool DemoControl::initialization(CDemoTestingDlg m_FormControl,CDC m_StaticDisplay){pDC=m_StaticDisplay;memDC.CreateCompatibleDC(pDC);}pDC和memDC在头中是一样的:CDC*pDC;CDC memDC;
HDC hBitmapDC   = CreateCompatibleDC( pDrawItemStruct->hDC );

HBITMAP hBitmap = GetBitmap();
HGDIOBJ hOld    = SelectObject( hBitmapDC, (HGDIOBJ)hBitmap );

StretchBlt( pDrawItemStruct->hDC, pDrawItemStruct->rcItem.left, pDrawItemStruct->rcItem.top, pDrawItemStruct->rcItem.right, pDrawItemStruct->rcItem.bottom,
            hBitmapDC, 0, 0, 4, 4, SRCCOPY );

SelectObject( hBitmapDC, hOld );
DeleteObject( hBitmapDC );