位图背景与位图画刷

  通过WM_CTLCOLORDLG消息设置对话框的背景,当窗口过程接收消息时,wParam表示对话框的设备上下文,即HDC,lParam表示对话框的句柄。

  思路:在WM_CTLCOLORDLG消息中获得对话框的大小,通过StretchBlt将位图贴到对话框的HDC中,完成对画框的背景设置,最后返回一个空画刷给系统。

  注意:使用StretchBlt缩放位图时,先使用SetStretchBltMode设置内容伸展模式,避免缩放后ude位图失真。

  函数:

int SetStretchBltMode (
    HDC  hdc;             //handle to DC
    int  iStretchMode;    //bitmap stretching mode
);

  iStretchMode参数:

  1.BLACKONWHITE or STRETCH_ANDSCANS

  如果两个或多个像素要合并成一个像素,那么StretchBlt会对像素执行逻辑AND运算。结果是只有全部像素都是白色时该像素才是白色。适用于白色背景中主要是黑色的单色点阵图。

  2.WHITEONBLACK or STRETCH_ORSCANS

  如果两个或多个像素要合并成一个像素,那么StretchBlt会对像素执行逻辑or运算。结果是只有全部像素都是黑色时该像素才是黑色。适用于黑色背景中主要是白色的单色点阵图。

  3.COLORONCOLOR or STRETCH_DELETESCANS

  简单地消除像素行或列,通常是处理彩色点阵图的最佳方法。

  4.HALTONE or STRETCH_HALFTONE

  根据组合起来的来源颜色计算目的的平均色。

完整代码:

 1 //main.cpp
 2 #include <windows.h>
 3 #include <tchar.h>
 4 #include "resource.h"
 5
 6 BOOL CALLBACK DlgProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam);
 7
 8 int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
 9 {
10             DialogBox(hInstance,MAKEINTRESOURCE(DLG_MAIN),NULL,DlgProc);
11 return 0;
12 }
13
14 BOOL CALLBACK DlgProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
15 {
16     RECT    rcDialog;
17     HBITMAP    hBitmap;
18     static    BITMAP    bm;
19     static    HDC    sthDC;
20
21     switch(uMsg)
22 {
23     case WM_INITDIALOG:
24        hBitmap=(HBITMAP)LoadImage(NULL,_T("bg.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
25        HDC hdc;
26        hdc=GetDC(hwndDlg);
27        bm=CreateCompatibleDC(hdc);
28     SelectObject(bm,hBitmap);
29     ReleaseDC(hDlg,hdc);
30     GetObject(hBitmap,sizeof(bm),&bm);
31       return TRUE;    case WM_CTLCOLORDLG:      GetClientRect(hwndDlg,&rcDialog);      SetStretchBltMode((HDC)wParam,COLORONCOLOR);      StretchBlt((HDC)wParam,0,0,,rcDialog.right,rcDialog.bottom,sthDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);      return (BOOL)((HBRUSH)GetStockObject(NULL_BRUSH));
32 }
时间: 2024-10-18 15:12:47

位图背景与位图画刷的相关文章

1.位图背景与位图画刷

1.WM_CTLCOLORDLG消息 在对话框画出来之前,系统将该消息发给对话框窗口.通过WM_CTLCOLORDLG消息来设置对话框文本和背景. 当窗口处理函数处理这个消息时,wParam表示对话框设备上下文(HDC),lParam表示对话框句柄. 如果处理了这个消息,返回一个画刷,系统用这个画刷重绘对话框背景. 因此,在WM_CTLCOLORDLG消息中获得对话框的大小,通过StretchBlt函数将位图缩放后放到对话框中,就完成了背景设置. 并且,要返回一个空画刷给系统,系统才不会将位图背

位图背景透明与设置位图透明度

位图怎么像PNG图片背景透明呢? 关键在于对单色位图的使用,单色位图,黑色表示前景颜色(可代表任意),白色代表图片背景颜色 实现API :Transparentblt来理解单色位图 函数原型:BOOL TransparentBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int hHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nW

BMP位图之1位位图(一)

起始结构 typedef struct tagBITMAPFILEHEADER { WORD bfType; //类型名,字符串"BM", DWORD bfSize; //文件大小 WORD bfReserved1; //保留字 WORD bfReserved2; //保留字 DWORD bfOffBits; //实际位图数据的偏移字节数,即前三个部分长度之和 } BITMAPFILEHEADER; 对应数据 WORD bfType : 0x4d42 DWORD bfSize:0x16

BMP位图之4位位图(二)

起始结构 typedef struct tagBITMAPFILEHEADER { WORD bfType; //类型名,字符串"BM", DWORD bfSize; //文件大小 WORD bfReserved1; //保留字 WORD bfReserved2; //保留字 DWORD bfOffBits; //实际位图数据的偏移字节数,即前三个部分长度之和 } BITMAPFILEHEADER; 对应数据 WORD bfType : 0x4d42 DWORD bfSize:0x5b

VC++ 将资源位图画到窗口上去的方法

第一种方法最简单:直接看代码 CImage img; img.LoadFromResource(AfxGetInstanceHandle(), IDB_BITMAP1); img.Draw(*pDc, 0,0); 在这段代码中:使用了 LoadFromResource 函数来加载位图. 也可使用 img.Load(_T("res\\1.bmp")); 这个办法可以加载来自文件的位图. 第二种方法: 待述

Windows界面编程-背景图片、透明特效使用

Windows界面编程第一篇 位图背景与位图画刷 可以通过WM_CTLCOLORDLG消息来设置对话框的背景,MSDN上对这个消息的说明如下: The WM_CTLCOLORDLG message is sent to a dialog box before the system draws the dialog box. By responding to this message, the dialog box can set its text and background colors us

Windows界面编程第五篇 静态控件背景透明化

上一篇<Windows界面编程第三篇 异形窗体 普通版>和<Windows界面编程第四篇异形窗体 高富帅版>介绍了异形窗口(异形窗体)的创建,并总结出了异形窗口的"三要素": 1.WS_EX_LAYERED属性 2.指定透明色 3.以位图为窗口背景 本篇文章将主要介绍Windows编程中如何实现静态控件背景的透明化,这将进一步的美化界面.下面先看一张没有做静态控件背景透明化的对话框程序的运行画面,对话框的彩色图片背景可以参考<Windows界面编程第一篇位

[收藏夹整理]VC部分

c++多线程(一) C++11 多线程 鸡啄米:C++编程入门系列之十二(类与对象:面向对象设计的基本思想和特点) 鸡啄米:C++编程入门系列之二十一(C++程序设计必知:类的静态成员) [笔记]VS2010 LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 的解决方法 VC++/MFC程序图标更改方法以及修改程序标题 超级简单啦 MFC:Tab Control 控件的使用 给VS2008/VS2010 MFC项目添加启动画面 VC程序中Windows XP风格程序界面的实现 MF

Windows界面编程第四篇 异形窗体(转)

原文转自 http://blog.csdn.net/morewindows/article/details/8451638 上一篇<Windows界面编程第三篇 异形窗体 普通版>介绍了异形窗口(异形窗体)的创建,其主要步骤为--先通过创建位图画刷来做窗口的背景画刷,再通过SetWindowLong为窗体加上WS_EX_LAYERED属性,然后使用SetLayeredWindowAttributes指定窗口的透明色来完成窗口形状的调整.并且为了使异形窗口支持鼠标的拖曳,在WM_LBUTTOND