分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

本系列主要讲解Windows界面编程,目前列出五篇,欢迎大家交流讨论。

1. 《Windows界面编程第一篇 位图背景与位图画刷》

2. 《Windows界面编程第二篇 半透明窗体》

3. 《Windows界面编程第三篇 异形窗体 普通版》

4. 《Windows界面编程第四篇 异形窗体 高富帅版》

5. 《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 using the specified display device context handle.

当窗口消息响应函数接收这个消息时,wParam表示对话框的设备上下方即HDC,lParam表示对话框的句柄。如果程序处理了这个消息,应返回一个画刷。系统将会用这个画刷来重绘对话框背景。

因此我们在这个WM_CTLCOLORDLG消息中得到对话框的大小,并通过StretchBlt函数将位图缩放后贴到对话框的HDC中就完成了对话框背景的设置,然后返回一个空画刷给系统,这样系统就不会将位图背景给覆盖了。

代码非常简单,要注意的是在使用StretchBlt函数缩放位图时,最好先使用

SetStretchBltMode函数来设置下位图内容伸展模式,这样可以避免缩放后位图失真严重。SetStretchBltMode函数原型如下:

int SetStretchBltMode(

HDChdc,           // handle to DC

int iStretchMode   // bitmap stretching mode

);

第一个参数就是设备上下方即HDC。

第二个参数有四种设置:

1. BLACKONWHITE or STRETCH_ANDSCANS

如果两个或多个像素得合并成一个像素,那么StretchBlt会对像素执行一个逻辑AND运算。这样的结果是只有全部的原始像素是白色时该像素才为白色,其实际意义是黑色像素控制了白色像素。这适用于白色背景中主要是黑色的单色点阵图。

2. WHITEONBLACK or STRETCH_ORSCANS

如果两个或多个像素得合并成一个像素,那么StretchBlt会对像素执行逻辑OR运算。这样的结果是只有全部的原始像素都是黑色时该像素才为黑色,也就是说由白色像素决定颜色。这适用于黑色背景中主要是白色的单色点阵图。

3. COLORONCOLOR or STRETCH_DELETESCANS

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

4. HALFTONE or STRETCH_HALFTONE

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

