注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

deisp的博客

 
 
 

日志

 
 

MiniGUI 1.6.2 开源版实现半透明窗口 - sacrrot的专栏 - CSDNBlog  

2008-09-11 13:14:33|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 | 

  半透明对话框的原理其实很简单,但实现起来就不那么简单了。要使对话框具有半透明效果,就要在对话框显示在屏幕上之前,将对话框所在的那部分区域的背景图像保存下来。具体的说就是将显示设备环境中那一部分的图像以位图的形式拷贝到内存设备环境中。随后在内存设备环境中对该位图中每个点的亮度进行处理。处理完毕后再将该位图拷贝回显示设备环境中,即绘制到对话框表面。这样显示在屏幕上的对话框就呈现出了半透明的效果。在这一过程中,因为多次涉及到对不同的设备环境进行操作,因而略显得复杂一些。具体由以下几个主要步骤构成。
  1.  用InitBitmap创建一个与当前显示设备环境相兼容的位图对象



  5.   删除掉选入到内存设备环境中的位图对象以及设备环境对象

#include <stdio.h><stdlib.h><minigui/common.h><minigui/minigui.h><minigui/gdi.h><minigui/window.h><minigui/control.h>externvoid InitDialogBox(HWND hWnd, PBITMAP pBkgnd);

staticstaticint childDlgCreate =0static BOOL GetBitmapFromDC(HDC hdc, int x, int y, int w, int h, PBITMAP pBmp, float trans, intintintif(!if(InitBitmap(hdc, w, h, 0, NULL, pBmp) ==returnfor(i =0; i<h; i++for(j=0; j<w; j+++j, y+i, &r, &g, &*=*=*== RGB2Pixel(hdc, r, g, b);
            SetPixelInBitmap(pBmp, j, i, pixel);
        }returnstatic DLGTEMPLATE DlgBoxInputLen =0, 0, 620, 420"Please input the length"0, 010#define IDC_SIZE_MM     100
#define IDC_SIZE_INCH   110static CTRLDATA CtrlInputLen [] =|400, 10, 200, 18"Please input the length(Unit:mm)"0#endifstaticstaticint cnt =0=0staticint InputLenDialogBoxProc (HWND hDlg, int message, WPARAM wParam, LPARAM lParam)
char str[256switch (message) case MSG_INITDIALOG:

        SetWindowAdditionalData (hDlg, lParam);
        SendDlgItemMessage (hDlg, IDC_SIZE_MM, EM_LIMITTEXT, 15, 0);
        SetNotificationCallback (GetDlgItem (hDlg, IDC_SIZE_MM), my_notif_proc);
        SetTimer(hDlg, 101, 100return1case= GetClientDC(hDlg);
                sprintf(str, "MSG_TIMER:%d-%d-%d", cnt, cnt+1, cnt+2if(!childDlgCreate)
                    TextOut(hdc, 150, 180if{
                    ShowWindow(hChildDlg, SW_HIDE);
                    ShowWindow(hDlg, SW_SHOW);
                    TextOut(hdc, 150, 180, str);
                    GetBitmapFromDC(hdc, 120, 150, 400, 130, &bmp, 0.9, 1);
                    ShowWindow(hChildDlg, SW_SHOW); 
                }++return0case=const RECT* clip = (const RECT*=if (hdc ==0) = GetClientDC (hDlg);
                fGetDC =if (clip) =*clip;
                ScreenToClient (hDlg, &rcTemp.left, &rcTemp.top);
                ScreenToClient (hDlg, &rcTemp.right, &rcTemp.bottom);
                IncludeClipRect (hdc, &0, 0, 0, 0, &ifreturn0case MSG_CLOSE:
                KillTimer(hDlg, 101breakcaseswitch (wParam) case= GetClientDC(hDlg);
            GetBitmapFromDC(hdc, 120, 150, 400, 130, &bmp, 0.9, 0);
            ReleaseDC(hdc);    
            childDlgCreate =1&=0breakcase IDCANCEL:
                        UnloadBitmap(&bmp);
            EndDialog (hDlg, wParam);
breakbreakreturn DefaultDialogProc (hDlg, message, wParam, lParam);
}staticint InputLenDialogBox (HWND hWnd, double*=return DialogBoxIndirectParam (&DlgBoxInputLen, hWnd, InputLenDialogBoxProc, (LPARAM)length);
}int MiniGUIMain (int argc, constchar*double0, 0, 1024, 768#endifif (LoadBitmap (HDC_SCREEN, &bmp_bkgnd, "bkgnd.jpg"return1if (InputLenDialogBox (HWND_DESKTOP, &length) =="The length is %.5f mm. "&return0<minigui/dti.c>
#endif

透明显示的对话框代码:

#include <stdio.h><minigui/common.h><minigui/minigui.h><minigui/gdi.h><minigui/window.h><minigui/control.h>static DLGTEMPLATE DlgInitProgress =//WS_EX_NONE,
120, 150, 400, 130"VAM-CNC 正在初始化"#else"TestDlg"#endif0, 020#define IDC_PROMPTINFO    100
#define IDC_PROGRESS      110static CTRLDATA CtrlInitProgress [] ="static"|10, 10, 380, 16"正在..."#else"Initializing..."#endif0"button"| WS_VISIBLE |170, 70, 60, 25"OK"0externstaticint InitDialogBoxProc (HWND hDlg, int message, WPARAM wParam, LPARAM lParam)
switch (message) case MSG_INITDIALOG:
                hChildDlg =return1case= BeginPaint(hDlg);
                pBkgnd = (PBITMAP)GetWindowAdditionalData(hDlg);
                GetClientRect(hDlg, &rc);
                FillBoxWithBitmap(hdc, 0, 0, RECTW(rc), RECTH(rc), pBkgnd);
                EndPaint(hDlg, hdc);
return0caseswitch (wParam) casecase IDCANCEL:
            EndDialog (hDlg, wParam);
breakbreakcase MSG_CLOSE:
        EndDialog (hDlg, IDCANCEL);
breakreturn DefaultDialogProc (hDlg, message, wParam, lParam);
}void InitDialogBox (HWND hWnd, PBITMAP pBkgnd)
= CtrlInitProgress;
        DlgInitProgress.dwAddData = (DWORD)pBkgnd;

    DialogBoxIndirectParam (&DlgInitProgress, hWnd, InitDialogBoxProc, 0L

注:在1.3和增值版中可以用库里的GetBitmapFromDC函数。

上面的例子可以看到背景在变化,但有闪烁,继续研究。

 | 
评论:没有评论。
发表评论请输入评论





引文来源  MiniGUI 1.6.2 开源版实现半透明窗口 - sacrrot的专栏 - CSDNBlog
  评论这张
 
阅读(1214)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017