<<<<<为什么画出来的没有颜色呢?谢谢>>>>>

snowedforest 2004-08-27 10:34:57
void CTemp1Dlg::OnOK()
{
HDC hdcMem;
HBITMAP hBitmap;
hdcMem=CreateCompatibleDC(NULL);
hBitmap = CreateDiscardableBitmap(hdcMem, 500,500);
(HBITMAP)SelectObject(hdcMem,hBitmap);
CBrush brush;
HGDIOBJ pBrush;
brush.CreateSolidBrush(0x0000ff);
pBrush=::SelectObject(hdcMem,brush);
::Rectangle(hdcMem,20,20,180,180);
::MoveToEx(hdcMem,1,1,NULL);
::LineTo(hdcMem,100,100);
::SelectObject(hdcMem,pBrush);
HDC hdc=::GetDC(this->m_hWnd);
::BitBlt(hdc,0,0,500,500,hdcMem,0,0,SRCCOPY);

::ReleaseDC(this->m_hWnd,hdc);
}
为什么画出来的没有颜色呢?谢谢
...全文
156 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
snowedforest 2004-08-27
  • 打赏
  • 举报
回复
哎呀,DentistryDoctor(牙科医生) 同志的分给漏掉了,真对不起。
snowedforest 2004-08-27
  • 打赏
  • 举报
回复
采用这个,谢谢
HDC hdc=::GetDC(this->m_hWnd);
hdcMem=CreateCompatibleDC(hdc);
hBitmap = CreateDiscardableBitmap(hdc, 500,500);
==============================================
分给得可能不大合理,只是一点心意吧。感谢各位。以后多多指教。再次感谢
菜牛 2004-08-27
  • 打赏
  • 举报
回复
设备句柄DC包含的GDI对象各有其默认值,对于内存设备句柄,其默认位图对象是1×1的两色位图,这也就是为什么创建了内存设备位图后一定要选入一个位图的原因(可以创建的兼容内存位图,也可以是任何其他有效位图),所以:
“原则上应该用(1)吧?”是绝对错误的,应该用(2)的形式,创建内存位图时,不能从内存位图创建,而应该用屏幕位图创建。这个错误好像很多人多犯,不知道为什么,不好好看看MSDN。
jazy 2004-08-27
  • 打赏
  • 举报
回复
hBitmap = CreateDiscardableBitmap(hdcMem, 500,500);
------
这里不要用memedc,用getdc得真dc就行了
holyeagle 2004-08-27
  • 打赏
  • 举报
回复
中间是红色啊,把
hdcMem=CreateCompatibleDC(&hdc);
hBitmap = CreateDiscardableBitmap(hdcMem, 500,500);
改成
HDC hdc=::GetDC(this->m_hWnd);

hdcMem=CreateCompatibleDC(hdc);
hBitmap = CreateDiscardableBitmap(hdc, 500,500);
jazy 2004-08-27
  • 打赏
  • 举报
回复
把你的 CDC mDC ;换成 CDC *mDC=GetDC();试一下.
原则上(2)是对的。 msdn上说得很清楚,基于内存dc的bitmap只能是单色的
-------------------------------------------------------------

zhaogaojian说的是对的,我调试过了确实如此,呵呵。
jazy 2004-08-27
  • 打赏
  • 举报
回复
我试了一下是黑色中一个灰矩形,矩形画了根线,大小跟程序中的吻合。
灰矩形(20,20,180,180)线(20, 20, 120, 120)
snowedforest 2004-08-27
  • 打赏
  • 举报
回复
CreateDiscardableBitmap == > CreateCompatibleBitmap以后效果也是一样的。
DentistryDoctor 2004-08-27
  • 打赏
  • 举报
回复
将暗黑的代码中的CreateDiscardableBitmap == > CreateCompatibleBitmap,并且绘图的代码写在此也不好!OnPaint?
snowedforest 2004-08-27
  • 打赏
  • 举报
回复
各位大侠可能都没有放到VC环境中试一下。
好象都不起作用。是不是只能画出单色?谢谢
lanstar200 2004-08-27
  • 打赏
  • 举报
回复
CreateDiscardableBitmap == > CreateCompatibleBitmap
lanstar200 2004-08-27
  • 打赏
  • 举报
回复
::Rectangle改成::FillRect
snowedforest 2004-08-27
  • 打赏
  • 举报
回复
: lizmei001(暗黑)
谢谢。但不行。
lixiaosan 2004-08-27
  • 打赏
  • 举报
回复
HDC hdc=::GetDC(this->m_hWnd);

放到前面去
zhaogaojian 2004-08-27
  • 打赏
  • 举报
回复
OnDraw()函数中使用内存绘图:
CBitmap bmp;
CDC mDC;
myBrush.CreateSolidBrush(m_colorbk);//背景颜色
mDC.CreateCompatibleDC(pDC);
mDC.SetMapMode(MM_HIMETRIC);
bmp.CreateCompatibleBitmap(&mDC,x,y);///............(1)
bmp.CreateCompatibleBitmap(pDC,x,y);///...............(2)
....

pDC->BitBlt(r.left,r.top,r.right,r.bottom,&mDC,r.left,r.top,SRCCOPY);
用(1)居然在屏幕上出现了很漂亮的花纹,但不能显示彩色(2)则正常,这是问什么,
原则上应该用(1)吧?不知道,请高手指点


把你的 CDC mDC ;换成 CDC *mDC=GetDC();试一下.
原则上(2)是对的。 msdn上说得很清楚,基于内存dc的bitmap只能是单色的
yeedward 2004-08-27
  • 打赏
  • 举报
