• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 在ActiveX控件中绘制真彩色BMP图片怎么变成黑白的了

在ActiveX控件中绘制真彩色BMP图片怎么变成黑白的了

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了activex控件下载,activex控件,activex控件被阻止,activex控件官方下载,activex控件下载安装等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 在ActiveX控件中绘制真彩色BMP图片怎么变成黑白的了
描述:

我用ATL3.0开发的控件,打算用来绘制BMP图像,ATL开发中不支持MFC,全部使用SDK,但是绘制后图片变成了黑白了。对于读取BMP文件与绘制的源码我在exe环境下直接使用是没有问题的阿!百思不得其解,贴出来求哪位大虾相救。
以下是读取BMP文件的源码:
HBITMAP LoadBitmapFile(char *sFile,int &nWidth,int &nHeight,HDC hDc,HPALETTE *pPalette)
{
HFILE                          file;
OFSTRUCT    OfStruct; 
LPBITMAPINFOHEADER    lpImgData;   
LOGPALETTE                     *pLogPal;   
LPRGBQUAD                      lpRGB;   
HPALETTE                       hPrevPalette;      
HLOCAL                         hPal;   
DWORD    LineBytes;   
DWORD    ImgSize;   
DWORD                          NumColors;   
DWORD    i;  
BITMAPFILEHEADER       bh;   
BITMAPINFOHEADER       bi;   
HBITMAP     hBitmap=NULL;   
HGLOBAL     hImgData=NULL;   
HPALETTE hOutPalette = NULL;
 
DWORD size;
file = (HFILE)OpenFile(sFile, (LPOFSTRUCT)&OfStruct, OF_READ);
size = (DWORD)sizeof(BITMAPFILEHEADER);
::ReadFile((void*)file,&bh,size,&size,NULL);
size = sizeof(BITMAPINFOHEADER);
ReadFile((void*)file,(void*)&bi,size,&size,NULL);
LineBytes = (DWORD)WIDTHBYTES(bi.biWidth * bi.biBitCount);  
ImgSize = (DWORD)LineBytes*bi.biHeight; 
if(bi.biClrUsed != 0)
{
NumColors = (DWORD)bi.biClrUsed; 
}
else
{
switch(bi.biBitCount){   
case   1:   
NumColors=2;   
break;   
case   4:   
NumColors=16;   
break;   
case   8:   
NumColors=256;   
break;   
case   24:   
NumColors=0;   
break;   
default:   
::CloseHandle((void *)file); 
return   FALSE;     
}  
}
if(bh.bfOffBits != (DWORD)(NumColors * sizeof(RGBQUAD) + sizeof(BITMAPFILEHEADER)   
+ sizeof(BITMAPINFOHEADER)))   
{   
::CloseHandle((void *)file);  
return FALSE;     
}   
bh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + NumColors * sizeof(RGBQUAD) + ImgSize;   
if((hImgData = GlobalAlloc(GHND,(DWORD)(sizeof(BITMAPINFOHEADER) +   
NumColors * sizeof(RGBQUAD) + ImgSize))) == NULL)   
{   
::CloseHandle((void *)file); 
return   FALSE;   
}   
    
lpImgData = (LPBITMAPINFOHEADER)GlobalLock(hImgData);      
::SetFilePointer((void *)file,sizeof(BITMAPFILEHEADER),NULL,FILE_BEGIN);
size = (DWORD)sizeof(BITMAPINFOHEADER)+ (long)NumColors * sizeof(RGBQUAD)+ImgSize;
::ReadFile((void *)file,(void*)lpImgData,size,&size,NULL);     
::CloseHandle((void *)file); 
if(NumColors != 0)   
{                                           
hPal = LocalAlloc(LHND,sizeof(LOGPALETTE) + NumColors * sizeof(PALETTEENTRY));   
pLogPal = (LOGPALETTE*)LocalLock(hPal);   
pLogPal->palNumEntries = (WORD)NumColors;   
pLogPal->palVersion = 0x300;   
lpRGB = (LPRGBQUAD)((LPSTR)lpImgData + (DWORD)sizeof(BITMAPINFOHEADER));   
for(i=0 ; i<NumColors ; i++) 
{   
pLogPal->palPalEntry[i].peRed = lpRGB->rgbRed;   
pLogPal->palPalEntry[i].peGreen = lpRGB->rgbGreen;   
pLogPal->palPalEntry[i].peBlue = lpRGB->rgbBlue;   
pLogPal->palPalEntry[i].peFlags = (BYTE)0;   
lpRGB ++;   
}  
hOutPalette = CreatePalette(pLogPal);  
LocalUnlock(pLogPal);   
LocalFree(hPal);   
}   
if(hOutPalette)
{
hPrevPalette = SelectPalette(hDc,hOutPalette,FALSE);
RealizePalette(hDc);  
}   
hBitmap = CreateDIBitmap(hDc, (LPBITMAPINFOHEADER)lpImgData,(LONG)CBM_INIT,   
(LPSTR)lpImgData+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD),   
(LPBITMAPINFO)lpImgData,DIB_RGB_COLORS);   
if(hOutPalette && hPrevPalette)
{   
SelectPalette(hDc,hPrevPalette,FALSE);
RealizePalette(hDc);   
}   
*pPalette = hOutPalette;
nWidth = bi.biWidth;
nHeight = bi.biHeight;
GlobalUnlock(hImgData);   
return   hBitmap;  
}
在控件的OnDraw(ATL_DRAWINFO& di)函数中的绘制代码:
HRESULT hr;
RECT& rc = *(RECT*)di.prcBounds;
Rectangle(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom);
int width = ::GetSystemMetrics(SM_CXSCREEN);
int height = ::GetSystemMetrics(SM_CYSCREEN);
m_hMemDC = CreateCompatibleDC(di.hdcDraw);
int nWidth,nHeight;
HPALETTE hPal;
HBITMA

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 讨论一下activex方面的经典书目!
  • 有没有dataedit控件啊急啊
  • 为什么VC做的控件在VB下面会有问题啊?请高手指点,高分求教啊
  • 紧急求助:关于ActiveX控件的使用问题!!
  • ActiveX控件的属性页
  • 在ActiveX控件中使用多线程后Fire事件的问题
  • 可以在ActiveX控件下的Dialog画曲线图吗
  • activex添加的属性在ie中为何传递不成功
  • 怎么才能获得微软Activex控件的帮助信息呢
  • 如何在单文档中使用ActiveX控件那?

