用c语言编个程序,我想用 BitBlt 加载掩码图和位图实现,让活动的人物背景透明。

作者&投稿:泣睿 (若有异议请与网页底部的电邮联系)
ps制作背景透明的位图,之后怎么用vc处理啊,比如直接Bitblt到另一幅图片上,而且透明部分不会覆盖原先的图片?~

Bitblt中dwRop光栅操作可以实现很多颜色组合效果,不过如果想非透明部分完全覆盖。。。自己写一个吧,也不是太复杂,
BitBlt1:建立一个透明颜色值,如果源颜色RGB为该数值,则使用目标图颜色,否则使用源图,

////////////////crColour是位图中的透明色/////////
void CChessView::DrawTransparent(CDC * pDC, int x, int y, COLORREF crColour)
{
COLORREF crOldBack,crOldText;
CDC dcImage,dcMask;
CBitmap bmp;
crOldBack=pDC->SetBkColor(RGB(255,255,255));//RGB(0,0,0) 隐形色
crOldText=pDC->SetTextColor(RGB(0,0,0));//RGB(255,255,255)
//IDB_BITMAP4为待显示的位图
BITMAP bm;
bmp.GetBitmap(&bm);
int nWidth=bm.bmWidth,nHeight=bm.bmHeight;
//为图象及mask各创建一个DC
dcImage.CreateCompatibleDC(pDC);
dcMask.CreateCompatibleDC(pDC);
//把图象装入imageDC
CBitmap *pOldBitmapImage=dcImage.SelectObject(&bmp);
//为“掩码”位图创建一个单色bitmap
CBitmap bitmapMask;
bitmapMask.CreateBitmap(nWidth,nHeight,1,1,NULL);//把mask位图装入maskDC
CBitmap *pOldBitmapMask=dcMask.SelectObject(&bitmapMask);//用透明色创建“掩码”位图
dcImage.SetBkColor(crColour);//crColour是位图中的透明色
dcMask.BitBlt(0,0,nWidth,nHeight,&dcImage,0,0,SRCCOPY);//分3步进行实际的绘制
pDC->BitBlt(x,y,nWidth,nHeight,&dcImage,0,0,SRCINVERT);
pDC->BitBlt(x,y,nWidth,nHeight,&dcMask,0,0,SRCAND);
pDC->BitBlt(x,y,nWidth,nHeight,&dcImage,0,0,SRCINVERT);//恢复原先设置
dcImage.SelectObject(pOldBitmapImage);
dcImage.SelectObject(pOldBitmapMask);
pDC->SetBkColor(crOldBack);
pDC->SetTextColor(crOldText);
}
//直接调用这个函数,CDC * pDC,我就不多介绍了,int x,int y是该位图的坐标,crColour是位图中的透明色。

可以试试TransparentBlt 函数。
BOOL TransparentBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int hHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, UINT crTransparent);
crTransparent:源位图中的RGB值当作透明颜色。
比如:人物图片底色是黑色,用TransparentBlt函数blt图片,参数crTransparent设为黑色RGB(0,0,0),就能完成透明拷贝。

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc,hdcMem ;
PAINTSTRUCT ps ;
RECT rect ;
HINSTANCE hInstance;
static HBITMAP hBitmap;
BITMAP bitmap;
static int cxSource,cySource;
static int cxChar,cyChar;
switch (message)
{
case WM_CREATE:
hInstance=((LPCREATESTRUCT)lParam)->hInstance;

hBitmap=LoadBitmap(hInstance,MAKEINTRESOURCE(这里写位图的id));
GetObject(hBitmap,sizeof(BITMAP),&bitmap);
cxSource=bitmap.bmWidth;
cySource=bitmap.bmHeight;

return 0;

case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
hdcMem=CreateCompatibleDC(hdc);
SelectObject(hdcMem,hBitmap);
BitBlt(hdc,0,0,cxSource,cySource,hdcMem,0,0,SRCCOPY);
DeleteDC(hdcMem);
EndPaint (hwnd, &ps) ;
return 0 ;

case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
上面代码替换窗口程序的处理函数就能运行


用C语言编一个计算圆周率的程序,用户输入指定位数,并计算到指定位数(精 ...
include "stdio.h"include <stdlib.h> include <string.h> int main(int argc,char *argv[]){ int a,b,c,d,e,f[2801],g,i,n;char pi[801]="",t[5]="";for(a=10000,b=0,c=2800;b-c;f[b++]=2000);\/\/a\/5 for(i=e=0;d=0,g=c*2;c-=14,e=d%a){ for(b=c;...

C语言高手来一下帮我编个小程序
int main(){ char *str , *ch , *c[] = {"个位为:" , "十位为:" , "百位为:" , "千位为:" , "万位为:"};scanf("%s",str);int i = 0 ;\/\/要求1.求出它是几位数 printf("此数为%d位数\\n",(sizeof(str)-1)) ;\/\/因为sizeof连最后一个结尾符都要算,所以这里我减去...

C语言:编写一个程序用冒泡排序实现升序排列
程序如下:include <stdio.h> int main (){ int a[10];int i, j, t;printf ("请输入十个数:\\n");for (i = 0; i < 10; i++){ printf ("a[%d]=", i+1);scanf ("%d",&a[i]);} for (j = 0;j < 9; j++)for (i = 0; i < 9 - j; i++)if (a[i] > ...

C语言 编一个程序,找到二十个数中两个最大和两个最小的数
include <stdio.h>int main(void){int i,max1,max2,min1,min2,sz[20]={39,22,82,32,48,29,-88,20,18,42,52,-17,63,12,77,68,-93,73,16,19};printf(" 整数类型数组的20个数据如下:\\n");for(i=0;i<20;i++)printf(" %d",sz[i]);min1=sz[0];for(i=1;i<20;i...

C语言程序 用结构体编写一个程序,实现输入两个数,求出平均数
include<stdio.h>typedef struct stt{ float num;}STT;int main( ){ STT stt1,stt2; scanf("%f%f",&stt1.num,&stt2.num); printf("平均值:%f\\n",(stt1.num+stt2.num)\/2); return 0;}

用C语言编写程序,完成以下功能: (1) 有5个学生,每个学生的数据包括学号...
include <stdio.h> define STUDENT 2 typedef struct tagSTU { char name[11] ;char stunum[11] ;float score1,score2,score3 ;float total,aver ;} STU;void input(STU *stu, int num) \/\/stu为学生数组的首地址,num为数组长度 { int i ;printf("请输入%d个学生的基本情况: \\n",num...

帮我编写一个C语言的程序
我将平均值存在学生信息后面的 include<stdio.h> include<stdlib.h> struct student { char name[10];char number[10];float English_Score;float Math_Score;float C_Score;float Sport_Score;float Average;}stu[10];int main(){ int i;FILE *fp;for(i=0;i<10;i++){ \/\/输入数据 scanf...

我用c语言编了一个程序,问题和我的方案如图,但是按回车却什么都不输出...
我的 我用c语言编了一个程序,问题和我的方案如图,但是按回车却什么都不输出,这是为什么啊,请问哪里错了啊  我来答 1个回答 #热议# 你觉得同居会更容易让感情变淡吗?第一碗羊杂割 2015-11-10 · TA获得超过6094个赞 知道大有可为答主 回答量:1092 采纳率:80% 帮助的人:856万 我也去答题...

用C语言编写程序,输入任意一个十进制的三位数,将它分别转化为五进制...
static char *FIFTNARY = "0123456789ABCDE";static char buff[10];char *toQuinary(int num);char *toOctonary(int num);char *toFifnary(int num);char *reverse(char *str);int main(void){ int flag = 1;int num = 0;int choice = 0;while(flag){ printf("请输入一个三位数:");...

我是一名C语言初学者,请各位大虾帮帮忙,用C语言编写一个程序,求1+2+...
include<stdio.h> void main(){ int i,sum=0;for(i=1;i<=100;i++){ sum+=i;} printf("%d\\n",sum);}

广阳区18677472437: 用c语言编个程序,我想用 BitBlt 加载掩码图和位图实现,让活动的人物背景透明. -
宁毓喜典: 可以试试TransparentBlt 函数. BOOL TransparentBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int hHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, UINT crTransparent); ...

广阳区18677472437: 用C语言编写一个有关字符串的程序程序 -
宁毓喜典: #include <iostream>#include <fstream>#include <cstring>#include <iomanip> using namespace std; int CountFrequency(const char *Input,const char *Output,double *Frequency){char ch=0; int Set[26],count(0),i=0; memset(Set,0,26*sizeof(int)); ...

广阳区18677472437: 用C语言编写的代码程序( B ) A)可立即执行 B)是一个源程序 C)经过编译即可执行 D) -
宁毓喜典: C语言写的代码程序肯定是源程序,B是对的,它不能立即执行,必须经过编译成可执行代码, 所以A是错误的; 如果这个源程序中不含有main函数,编译后的代码也是不可执行的,所以C是错误的; C语言不是解释执行的,D也不正确. 扩展资料: A 源程序被编译之后叫做B 编译程序 写源代码的过程叫D编辑程序被编译之后组成的可执行的程序集叫C可执行程序 c语言是高级语言,写出来的程序是源程序,需用相应的编译程序将其翻译成机器语言的目标程序,再把目标程序和各种标准库函数连接装配成一个完整的可执行机器语言,然后才能执行. 参考资料:C语言 百度百科

广阳区18677472437: 用C语言编程实现一个简单的四则运算计算器 -
宁毓喜典: 用一个数组a作为存储数字的栈,另一个b作为存储操作符的栈,弹出一个操作符即弹出对应的两个数字进行运算,然后将运算结果压回a,直到a中只有一个元素,这个元素即为最后的结果.

广阳区18677472437: 用c语言编写程序输出图形 -
宁毓喜典: int main() {int q,w,e=1,r,c=0,k=1;char o='*',p=' ';for(r=0;r<5;r++) /*循环4行输出*/{for(q=4;q>0;q--)printf("%c",p);for(w=0;w printf("%c",o);e++;printf("\n");}for(q=0;q<10;q++) //输出整行*printf("%c",o);printf("\n");for(r=0;r<5...

广阳区18677472437: 用C语言写远程控制软件 -
宁毓喜典: 你想用c语言写 一般用可视化工具写 首先需要截屏,可以用bitblt函数 通过网络传送 然后客户端显示 如果要进行远程控制,一般需要用到两个函数 keybd_event函数模拟键盘消息 mouse_event函数模拟鼠标消息 当然具体函数用法可以查看MSDN

广阳区18677472437: 如何用codeblocks编写c语言? -
宁毓喜典: 1、打开软件,选择右上角file->project,之所以此处选择project,是因为一个完整的程序一般均有多种源文件组成,例如代码,说明文档,其他外链资源等,因此新建一个project是最常用的选择.2、进入项目类型选择界面,此处我们选择控制台...

广阳区18677472437: 用c语言编写一个简单的程序
宁毓喜典: main() {int a,b,i;bool flag = true;for (i = 0; i < 6; i++) {scanf("%d", &a);if (flag) {b = a;flag = false;}else {if (b > a)b = a;}}prinf("%d", b); } 这个代码是直接写上去的,楼主自己编译一下看看

广阳区18677472437: 如何用C语言编写程序实现哥德巴赫猜想 -
宁毓喜典: #include#include int is(int x) //判断一个数是否为素数,是素数返回1,否则返回0 { int n; n=sqrt(x); for(int i=2;i { if(x%i==0) return 0; } return 1; } int main() { int num1,num2; int s; for(int i=1000;i { num1=2; s=i/2; while(num1 { if(is(num1)) //如果第一个数...

广阳区18677472437: 如何用C语言编程求均值 -
宁毓喜典: 建一个结构体链表: typedef struct{ int Time;//时间:时分秒 int Num;//个数 double Sum;//总和 }*pData;每次文件读取四行,然后, 时*60*60+分*60+秒,对比链表中的Time数据, 如果相等,则 Num++;Sum+=第四行数据; 如果不等,则 新建链表项目,赋值Time;赋值Num=1;赋值Sum=第四行数据; 这样,根据链表依次输出 Sum/(double)Num就可以了,这个就是平均值.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网