回复
BOOL CreateSolidBrush( COLORREF crColor );
用下这个看看
lizmei001 2004-08-27
  • 打赏
  • 举报
回复
HDC hdcMem;
HDC hdc=::GetDC(this->m_hWnd);
HBITMAP hBitmap;
hdcMem=CreateCompatibleDC(&hdc);
hBitmap = CreateDiscardableBitmap(hdcMem, 500,500);
(HBITMAP)SelectObject(hdcMem,hBitmap);
CBrush brush;
HGDIOBJ pBrush;
brush.CreateSolidBrush(0x0000ff);
pBrush=::SelectObject(hdcMem,brush);
::Rectangle(hdcMem,20,20,180,180);
::MoveToEx(hdcMem,1,1,NULL);
::LineTo(hdcMem,100,100);
::SelectObject(hdcMem,pBrush);
::BitBlt(hdc,0,0,500,500,hdcMem,0,0,SRCCOPY);

::ReleaseDC(this->m_hWnd,hdc);
《VC++.NET精彩百例》配套代码

[涉及平台] VC++.NET
[作者] void
[文件大小] 2969KB
[更新日期] 2005-10-30

一、资源说明

第1章 界面编程
实例1 "欢迎"界面
实例2 动态字幕效果
实例3 透明窗体
实例4 静态切分窗口
实例5 滚动视图
实例6 字形窗口
实例7 多边形窗口
实例8 HTML浏览器
实例9 窗口的动效果
实例10 实现动图标
实例11 动态切分窗口
实例12 橡皮区矩形
实例13 多个定时器
实例14 椭圆窗体


第2章 图像和多媒体编程

实例 15 BMP文件浏览器
实例 16 图像的镜像处理
实例 17 图像的分割处理
实例 18 使用
实例 19 使用
实例 20 显示空心字
实例 21 显示渐进字体
实例 22 显示艺术字体
实例 23 马赛克效果
实例 24 MiDi播放器
实例 25 CD播放器
实例 26 纹理场景效果
实例 27 Bezier线框曲面
实例 28 输出旋转文本

第3章 对话框与控件编程
实例 29 树形控件
实例 30 列表控件
实例 31 时间控件
实例 32 彩色按钮
实例 33 组合框控件
实例 34 单选按钮和复选框
实例 35 工具栏编程
实例 36 状态栏编程
实例 37 对话框显示图片
实例 38 模式对话框
实例 39 非模式对话框
实例 40 位图按钮
实例 41 对话栏编程

第4章 文件与系统编程
实例 42 鼠标绘图
实例 43 键盘输入
实例 44 获取文件属性
实例 45 访问修改注册表
实例 46 设定计算机名称
实例 47 列举驱动器
实例 48 关闭操作系统
实例 49 查找文件
实例 50 获取磁盘空间
实例 51 读写文件
实例 52 系统进程检测
实例 53 获取系统信息
实例 54 获取文件夹路径
实例 55 设定系统时间

第5章 线程操作与COM组件编程
实例 56 创建线程
实例 57 线程间的通信
实例 58 使用自定义消息
实例 59 线程间的优先级
实例 60 线程间的同步
实例 61 重用C++对象
实例 62 创建永久对象
实例 63 MFC建立COM
实例 64 测试COM组件


第6章 网络和数据库编程
实例 65 聊天室服务器
实例 66 HTTP应用程序
实例 67 FTP应用程序
实例 68 HTTP服务器
实例 69 发送电子邮件
实例 70 接收电子邮件
实例 71 ATL Server Web
实例 72 DOA获取信息
实例 73 DAO数据库编程
实例 74 ADO访问数据库

第7章 OPENGL编程
实例 75 绘制对比矩形
实例 76 绘制直线
实例 77 绘制圆和椭圆
实例 78 绘制三角形
实例 79 缩放变换
实例 80 旋转变换
实例 81 平移变换
实例 82 绘制点
实例 83 OpenGL编程
实例 84 实现简单动
实例 85 视口投影变换
实例 86 键盘控制图形

第8章 OLE和GDI+编程
实例 87 OLE容器
实例 88 保存OLE信息
实例 89 设置跟踪矩形
实例 90 显示多个OLE项
实例 91 ActiveX服务器
实例 92 插值模式
实例 93 图像区域平铺
实例 94 文字填充
实例 95 图形容器
实例 96 线帽组合
实例 97 半透明线条
实例 98 颜色再变换表
实例 99 旋转和扭曲图像
实例 100 显示垂直文本

二、使用说明
本书所附光盘的内容包含了开发实例的所有程序源码,所有程序源码都是在Visual C++.NET上编译通过的。要运行本光盘上的实例,用户需要先安装Visual C++.NET编译环境,请将光盘上的实例拷贝到本机硬盘上,并去掉其只读属性。程序拷贝到本机硬盘后,经编译即可直接运行。(注意:各文件的文件名请与原书中的名称保持一致)

  关于读者近期反映的《Visual C++.net精彩编程百例》附带源码光盘问题,经核查,我们发现光盘中的确存在着源代码命名与原书不匹配的现象。发生这种现象的原因主要是由于工作人员失误,光盘在刻制过程采用了较旧的8×3文件名格式,导致某些文件/文件夹的名称信息丢失,使读者不能够直接使用。我们已经以最快的速度对此问题进行了初步更正。对于此次发布的新版源代码,您可以根据原书章节直接找到对应的源代码目录,然后根据原书中的文件名,将源代码中相应的文件名予以纠正即可正常使用。

  给读者的阅读使用造成了诸多不便,在此表示深深的歉意!希望能得到您的体谅并一如既往支持我们的工作,谢谢

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