注册 登录
编程论坛 VC++/MFC

问个关于HDC的问题。

小赵q1 发布于 2012-12-23 18:48, 586 次点击
在写程序中有个地方理解不透。
HDC xiaoDC,DAODC[5],DAODC,DAOdc;  //全局变量
int i;  //全局变量
xiaoDC=GetDC(hwnd);  //创建兼容DC
myhdc = CreateCompatibleDC(xiaoDC);  //加载窗口显示内容。
for(i=0;i<5;i++)
DAODC[i]=CreateCompatibleDC(NULL);  //创建5个与指定设备兼容的内存设备上下文环境
i=0;  //初始化后面用。
DAODCCreateCompatibleDC(NULL);
DAOdc=CreateCompatibleDC(NULL);  
ReleaseDC(hwnd,xiaoDC); //释放分配的资源
LRESULT CALLBACK zhaofeng(HWND hwnd, UINT uMsg, WPARAM wParam,LPARAM lParam)  //进入消息的各种处理中。
{

   switch(uMsg)
   {
      case kaishi:   //点击开始按钮
      {
         if(biaoji==1)   //如果进入了指定的状态
           {
             DeleteDC(DAODC[i]);    //清除前一个HDC。
             i++;   //启用下一个HDC;
            
DAODC=DAOdc;
            }
          biaoji=0;   //清除进入指定的状态的标记
          SetTimer(hwnd, 1, sudu, NULL);  //启用定时器。
      } break;
      case TIMER:
      {
          if(biaoji==0)
            {
              经过N多过程后;
                biaoji==1;   //进入指定状态。
                SetTimer(hwnd, 7, sudu-350, NULL);  //又进入一个定时器
             }
          if(biaoji==1)
            {
              SelectObject(DAODC[i]DAODC,HUIDONG[tupian]);  //加载图片到DAODC[i]
              tupian++;
              InvalidateRect(hwnd,NULL,FALSE);
             }
       } break;
       case PAINT:
       {
         hdc = BeginPaint(hwnd,&ps);
         TransparentBlt(hdc,baibeiX,baibeiY, donghua.bmWidth,donghua.bmHeight,
                          DAODC[i]DAODC,0,0,donghua.bmWidth,donghua.bmHeight,RGB(0,0,0));
       } break;
如果只用蓝色的部分能达到我实现的效果,为什么把蓝色的部分都替换成红色的部分,就不能达到我要的效果呢?他们两个效果不一样吗?这是为什么,求解

[ 本帖最后由 小赵q1 于 2012-12-24 22:20 编辑 ]
8 回复
#2
小赵q12012-12-23 18:54
用蓝色的部分是为5个HDC变量赋值,
后面用一个后再到需要用到的地方就删除这个HDC,接着用下一个HDC,
但是如果把删除HDC那里把前面赋值过的一个HDC变量的值赋给原来的HDC,却不能达到我要的效果呢?就好比把HDC[1]的值赋给了用过的HDC[0],难道HDC的赋值不是这样用的?
#3
信箱有效2012-12-23 19:53
据说VC6下面 switch和case语句里面初始化和赋值都容易出问题
#4
小赵q12012-12-23 23:14
回复 3楼 信箱有效
以前倒是没有遇到过这样的情况,就在这个程序里出问题了,别的int类型的赋值也没见出现什么问题,倒是这里的HDC类型的出问题了,我还以为HDC类型的不可以这样赋值呢。
#5
yuccn2012-12-24 12:15
代码逻辑有错误,,switch 的每个case 都应该加个break;不然下面的每个case 都进入一遍了
#6
小赵q12012-12-24 22:19
回复 5楼 yuccn
呵呵,纯属失误,我只是把我的代码简化了一下,关键的地方写出来了,除了这个有什么方法可以解决这个问题吗?为什么重新赋值为另一个变量的值的效果和直接用另一个变量的效果不一样呢?
#7
小赵q12012-12-26 00:52
唉,原代码里确实忘了加break了,不过也只有在TIMER后面没有加,别的地方都加了,加上了break后,仍然是原来的问题,看来不是这个原因导致了这样的结果,朋友们还有别的好办法了吗?
白天还要上班,用手机回复不方便,只好在晚上来回复了,回复的慢了不好意思哦。
#8
小赵q12012-12-27 12:18
没有人能帮忙解决了吗?只好用HDC数组了,唉
#9
yuccn2012-12-27 12:26
回复 8楼 小赵q1
你以为你这样写 人家知道你想说什么吗?
你想要什么效果,不是你想要效果又是怎么样?

况且 你说的下面的这一块,红色和蓝色等价吗?一个deletedc; 另一个是赋值。本来就是两个不等价的事件

DeleteDC(DAODC[i]);    //清除前一个HDC。
              i++;   //启用下一个HDC;

              DAODC=DAOdc;

1