标题:窗体绘图问题求解
只看楼主
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
结帖率:100%
已结贴  问题点数:20 回复次数:12 
窗体绘图问题求解
HDC hDC;
HDC dcMem;//在内存中建立绘图设备
HBITMAP bmpTemp;//建立位图句柄
hDC=GetDC(hFrame);
dcMem=CreateCompatibleDC(hDC);//建立与绘图控件兼容的内存绘图设备
bmpTemp=(HBITMAP)LoadImage(NULL,".\\images\\margin.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);//载入一幅位图
//GetObject(bmpTemp,sizeof(BITMAP),&bk);
SelectObject(dcMem,bmpTemp);//让内存中的绘图设备选定用于绘图的位图
StretchBlt(hDC,0,0,610,530,dcMem,0,0,502,401,SRCCOPY);//内存中的图片复制到控件上
DeleteDC(dcMem);DeleteObject(bmpTemp);
ReleaseDC(hwnd,hDC);

以上绘图过程经测试可行。但随即出现了一个问题,我现在不再希望把一幅位图整体显示到控件上,是想把多幅小的位图同时分别显示在控件上的不同位置。我不希望把这些位图逐一直接blt到控件上,我想先把它们全部blt到一个内存绘图设备上,再一次性blt给控件。我试过由一个源内存设备stretchblt到另一个目标内存设备,但没有成功,stretchblt给我返了0.
请问各路英雄有没有什么好的办法?谢了先
搜索更多相关主题的帖子: images 图片 
2015-06-12 21:02
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
得分:0 
内存绘图很有用,有用得蛋疼
2015-06-13 18:17
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:8 
想做拼图游戏?找些相关的api看看、改改,一般能自己解决的,gdc作图看着就头痛,钻进去后解决问题就忘了。

能编个毛线衣吗?
2015-06-14 08:09
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
得分:0 
呵呵,没有拼图游戏那么复杂。是想做推箱子。墙、箱子、人各自用小的位图显示,现在想把它们blt到地图当中遇到了瓶颈,实在找不到办法的话还是只有不采用这种缓冲了,直接blt到控件上。
不过还是再问问看,能在内存中缓冲一下更好。
2015-06-14 10:41
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
得分:0 
找API当然是正途,关键是不知道按什么条件去搜。
2015-06-14 10:42
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:12 
你的代码是抄的吗?即使是抄,也要理解一下呀。
方法是一模一样的,直接重复一下而已。
我写个Demo给你:
程序代码:
#include <windows.h>

int main( void )
{
    HBITMAP bmpTemp = (HBITMAP)LoadImage(NULL,TEXT("test.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
    BITMAP bp;
    GetObject( bmpTemp, sizeof(BITMAP), &bp );

        HWND hwnd = GetConsoleWindow();
        HDC hdc = GetDC( hwnd );
        HDC dcMem = CreateCompatibleDC( hdc );
        HBITMAP bmpMem = CreateCompatibleBitmap( hdc, bp.bmWidth*2, bp.bmHeight );
        SelectObject( dcMem, bmpMem );

            HDC dcMemBmp = CreateCompatibleDC( hdc );
            SelectObject( dcMemBmp, bmpTemp );
            BitBlt( dcMem, 0, 0, bp.bmWidth, bp.bmHeight, dcMemBmp, 0, 0, SRCCOPY );
            BitBlt( dcMem, bp.bmWidth, 0, bp.bmWidth, bp.bmHeight, dcMemBmp, 0, 0, SRCCOPY );

            BitBlt( hdc, 0, 0, bp.bmWidth*2, bp.bmHeight, dcMem, 0, 0, SRCCOPY );
            DeleteDC( dcMemBmp );

        DeleteObject( bmpMem );
        DeleteDC( dcMem );
        ReleaseDC( hwnd, hdc );

    DeleteObject( bmpTemp );

    return 0;
}

2015-06-15 09:42
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:0 
回复 6楼 rjsp
在vc6下无法编译通过,显示“error C2065: 'GetConsoleWindow' : undeclared identifier”。能不能改成vc6可运行的?

能编个毛线衣吗?
2015-06-15 21:06
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
回复 7楼 wmf2014
GetConsoleWindow 这个函数在 win2000之后(包括win2000)的系统上才有,而VC6默认的操作系统是 WindowsNT 4.0。
如果你想使用这个函数,应该在 #include <windows.h> 前增加 #define _WIN32_WINNT 0x0501,将其设为XP。

这段代码只是个Demo,不使用控制台窗口,也可以使用其它窗口,比如“桌面窗口”,即改
HWND hwnd = GetConsoleWindow();
HDC hdc = GetDC( hwnd );

HWND hwnd = ::GetDesktopWindow();
HDC hdc = ::GetWindowDC( hwnd );
也行
2015-06-16 09:40
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
得分:0 
用GetConsoleWindow写了#define _WIN32_WINNT 0x0501还是undeclared

HWND hwnd = ::GetDesktopWindow();
HDC hdc = ::GetWindowDC( hwnd );
这个可以得到正常结果。
但是我想问一下,想用程序窗体的子窗口,应该怎样获得其hDC呢,我用GetDC没能画出来。
谢谢
2015-06-16 17:00
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:0 
回复 8楼 rjsp
我的情况通9楼,但没有看到测试图形。

能编个毛线衣吗?
2015-06-16 17:16



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-446539-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.327344 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved