Windows界面编程(1) 位图背景与位图画刷

可以通过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;
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索对话框
, 函数
, 位图
, 像素
, 消息
, 背景
NULL位图
位图画刷、windows界面编程、windows图形界面编程、windows 界面编程 qt、windows位图,以便于您获取更多的相关知识。

时间: 2025-01-19 03:33:54

Windows界面编程(1) 位图背景与位图画刷的相关文章

Windows界面编程(2) 半透明窗体

上一篇<Windows界面编程第一篇 位图背景与位图画刷>介绍了通过WM_CTLCOLORDLG消息来来设置对话框的背景以及位图画刷的使用.本篇将介绍动态调节窗体透明度的方法. 调节窗体透明度可以先使用SetWindowLong为窗体加上WS_EX_LAYERED属性,再使用来SetLayeredWindowAttributes指定窗体的透明度.这样就可以在程序运行时动态的调节窗体的透明度了. 下面先介绍下SetWindowLong和SetLayeredWindowAttributes函数.

Windows界面编程第七篇 文件拖拽(文件拖放)

本文配套程序下载地址为:http://download.csdn.net/detail/morewindows/5128654 转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/8634451 欢迎关注微博:http://weibo.com/MoreWindows   前面已经有六篇文章介绍了Windows界面编程,目录如下: 1. <Windows界面编程第一篇位图背景与位图画刷> 2. <Windows界面编程

小白问一下关于c++的windows界面编程的问题

问题描述 小白问一下关于c++的windows界面编程的问题 本人刚刚开始自学windows界面编程,用的编译器是vs2012.问了同学决定从winform入手,但是刚开始就被这些头文件啊源文件啊什么的给搞晕了.本来打算今晚写出来一个程序,但是一直在纠结这个参数传递,下面先上代码,非常简单的一个程序. 解决方案 你用winforms就要按照winforms的来,首先,不同于你在学校学的那个C++,winforms有自己的程序入口,无需再写main函数. 你新建了一个窗口,直接放上去按钮.文本框(

windows编程-初学Windows界面编程看什么书合适?

问题描述 初学Windows界面编程看什么书合适? 初学Windows界面编程看什么书合适?主要想做界面,和按键消息处理方面的编程,谢谢大神们! 解决方案 java GUI应用程序设计或者java+eclipse的书籍,要看你用什么语言 解决方案二: java GUI应用程序设计或者java+eclipse的书籍,要看你用什么语言 解决方案三: 你想走哪方面?有很多种,C# .NET WPF目前貌似比较火.qt也可以考虑,是跨平台的.还有就是MFC,现在在走下坡路,再就是win32,比较底层,后

MFC绘图4--使用位图画刷

CClientDC dc(this); //CBitmap对象必须在构造完成后,调用其成员函数 //进行初始化,例如:LoadBitmap() CBitmap bitmap; bitmap.LoadBitmap(IDB_BITMAP1); CBrush brush(&bitmap); dc.FillRect(CRect(m_ptOrigin,point),&brush);

C++windows内核编程笔记day07_day08,可视化建菜单、加速键使用、绘图等

可视化操作创建的菜单,加载到窗口. 方法1:注册时指定菜单 wce.lpszMenuName=MAKEINTRESOURCE(IDR_MENUMAIN);//数字形式的资源ID转换为字符串形式的资源 方法2: //创建窗口时加载菜单资源 HMENU menumain= LoadMenu(g_hinstance,MAKEINTRESOURCE(IDR_MENUMAIN)); menumain 传入 CreateWindowEx();//倒数第三个参数 窗口指定小图标: 1.注册时指定 wce.hI

C语言控制台窗口图形界面编程之三 设置文本属性的函数

在这里介绍一个设置文本属性的函数,原型如下 BOOL SetConsoleTextAttribute( // 设置WriteConsole等函数的字符属性 HANDLE hConsoleOutput, // 句柄 WORD wAttributes // 文本属性 ); 本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/C/ 顺便提一下文本属性,其实就是颜色属性,有背景色和前景色(就是字符的颜色)两类,每一类只提供

C语言控制台窗口图形界面编程之一

本系列文章改编自<C语言控制台窗口界面编程(修正版)>.本系列文章会抛弃一些原文中难懂难理解且不常用的部分,并修改了部分样例程序.只为了更加清晰地学习C语言的控制台窗口界面编程.而想要更加深入的了解本系列文章,请阅读<C语言控制台窗口界面编程(修正版)>. <C语言控制台窗口界面编程(修正版)>下载地址:http://download.csdn.net/detail/jzqt_t/7471013 在Windows操作系统下用C语言编写控制台的窗口界面首先要获取当前标准输

使用C++的托管扩展针对Windows窗体编程

摘要:本文讨论了如何使用 Visual C++ .NET 的托管扩展针对 Windows 窗体编程,并提供了使用直接访问 Windows 窗体类的手动编程技术的示例,以及使用 Windows 窗体设计器的示例.此外,本文还对 Windows 窗体和 Microsoft 基础类 (MFC) 应用程序进行了比较. 简介 长期以来,程序员们都使用 C 和 C++ 来开发 Windows GUI 应用程序.对于我们当中很多人来说,这一段历史可以追溯到 Windows 2.0 时期,那时,我们使用基于 C