相关文章

  • 2017-06-04 我用ATL做COM,在ASP中用,为什么从COM返回给ASP的字符串有的时候不正确?
  • 2017-06-05 工作线程函数是类的成员函数,它能调用类的非静态成员变量吗?
  • 2017-06-04 在一个COM类中如何定义其他的COM类的对象???
  • 2017-06-04 在编写MFCACTIVEX控件中加入定时器为何无效?
  • 2017-06-04 关于引出函数
  • 2017-06-04 关于插入Flash控件的问题?
  • 2017-06-05 为什么应用程序在AMD皓龙芯片的服务器上接收数据库返回的信息出错?
  • 2017-06-04 请问怎样在activex里面取得调用该控件的网页session得值
  • 2017-06-05 GetQueuedCompletionStatus
  • 2017-06-04 怎么调试ACTIVEX控件呢?

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 用atl写的activex当用delphi/c++build调用时本来要返回HRESULT的函数却变成VOID
    • 如何得到一个进程使用Cpu的时间???
    • 请问如何调试ASP组件
    • 线程编程的问题?
    • 我是初用vc和ATL,请问在ATL里面怎么使用对话框资源阿
    • CreateProcess调用命令行程序获取输出
    • DLL中如何与调用进程通信
    • atl/comoutlooknewInspectorevent问题
    • 为什么代码不往下走了?
    • 怎么获取IE返回信息。比如访问一个URL,返回成功还是失败。

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有