1.位图背景与位图画刷

1.WM_CTLCOLORDLG消息

  在对话框画出来之前,系统将该消息发给对话框窗口。通过WM_CTLCOLORDLG消息来设置对话框文本和背景。

  当窗口处理函数处理这个消息时,wParam表示对话框设备上下文(HDC),lParam表示对话框句柄。

  如果处理了这个消息,返回一个画刷,系统用这个画刷重绘对话框背景。  

  因此,在WM_CTLCOLORDLG消息中获得对话框的大小,通过StretchBlt函数将位图缩放后放到对话框中,就完成了背景设置。

  并且,要返回一个空画刷给系统,系统才不会将位图背景覆盖。

  在使用StretchBlt函数前,最好先用SetStretchBltMode函数来设置位图内容伸展模式,避免位图缩放后失真严重。

  int  SetStretchBltMode( HDC  hdc, int  iStretchMode);

  伸展模式:

  BLACKONWHITE / STRETCH_ANDSCANS

    如果两个或多个像素得合成一个像素,那么StretchBlt会对像素执行一个逻辑and运算。只有全部的原始像素是白色时,该像素

    才是白色,其实际意义是黑色像素控制了白色像素,适用于白色背景中是黑色的单色点阵图。

  WHITEONBLACK / STRETCH_ORSCANS

    如果两个或多个像素得合成一个像素,那么StretchBlt会对像素执行一个逻辑or运算。只有全部的原始像素是黑色时,该像素才

    是黑色,也就是说白色像素决定颜色,适用于黑色背景中白色的单色点阵图。

  COLORONCOLOR / STRETCH_DELETESCANS

    简单地消除图素行或列,而没有任何逻辑组合。通常是处理彩色点阵图的最佳方法。

  HALFONE / STRTCH_HALFONE

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

CONST WCHAR szDlgTitle[] = L"位图背景";

BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
  RECT       rcDialog;
  HBITMAP    hBitmap;
  static BITMAP s_bm;
  static HDC    s_hdcMem;
  switch (message)
  {
  case WM_SIZE:
    InvalidateRect(hDlg, NULL, TRUE);
    return TRUE;

  case WM_COMMAND:
    switch (LOWORD(wParam))
    {
    case IDCANCEL:
      DeleteDC(s_hdcMem);
      EndDialog(hDlg, LOWORD(wParam));
      return TRUE;
    }
    break;

  case WM_INITDIALOG:
    SetWindowText(hDlg, szDlgTitle);
    SetWindowLong(hDlg, GWL_STYLE, GetWindowLong(hDlg, GWL_STYLE) | WS_SIZEBOX);
    //加载背影图片
    hBitmap = (HBITMAP)LoadImage(NULL, L"mn.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
    if (hBitmap == NULL)
    {
      MessageBox(hDlg, L"LoadImage failed", L"Error", MB_ICONERROR);
      exit(0);
    }
    //将背影图片放入s_hdcMem
    HDC hdc;
    hdc = GetDC(hDlg);
    s_hdcMem = CreateCompatibleDC(hdc);
    SelectObject(s_hdcMem, hBitmap);
    ReleaseDC(hDlg, hdc);
    //得到位图信息
    GetObject(hBitmap, sizeof(s_bm), &s_bm);
    return TRUE;

  case WM_CTLCOLORDLG:
    GetClientRect(hDlg, &rcDialog);
    //通过SetStretchBltMode的设置能使StretchBlt在缩放图像更加清晰
    SetStretchBltMode((HDC)wParam, COLORONCOLOR);
    StretchBlt((HDC)wParam, 0, 0, rcDialog.right, rcDialog.bottom, s_hdcMem, 0, 0, s_bm.bmWidth, s_bm.bmHeight, SRCCOPY);
    return (BOOL)((HBRUSH)GetStockObject(NULL_BRUSH));
  }
  return FALSE;
}

int APIENTRY _tWinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPTSTR    lpCmdLine,
                       int       nCmdShow)
{
  DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
  return 0;
}

  

时间: 2024-10-10 19:13:48

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

位图背景与位图画刷

通过WM_CTLCOLORDLG消息设置对话框的背景,当窗口过程接收消息时,wParam表示对话框的设备上下文,即HDC,lParam表示对话框的句柄. 思路:在WM_CTLCOLORDLG消息中获得对话框的大小,通过StretchBlt将位图贴到对话框的HDC中,完成对画框的背景设置,最后返回一个空画刷给系统. 注意:使用StretchBlt缩放位图时,先使用SetStretchBltMode设置内容伸展模式,避免缩放后ude位图失真. 函数: int SetStretchBltMode (

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

位图怎么像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