其它技术细节可以见代码中的注释,完整代码如下(也可以下载,下载地址为:http://download.csdn.net/download/morewindows/4947377):

// 对话框位图背景  - WM_CTLCOLORDLG中使用StretchBlt贴图//By MoreWindows-(http://blog.csdn.net/MoreWindows)#include <windows.h>#include "resource.h"const char szDlgTitle[] = "位图背景 使用StretchBlt贴图 MoreWindows-(http://blog.csdn.net/MoreWindows)";// 对话框消息处理函数BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);          int APIENTRY WinMain(HINSTANCE hInstance,                     HINSTANCE hPrevInstance,                     LPSTR     lpCmdLine,                     int       nCmdShow){ DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc); return 0;}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_INITDIALOG:  // 设置对话框标题  SetWindowText(hDlg, szDlgTitle);  // 设置对话框大小可调节  SetWindowLong(hDlg, GWL_STYLE, GetWindowLong(hDlg, GWL_STYLE) | WS_SIZEBOX);  // 加载背影图片  hBitmap = (HBITMAP)LoadImage(NULL, "005.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);  if (hBitmap == NULL)  {   MessageBox(hDlg, "LoadImage failed", "Error", MB_ICONERROR);   exit(0);  }    else  {   // 将背影图片放入HDC - 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 0; case WM_COMMAND:  switch (LOWORD(wParam))  {  case IDCANCEL:   DeleteDC(s_hdcMem);   EndDialog(hDlg, LOWORD(wParam));   return TRUE;  }  break; case WM_SIZE:  InvalidateRect(hDlg, NULL, TRUE);  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;}

运行结果如下:

在上面这种方法中,我们是在WM_CTLCOLORDLG中贴图来完成背景设置了,也可以创建一个位图画刷,然后在WM_CTLCOLORDLG消息中直接返回这个画刷,这样系统将完成贴图功能。

位图画刷的创建函数为CreatePatternBrush,其函数原型如下:

HBRUSHCreatePatternBrush(

HBITMAPhbmp   // handle to bitmap

);

只要给这个函数传入位图句柄即可,完整代码如下(下载地址为:http://download.csdn.net/download/morewindows/4947377):

// 对话框位图背景 - 直接在WM_CTLCOLORDLG中使用位图画刷//By MoreWindows-(http://blog.csdn.net/MoreWindows)#include <windows.h>#include "resource.h"const char szDlgTitle[] = "位图画刷 MoreWindows-(http://blog.csdn.net/MoreWindows)";// 对话框消息处理函数BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);int APIENTRY WinMain(HINSTANCE hInstance,      HINSTANCE hPrevInstance,      LPSTR     lpCmdLine,      int       nCmdShow){ DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc); return 0;}BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){ static HBRUSH    s_hBitmapBrush; //位图画刷 switch (message) { case WM_INITDIALOG:  // 设置对话框标题  SetWindowText(hDlg, szDlgTitle);  // 设置对话框大小可调节  SetWindowLong(hDlg, GWL_STYLE, GetWindowLong(hDlg, GWL_STYLE) | WS_SIZEBOX);  // 加载背影图片  HBITMAP hBitmap;  hBitmap = (HBITMAP)LoadImage(NULL, "005.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);  if (hBitmap == NULL)  {   MessageBox(hDlg, "LoadImage failed", "Error", MB_ICONERROR);   exit(0);  }    // 创建位图画刷  s_hBitmapBrush = CreatePatternBrush(hBitmap);  return 0; case WM_COMMAND:  switch (LOWORD(wParam))  {  case IDCANCEL:   DeleteObject(s_hBitmapBrush);   EndDialog(hDlg, LOWORD(wParam));   return TRUE;  }  break; case WM_CTLCOLORDLG:  return (BOOL)s_hBitmapBrush; } return FALSE;}

运行结果如下:

注意,这两做法在窗口大小超过位图大小时会表现不同,前一种做法会拉伸位图以适应窗口大小,后一种做法是直接平铺。详见下图:

本篇《Windows界面编程第一篇位图背景与位图画刷》主要介绍了通过WM_CTLCOLORDLG消息来设置对话框的背景,在Windows系统中还有类似于WM_CTLCOLORDLG消息的还有WM_CTLCOLORBTN,WM_CTLCOLOREDIT,WM_CTLCOLORLISTBOX,WM_CTLCOLORSCROLLBAR,WM_CTLCOLORSTATIC这五种来分别管理按钮,编辑框,列表框,滚动条,静态框。有兴趣的读者可以试验下。

下一篇将介绍调节窗体透明度的方法,欢迎继续浏览《Windows界面编程第二篇 半透明窗体》

当窗口的背景用彩色图片来装饰时,其它控件如果还是用灰色的背景会显的比较不谐调,《Windows界面编程第五篇 静态控件背景透明化》将介绍如何为静态框设置透明背景。

本文配套程序下载地址为:http://download.csdn.net/download/morewindows/4947377

转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/8451629

欢迎关注微博:http://weibo.com/MoreWindows

分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

Windows界面编程第一篇 位图背景与位图画刷相关推荐

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

    Windows界面编程第一篇 位图背景与位图画刷 可以通过WM_CTLCOLORDLG消息来设置对话框的背景,MSDN上对这个消息的说明如下: The WM_CTLCOLORDLG message i ...

  2. Windows界面编程第八篇 listbox彩色显示隔行变色

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本文配套 ...

  3. Windows界面编程_Miniblink(2) 嵌入到Win32窗口里

    这里博主不教关于Miniblink其它功能,只教对UI界面编程相关的API! 第一步如何在Win32的窗口里嵌入Miniblink? 第一步先创建一个Win32工程 第二步包含wke头文件: #inc ...

  4. windows核心编程-第一章 对程序错误的处理

    第一章-对程序错误的处理 在开始介绍Microsoft Windows 的特性之前,必须首先了解 Wi n d o w s的各个函数是如何进行错误处理的. 当调用一个Wi n d o w s函数时,它 ...

  5. Windows界面编程_Miniblink(3) 事件绑定

    Miniblink继承保留了cef里js事件回调的方法,我们可以使用miniblink里jsBindFunction函数来对html里与js脚本绑定的button或者对其标签进行js绑定. 注意使用这 ...

  6. Windows界面编程_Miniblink(6) 个人信息界面

    先看一下Demo: 按钮发光动画效果: 字体效果: 鼠标移动到字体上会有阴影缓动 使用skn皮肤+miniblink框架编写而成,结合之前的教程,可以轻易写出这样的界面 本源码基于前几篇文章,这里直接 ...

  7. 网络编程——第一篇 基础之进程线程

    在C#的网络编程中,进程和线程是必备的基础知识,同时也是一个重点,所以我们要好好的掌握一下. 一:概念 首先我们要知道什么是"进程",什么是"线程",好,查一下 ...

  8. 12篇学通C#网络编程——第一篇 基础之进程线程

    在C#的网络编程中,进程和线程是必备的基础知识,同时也是一个重点,所以我们要好好的掌握一下. 一:概念 首先我们要知道什么是"进程",什么是"线程",好,查一下 ...

  9. JavaSE-面向对象编程-第一篇

    一.类和对象 1.1 面向对象和面向过程 面向过程和面向对象都是对软件分析.设计和开发的一种思想,它指导着人们以不同的方式去分析.设计和开发软件. 早期先有面向过程思想,随着软件规模的扩大,问题的复杂 ...

最新文章

  1. 如何记录2秒内实现1800度转体+翻腾,百度智能云黑科技教你看懂跳水
  2. R语言dataframe分组数据汇总(aggregate and sum):类似于excel的sumif函数
  3. php定位和天气,基于thinkphp实现依据用户ip判断地理位置并提供对应天气信息的应用...
  4. 函数式编程语言:LISP/Scheme 小语种简介
  5. Window10环境下的Jupyter notebook安装与打开默认路径的修改
  6. Spring mvc架构
  7. Oracle创建用户、授权、规则
  8. python编程课件_Python面向对象程序设计ppt课件.ppt
  9. 实战演习(九)——用python分析科比生涯数据
  10. 工艺过程卡片,工序卡片,工艺卡,刀具卡区别
  11. 电驴服务器图标显示叉叉,2012年6月最新电驴服务器列表及设置方法
  12. 一款可以精准爬取网站的网络数据采集系统
  13. Linux系统无法在spyder5中输入中文的解决办法
  14. c语言 统计数量用count_C语言中count是什么意思?
  15. 关于nn.ReLU(inplace=True)和nn.ReLU(inplace=False)的区别
  16. TypeError: object of type ‘type‘ has no len()
  17. python用matplotlib画球_Python 用matplotlib画以时间日期为x轴的图像
  18. 城域网的互联网专线接入带宽合规合法
  19. 【Java】spring.profiles.active无效
  20. we用的java插件_WebStorm weex插件报错

热门文章

  1. 越狱Season 1-Episode 6: Riots, Drills and the Devil: Part 1
  2. 记一次MacBook Pro无法连接wifi网络修复
  3. Missing authorization: Pur. Order Create Purch. Group 001
  4. 未来实验A/B测的统计学原理
  5. 使用 JavaScript 进行HTML表格排序
  6. 荣耀8 android8.0 2018,荣耀手机EMUI8.0+ Android8.0最新适配计划
  7. 今年全网活跃得高危漏洞跟踪记录表
  8. chrome无法添加插件解决办法
  9. 《士兵突击》十人十色
  10. Win10环境下paddlepaddle安装踩坑实录